每当 Apache 在MaxRequestPerChild
满足条件后终止子进程以创建新进程时,我都会在输出中看到 Defunct Apache processes ps
。这些已停用的进程会在短时间内自行清除。但是,服务器的平均负载会暂时急剧上升。
我不明白为什么这些进程被终止时会进入停止状态。
我在 Apache 中运行带有 mod_php 模块(Apache 的 Pre-fork 模块)的 PHP 应用程序。由于应用程序需要,我无法在服务器上升级 PHP。
任何想法?
答案1
您无法杀死它,因为它已经死了。唯一剩下的就是进程表中的一个条目。在 Unix 和类 Unix 计算机操作系统上,僵尸进程或已停用进程是已完成执行但仍在进程表中有一个条目的进程。仍然需要此条目以允许父进程读取其子进程的退出状态。除非有很多这样的进程,否则让这些进程存在是没有坏处的。僵尸进程最终会被其父进程收割(通过调用 wait(2))。如果原始父进程在其退出之前没有收割它,则 init 进程(pid == 1)会在稍后的某个时间收割它。僵尸进程只是:
A process that has terminated and that is deleted when its exit status has been reported to another process which is waiting for that process to terminate.
答案2
我猜你托管了一些大型 PHP 应用程序(例如 Magento 或 Drupal,其中包含一些大型第三方模块),并且在退出期间清理使用的资源(数据库连接等)需要一些时间。同样,生成新进程也需要一些时间。
当然,您的 Apache 可能也安装了一些重模块,例如 mod_security。或者您的 PHP 加载了一些附加模块。很难说,因为您的问题很模糊,缺乏细节。