目前我们的服务器有一些问题,间歇性地,我们似乎得到了只运行和运行的apache进程,占用了100%的CPU。
运行顶部时,我们看到以下内容:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20788 www-data 20 0 318m 18m 3984 R 100 0.0 40:29.21 /usr/sbin/apache2 -k start 23523 www-data 20 0 319m 20m 4684 R 100 0.0 4:12.36 /usr/sbin/apache2 -k start
我想试着找出脚本(或其它什么)引起的,所以我试着:
strace -p 20788
但是这并没有显示任何输出(我已经离开了大约10分钟,而什么也没有显示)。 根据我的理解,这可能意味着它陷入了一个无限循环,并没有任何“系统调用”显示。
还有什么我可以做,以显示发生了什么事?
谢谢
编辑 –忘了提及,这是一个有几百个用户在任何时间的活服务器! 所以我不能自由尝试更改configuration选项并重新启动Apache。
编辑2 – gdb的backtrace(bt)似乎不是所有有用的,当PHP没有configuration–enable-debug – 它只显示“execute()”,但我需要知道什么是PHP脚本实际上运行..有没有其他的方式?
#0 0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so #1 0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so #2 0x00007f6c1438b970 in zend_execute_scripts () from /usr/lib/apache2/modules/libphp5.so #3 0x00007f6c14337fe3 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so #4 0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so #5 0x00007f6c18912508 in ap_run_handler () #6 0x00007f6c1891297e in ap_invoke_handler () #7 0x00007f6c18922570 in ap_process_request () #8 0x00007f6c1891f398 in ?? () #9 0x00007f6c18918fa8 in ap_run_process_connection () #10 0x00007f6c189271d0 in ?? () #11 0x00007f6c1892793a in ?? () #12 0x00007f6c189284e7 in ap_mpm_run () #13 0x00007f6c188fd4a4 in main ()
那么,如果你感觉很勇敢:
gdb -p 20788
然后发出bt
来查看堆栈帧,例如
顺便说一句,还有ltrace
提及 – 尝试它。
UPD。 :好吧,既然现在我们有一个想法,Apache真的在运行一些东西,为什么不看看mod_status
输出 – 扩展一个?
你可以尝试:
您的命令应该工作,只要您发出触发该PID的HTTP请求。
也许你想暂时重新configurationApache只有一个subprocess?
尝试这个:
1)用date/时间,PHP脚本和PID使用getmypid()
开始日志
2)然后用top
看你的服务器
3)当您看到apache进程变高时,在日志中search相同的date/时间和PID。 你应该能够find有问题的脚本。
一个非常简单的方法是使用htop
。 您可以对高CPU进程进行sorting然后使用
lsof
看到一个进程打开的文件 ltrace
。 我发现至less有一个选项可以find生成负载的脚本,您当然可以在生产Web服务器上使用它来进行debugging。
那个apache实例的PID是低的,可能是全部的父亲。 这当然可以解释CPU的高使用率(它保持在其他地方,其他的则根据负载产生和召回)。 CPU时间累计可能意味着它已经运行了很长时间。 strace(1)
没有输出就表示没有系统调用。 是的,它可能是在一个紧密的循环中,但是Apache本质上是I / O,所以我认为它没有做任何有用的事情。 在任何情况下,奇怪的100%的一个CPU。