记一次php高负载问题排查经历

在最近一次项目中,后台跑了deamon来处理任务。之前一直没什么问题,在一次增加任务处理时间等监控上报后,deamon的机器出现高负载,平均在20以上,任务出现积压。

第一步先使用strace查看系统调用情况:

strace -tt -T -c -p 31420

strace -c发现,系统时间主要耗费在rt_sigprocmask上,该函数是系统的信号屏蔽函数,一般使用在信号处理程序中,对信号进行屏蔽,保证信号处理程序不被打断。rt_sigprocmask为linux的系统调用函数,不对外直接调用,而使用glibc对其的封装:sigprocmask.

进一步starce调用实际情况:

rt_singprocmask调用有一个特征:设置屏蔽字后紧接着恢复屏蔽字,可以联想到这有可能php的信号处理函数中调用的。

在php源码中搜索sigprocmask,发现php源码中调用singprocmask的地方主要在pnctl扩展中,在deamon程序使用了pnctl扩展创建和管理子进程。通过先阻塞信号后恢复信号的特征,定位到php的信号处理函数:pcntl_signal_dispatch()中。

接着通过加日志验证我们的想法,确认确实在频繁调用该函数。由此引出了对php信号处理机制的分析。

限于篇幅,具体分析过程省略,这里给出分析的结果:

  1. php的tick机制:

phpmanul对tick的解释是:

A tick is an event that occurs for every N low-level tickable statements executed by the parser within the declare block. The value for N is specified using ticks=N within the declare block‘s directive section.

Not all statements are tickable. Typically, condition expressions and argument expressions are not tickable.

The event(s) that occur on each tick are specified using the register_tick_function(). See the example below for more details. Note that more than one event can occur for each tick.

大概意思是:tick和register_tick_function配合,每执行tick=n的n个底层指令,就触发执行register_tick_function注册的事件。

  2. php对信号的处理:

Php对进程和信号的管理控制通过pcntl扩展实现,pcntl使用了tick机制作为signal的callback机制,你可以在php中允许callback的地方使用declare允许callback发生。

通过对pcntl源码分析,pcntl的信号处理机制是这样的:

1),信号注册

2),信号处理:

分析到这里,可以看到:在php中,根据declare声明的tick值来定期调用,当tick值配置较低时(本程序中定义ticks=1),会大量触发信号处理程序,该程序中调用rt_sigprocmask导致浪费大量的cpu,机器负载变高。

那么php为什么要采用这种信号处理机制呢?

查看在php manual时,发现这样的介绍:

PCNTL now uses ticks as the signal handle callback mechanism, which is much faster than the previous mechanism. This change follows the same semantics as using "user ticks". You use the declare() statement to specify the locations in your program where callbacks are allowed to occur. This allows you to minimize the overhead of handling asynchronous events. In the past, compiling PHP with pcntl enabled would always incur this overhead, whether or not your script actually used pcntl.

重点关注:You use the declare() statement to specify the locations in your program where callbacks are allowed to occur. 意思是可以指定需要捕获信号的代码区域,区域外则不进行信号处理。

由上可以总结出修改问题的办法:

1),通过declare制定应用程序捕捉信号的区域,

2),对于不需要进行信号处理的程序,不声明declear(ticks=n),由此不会触发调用信号处理程序;需要处理的程可以手动调用信号处理程序pcntl_signal_dispatch代替php的定时检测。

经过验证,采用以上任何一种办法都可以解决问题。机器负载降到正常值。

总结:

1),php采用类似linux内核中断处理机制(硬中断+软终端)机制处理信号,需要注意检测信号的频次,避免cpu性能浪费。

2),因为在cgi中不建议使用pcntl扩展管理创建进程,该机制不会对webserver的cgi产生影响

时间: 2024-10-10 08:07:12

记一次php高负载问题排查经历的相关文章

CPU高负载的排查办法

