在 Apache 2.2/PHP 5.3.3 中哪个虚拟主机正在接收 SIGKILL?

在 Apache 2.2/PHP 5.3.3 中哪个虚拟主机正在接收 SIGKILL?

我有一台 linux 服务器,内存 16gb,8 核。它从不交换,CPU 使用率从未超过 ~1.5。我相信可以肯定地说,容量足够。

偶尔我会得到一些[warn] mod_fcgid: process 28341 graceful kill fail, sending SIGKILL

在 Apache/2.2.15 (CentOS 6.3) mod_fcgid/2.3.7 上,下面所有的 mod_fcgid 设置都不存在,因此默认为:

FcgidMinProcessesPerClass
FcgidMaxProcessesPerClass
FcgidMaxProcesses
FcgidIdleTimeout
FcgidProcessLifeTime
FcgidIdleScanInterval
FcgidOutputBufferSize

我想确定哪些 vhost 中的进程已收到 SIGKILLed。因此我加载了mod_status然后转身扩展状态开启。我设置log_server_status每分钟运行一次,因为我无法手动重新加载 /server-status/ 页面,同时整天关注日志,等待 SIGKILL 发生。

但是 log_server_status 的输出并不是很有帮助。这是我在脚本创建的日志中看到的全部内容:

180131::::
all the way to
235501::::
235601::::
235701::::
235801::::
235901::::

我想追踪负责 SIGKILL 的 vhost。我该怎么做? 我在 log_server_status 方面做错了什么吗?输出似乎毫无用处...

答案1

你似乎正在通过mod_fcgid.只要相同包装器用于启动所有虚拟主机的 PHP 解释器,由mod_fcgid是交叉使用的,因为你似乎没有针对 fcgid 的 vhost 特定指令。它们在启动后仍然运行,并被重新用于运行传递给它们进行处理的任何 PHP 代码(这是mod_fcgid顺便说一下)。请参阅mod_fcgid文档了解详情。

记录的错误破坏此行为并导致每个 vhost 都可能生成 PHP 进程,而忽略特定条件下定义的每个类的限制,但此错误仅适用于旧版本的 2.3.6 模块,是一种不受欢迎的行为,已在 2.3.7 中修复。

除此之外,您看到的日志警告不是由于资源耗尽造成的,这是正常的mod_fcgid活动。mod_fcgid定期终止正在运行的进程(空闲超时、特定生命周期或特定数量的请求后)。通过向进程发送 SIGTERM 来终止进程。如果进程由于某种原因无法及时处理 SIGTERM(可能太忙,也可能只是捕获并忽略 SIGTERM 请求),则会通过 SIGKILL 强制终止进程 - 这就是警告的内容。

如果您对进程终止的时间不满意,只需使用任务队列空闲超时进程生命周期每个进程的最大请求数指令。

答案2

我必须每天手动梳理 apache 错误日志,以查找在 SIGKILL 消息被记录到 syslog 中时发生的条目。这样 mne 就可以找到哪些 vhosts 的进程正在收到 SIGKILLED。我开始(手动)监控这些 vhosts 上在上述时间戳访问了哪些文件,几天后,我就有足够的数据来追踪哪些 php 文件正在生成错误。

问题已解决,我不再收到任何 SIGKILL 警告。

附注:这仅适用于我的特定情况:警告来自 magento cron 条目,这些条目无法在脚本执行允许的最大时间内完成。因此,我将执行时间增加到 180(持续几天),这些 cron 作业开始成功完成。然后,我减少了允许的最大时间,它们现在可以在 60 秒内完成。执行时间较长是因为一些作业很长时间没有运行,而且它们要处理的负载比平时大。

相关内容