2

我有一个在 modx 中构建的站点,当它的负载命中耗尽所有 cpu 处理能力时,top 显示许多已失效的 php 僵尸进程正在消耗它。

这是系统规格...
PHP 5.2.14
php 作为 suPHP
Mysql 5.1.51
Apache 2.0.63
modx 1.0.4运行

用于使用 ApacheBench 测试即时通讯并使用 100 个并发连接模拟 500 个连接

我现在已经测试了两种方法......

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

调用由 modx 提供的页面,其中 php 做得更多,会产生更多吃更多 CPU 的僵尸,其中一些不会很快消失。

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

是服务器配置有问题还是服务器负载过大?

现在对这一切都摸不着头脑,希望能得到一些关于下一步该做什么的指示。

4

2 回答 2

4

一个进程在它退出后(通常或不退出)立即是“僵尸”(在顶部显示为 Z)它的进程 ID 保留在进程表中,直到它的父进程等待(或“收获”)它。在正常情况下,当父进程为 SIGCHLD 设置信号处理程序时,当发送信号时(在子进程退出时),父进程会在方便时获取它。

如果父进程由于某种原因挂起,例如挂起、太忙或死锁,则退出的子进程将不会被回收(直到父进程再次恢复)。

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

在这种情况下,进程是正常的,不需要关注,除非有很多很多未收获的进程。

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

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

于 2011-05-13T22:11:07.690 回答
0

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

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

Nginx 具有 Apache 的所有功能。所以重写规则,htaccess 喜欢安全。

于 2010-12-08T23:43:17.717 回答