今天线上一个tomcat进程cpu负载100%.按以下步骤查出原因. 1.执行top -c命令,找到cpu最高的进程的id 2.执行top -H -p pid,这个命令就能显示刚刚找到的进程的所有线程的资源消耗情况.找到CPU负载高的线程tid 8627, 把这个数字转换成16进制,21B3. 3.执行jstack -l pid,拿到进程的线程dump文件.这个命令会打出这个进程的所有线程的运行堆栈. 4.用记事本打开这个文件,搜索"21B3",就是搜一下16进制显示的线程id.搜到后

记一次服务器高CPU的排查思路

现象 排查思路 另一台服务器CPU正常,由于消息中心有部分老接口是域名调用的,网关已做负载均衡,并且pinpoint上的两台服务器gc如图,初步猜测是否是负载不均衡导致. 经运维调试nginx权重无效,证明与负载均衡无关.那么先看子线程,这种情况必定由某几个线程引起 ps -mp pid -o THREAD,tid,time命令查看子线程,如图 这个数据上,分两部分看,1.有3个占用高的线程,2.执行时间可以注意到分别是4天,1天,23小时.说明线程出于某种情况,死锁,死循环. 由于这时候jst

java处理高并发高负载类网站的优化方法

一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,但是同时只有1个是Activ

PHP-FPM高负载的解决办法

=================== 优化设置 ========================= When you running a highload website with PHP-FPM via FastCGI, the following tips may be useful to you : )如果您高负载网站使用PHP-FPM管理FastCGI,这些技巧也许对您有用:)1. Compile PHP’s modules as less as possible, the simpl

谨记一次问题排查经历

一个客户那儿: 1接收报文->2系统转码->3发送给处理程序->4处理程序调用数据库存储过程 现在系统数据库库内记录出现问题了:某个关键字段的值扩大了10倍:自某个时间4-19日开始发现该问题:上游厂商确定没有变动过接口. 经过:根据分析和经验,认定问题出现在2上,初步推断是上游接口发生变化而未告知(上游有前科).重新依据生产环境部署程序.重新测试.问题仍在.期间发现过和汇率可能有关系.当时没有程序源代码. 接下来..... 找上游争吵 ..... 最后:冷静下来,向公司原来负责该客户的

淘宝网采用什么技术架构来实现网站高负载的

2012-11-15 12:30 佚名 转载 字号:T | T 下面就结合淘宝目前的一些底层技术框架以及自己的一些感触来说说如何构建一个可 伸缩,高性能,高可用性的分布式互联网应用. AD: WOT2014:用户标签系统与用户数据化运营培训专场 时间过得很快,来淘宝已经两个月了,在这两个月的时间里,自己也感受颇深.下面就结合淘宝目前的一些底层技术框架以及自己的一些感触来说说如何构建一个可 伸缩,高性能,高可用性的分布式互联网应用. 相关专题:淘宝双11背后高并发技术讨论 一 应用无状态(淘宝se

大并发高负载下的PHP-FPM参数调优

大并发高负载下的PHP-FPM参数调优 主要针对PHP在Linux下的参数调优 调整文件描述符限制 # ulimit -n 1000000 # vi /etc/security/limits.conf # Setting Shell Limits for File Descriptors *  soft nofile 1000000 *  hard nofile 1000000 禁止PHP代码文件所在分区的文件系统访问时间更新 # vi /etc/fstab 比如PHP代码所在分区: /dev/

高并发高负载的大型站点系统架构

大型站点的系统架构须要考虑非常多问题.大型站点有高并发高负载的特点,在面对大量用户訪问.高并发请求方面.主要的解决方式集中在这样几个环节:使用高性能的server.高性能的数据库.高效率的编程语言.还有高性能的Web容器.本文从低成本.高性能和高扩张性的角度来探讨了一些大型站点系统架构须要考虑的问题. AD:WOT2014:用户标签系统与用户数据化运营培训专场 一个小型的站点.比方个人站点,能够使用最简单的html静态页面就实现了.配合一些图片达到美化效果,全部的页面均存放在一个文件夹下,这种站

服务器高负载分析-SAR命令

服务器高负载原因? 下列项目的过度使用会直接导致高负载问题: CPU 内存(包括虚拟内存) 磁盘I/O SAR命令 sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态.它的特点是可以连续对系统取样,获得大量的取样数据:取样数据和分析的结果都可以存入文件,所需的负载很小.sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情