调用php时,Apache会产生僵尸进程

时间:2010-12-04 00:33:40

标签: php apache modx zombie-process

我有一个已经在modx中构建的网站,当它受到负载的影响时会占用所有cpu处理能力,top会显示很多已经失效的php zombie进程消耗它。

这是系统规格......
PHP 5.2.14
php以suPHP身份运行
Mysql 5.1.51
Apache 2.0.63
modx 1.0.4

使用ApacheBench测试im并使用100个并发连接模拟500个连接

我现在已经用2种方法测试过了......

关闭.htaccess并对一个简单的php页面进行压力测试,该页面只是回应“Hello world” 在顶部,这显示php将不复存在并变成僵尸,但它们很快就会消失

调用由modx提供服务的页面,其中php正在做更多的事情,产生更多的僵尸,吃掉更多的cpu,其中一些不会很快消失。

这会导致什么?在我们的代码中是否会出错?在这种情况下,为什么简单的Hello World脚本会产生僵尸?

服务器配置是否存在问题或者服务器负载过重?

现在就全力以赴地讨论这个问题,并希望能有一些关于下一步该做什么的指示。

2 个答案:

答案 0 :(得分:3)

进程在退出后立即显示为“zombie”(顶部显示为Z)(通常与否)其进程ID保留在进程表中,直到其父进程等待(或“收获”)它为止。 在正常情况下,当父进程为SIGCHLD设置信号处理程序时,以便在发送信号时(在子进程退出时),父进程然后在方便的时候重新获取它。

如果父进程由于某种原因而挂起,例如,如果它已暂停,或者太忙,或者已死锁,则不会获得退出的子进程(直到父进程再次恢复)。

通常,主要的Apache进程将收获任何退出的工作人员。但是,在您描述的负载很重的服务器上,主进程可能没有足够的时间来进行此收获。未填充(“僵尸”)进程显示在顶部。

在这种情况下,这些过程是正常的,不需要考虑,除非有许多未经过任何处理的过程。

当你的测试结束时,僵尸进程会在短时间后消失吗?如果是这样,你没有什么可担心的,一切都很正常。

默认情况下,为处理有限数量的请求后退出的工作进程设置了apache。这旨在不让内存泄漏失控。您可能会发现调整此设置可能会对您有所帮助。

答案 1 :(得分:0)

首先,为了提高性能,您可以将.htaccess文件中的信息放在apache主配置文件中。每次访问包含.htacess的目录时,它都将读取并加载.htaccess文件,而不像在重启规则中将重写规则放入启动期间只加载一次。

关于php问题 - 如果从未听说过suPHP,但你宁愿运行fastcgi 结合apache或 - 切换到fpm / nginx。我已经用了一个月了 现在,它比Apache快得多。我的意思是性能的2-3倍。

Nginx拥有Apache的所有功能。所以重写规则,像安全一样htaccess。