找出什么高CPU使用率的Apache进程实际上在做什么?

目前我们的服务器有一些问题,间歇性地,我们似乎得到了只运行和运行的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输出 – 扩展一个?

你可以尝试:

  • iotop(显示系统上的I / O)
  • netstat -t(显示连接)
  • 看看Apache的日志文件,并找出服务器的最后
  • 为apache进程设置一些RLimits。 当达到这些限制时,这个过程将被杀死,给你更多的信息

您的命令应该工作,只要您发出触发该PID的HTTP请求。

也许你想暂时重新configurationApache只有一个subprocess?

尝试这个:

1)用date/时间,PHP脚本和PID使用getmypid()开始日志

2)然后用top看你的服务器

3)当您看到apache进程变高时,在日志中search相同的date/时间和PID。 你应该能够find有问题的脚本。

一个非常简单的方法是使用htop 。 您可以对高CPU进程进行sorting然后使用

  • 这是一个过程
  • l让lsof看到一个进程打开的文件
  • L ltrace

我发现至less有一个选项可以find生成负载的脚本,您当然可以在生产Web服务器上使用它来进行debugging。

那个apache实例的PID是低的,可能是全部的父亲。 这当然可以解释CPU的高使用率(它保持在其他地方,其他的则根据负载产生和召回)。 CPU时间累计可能意味着它已经运行了很长时间。 strace(1)没有输出就表示没有系统调用。 是的,它可能是在一个紧密的循环中,但是Apache本质上是I / O,所以我认为它没有做任何有用的事情。 在任何情况下,奇怪的100%的一个CPU。