![在 Apache 2.2/PHP 5.3.3 中哪个虚拟主机正在接收 SIGKILL?](https://linux22.com/image/605517/%E5%9C%A8%20Apache%202.2%2FPHP%205.3.3%20%E4%B8%AD%E5%93%AA%E4%B8%AA%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E6%AD%A3%E5%9C%A8%E6%8E%A5%E6%94%B6%20SIGKILL%EF%BC%9F.png)
我有一台 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 秒内完成。执行时间较长是因为一些作业很长时间没有运行,而且它们要处理的负载比平时大。