我在使用 Apache (MPM Prefork) 和 mod_php 时遇到了一个奇怪的问题。服务器运行了一段时间,在随机时间之后,一些进程挂起,并且占用了 100% 的 CPU。
1741 fileu 20 0 840m 65m 41m R 100.0 0.3 441:49.97 httpd
12200 fileu 20 0 836m 61m 41m R 100.0 0.3 191:42.99 httpd
14023 fileu 20 0 837m 66m 45m R 100.0 0.3 101:49.21 httpd
16530 fileu 20 0 838m 64m 42m R 100.0 0.3 136:46.84 httpd
17094 fileu 20 0 837m 73m 51m R 100.0 0.3 176:53.57 httpd
27652 fileu 20 0 835m 54m 35m R 100.0 0.2 306:45.53 httpd
28681 fileu 20 0 834m 75m 57m R 100.0 0.3 121:55.73 httpd
32203 fileu 20 0 836m 67m 47m R 100.0 0.3 77:00.48 httpd
CPU 利用率也随着平均负载上升。其他 Apache 进程运行良好。我试图使用,strace -p 32203 -s 80 -o /root/httpd.log
但文件是空的。也error_log
没什么特别的。重启后,一切正常。
我该怎么做才能检查这个过程发生了什么以及为什么它使用了 100% 的 CPU?
有关服务器的一些详细信息:
- 2.6.32-504.8.1.el6.x86_64 #1 SMP 2014 年 12 月 19 日星期五 12:09:25 EST x86_64 x86_64 x86_64 GNU/Linux
- Red Hat Enterprise Linux Server 版本 6.6(圣地亚哥)
- PHP 5.6.6 和 Zend OPcache v7.0.4-dev
- 阿帕奇/2.2.15
答案1
如果问题是基于 PHP 的,您可以使用 xdebug 分析来捕获一些数据,然后使用 wincachegrind 或 kcachegrind 对其进行分析(请参阅http://www.xdebug.org/docs/profiler)。但是,如果在生产服务器上执行此操作,请务必小心,因为这会增加额外的负载并迅速耗尽磁盘空间。
或者,您可以使用 xdebug 跟踪来查看发生这种情况之前正在执行的最后一行代码。您可以指定跟踪的编写方式,使进程 ID 成为文件名的一部分,以便您可以进行匹配。