哪个虚拟主机在Apache 2.2 / PHP 5.3.3中获得SIGKILL?

我有一个16GB的RAM和8核心的Linux服务器。 它永远不会交换,并且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 

我想确定在哪个虚拟主机进程已经得到SIGKILLed。 所以我加载了mod_status并打开了ExtendedStatus 。 我将log_server_status设置为每分钟运行一次,因为我无法手动重新加载/服务器状态/页面,同时一直关注日志,整天等待SIGKILL发生。

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

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

我想跟踪负责SIGKILL的虚拟主机。 我如何去做呢? 我做错了关于log_server_status? 输出似乎没用…

你似乎通过mod_fcgid运行PHP。 只要使用相同的包装来启动所有虚拟主机的PHP解释器,由mod_fcgid产生的进程就被交叉使用,因为你似乎没有用于fcgid的虚拟主机专用指令。 它们在启动后仍然运行,并被重新用于运行任何PHP代码传递给它们进行处理(这是mod_fcgid BTW的盐)。 有关详细信息,请参阅mod_fcgid文档 。

有一个logging的错误打破了这种行为,导致在某些情况下可能会为每个虚拟主机产生PHP进程,而忽略任何定义的每类限制,但是这个错误只适用于旧版本的2.3.6版本,不受欢迎的行为,并已在2.3.7中修复。

除此之外,您看到的日志警告不是由于资源耗尽,这是正常的mod_fcgid活动。 mod_fcgid定期终止正在运行的进程(在空闲超时,特定生命周期或特定数量的请求之后)。 终止通过发送一个SIGTERM到进程发生。 如果进程无法及时处理SIGTERM(可能太忙,也可能只是捕获并忽略SIGTERM请求),那么它会通过SIGKILL强制结束 – 这就是警告的意思。

如果您对进程终止的时间不满意,请使用FcgidIdleTimeout , FcgidProcessLifetime和FcgidMaxRequestsPerProcess指令来调整各自的参数。

我不得不每天手动梳理apache错误日志,以便同时在syslog中loggingSIGKILL消息。 这使得mne能够find哪个虚拟主机的进程正在被SIGKILLED攻击。 我开始监视(手动)哪些文件被访问在这些虚拟主机上的时间戳,几天后我有足够的数据来追踪哪些php文件产生错误。

问题解决了,我没有得到更多的SIGKILL警告。

作为一个附注,仅适用于我的具体情况:警告来自magento cron条目,在脚本执行的最大允许时间内无法完成。 所以我把执行时间增加到180(几天),那些cron工作开始顺利完成。 然后,我减less了最大允许时间,现在他们可以在60秒内完成。 执行时间长,是因为一些工作很长时间没有运行,他们有比平时更大的负荷来处理。