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


18

目前,我们的服务器间歇性地出现了一些问题,我们似乎在不断运行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分钟,并且什么也没有显示)。根据我的理解,这可能意味着它陷入了无限循环,并且没有任何“系统调用”可显示。

我还能做些什么来显示正在发生的事情吗?

谢谢

编辑-忘记了,这是一台实时服务器,随时有数百个用户!因此,我不能真正自由地尝试更改配置选项并重新启动apache。

编辑2- 当未使用--enable-debug配置PHP时,gdb的回溯(bt)似乎没有什么用处-仅显示“ 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 ()

1
Apache支持“优美的”重启,所以为什么不呢?
poige

1
我们以前尝试过时,由于apache进程“卡住了”,所以无法正常重启...尽管那可能是错误的,但它是前一段时间。
BT643

另一个技巧是在不同的端口上运行另一个Apache实例,将新的连接重定向到该实例。
poige

Answers:


9

好吧,以防万一:

gdb -p 20788

然后发布bt以查看堆栈框架,例如

顺便说一句,还有ltrace,值得一提的是-也尝试一下。

UPD。:好吧,好的,因为现在我们有了一个想法,Apache确实在运行某些东西,为什么不看mod_status输出- 扩展的呢?


GDB没有安装:(将不得不等待,直到我回去工作了,明天看我是否能够在不引起任何问题,安装它.. ltrace没有显示任何输出两种。
BT643

只是将gdb bt的结果添加到了初始帖子中..并没有告诉我太多信息!
BT643

哦,很高兴看到我已建议正确的方向。)
poige 2013年

@ BT643,请参阅UPD。
poige

4
默认情况下已实现mod_status,但仅限于从127.0.0.1访问。我刚刚通过SSH登录并将输出通过管道传输到文件curl domain.com/server-status > randomfile.html-然后查看了文件。原来是一个旧的开发人员代码陷入了循环(PHP文件)!现在全部排序。感谢您的帮助:)
BT643 2013年

2

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

  • S对于strace过程
  • l用于lsof查看进程的打开文件
  • L至ltrace

我发现至少有一个选项可以找到生成负载的脚本,您当然可以在生产Web服务器上使用它进行调试。


1

您可以尝试:

  • iotop(在系统上显示I / O)
  • netstat -t(显示连接)
  • 查看apache日志文件,找出服务器最后做了什么
  • 为apache进程设置一些RLimits。当达到这些限制时,该过程将被终止,从而为您提供更多信息

0

只要您发出触发该PID的HTTP请求,您的命令就可以正常工作。

也许您只想通过一个子进程临时重新配置Apache?


请记住,只有一个子进程意味着Apache只能处理单个请求,并且如果该单个子进程被卡住,则Apache将无法处理任何请求。
Stefan Lasiewski 2013年

无法做到这一点,因为它是具有数百个并发用户的实时服务器(由于之前不清楚,已经将其添加到OP中)
BT643,2013年

0

该apache实例的PID较低,可能是所有实例的父亲。这肯定可以解释为什么CPU使用率很高(它会一直存在,根据负载会产生并重新调用其他人)。大量的CPU时间累积可能只是意味着它已经运行了很长时间。没有输出strace(1)仅表示没有进行系统调用。是的,它可能处于一个紧密的循环中,但是apache本质上是基于网络的I / O,因此我认为它没有做任何有用的事情。在任何情况下,一个CPU的100%都奇怪。


低PID并不一定意味着它是一个旧过程。PID具有最大值,并且具有环绕性,因此可以使用低PID来创建新进程。
奥斯丁2015年

0

尝试这个:

1)使用日期/时间,PHP脚本和PID启动日志 getmypid()

2)然后用 top

3)当您看到apache进程加快时,请在日志中搜索相同的日期/时间和PID。您应该能够找到有问题的脚本。


这是一个有趣的解决方案,但是我可以看到它占用了比其价值更多的资源,因为mod_status它的工作做得很好。
奥斯丁2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.