我对 apache 有疑问。一切都是大约一周前开始的(所以这可能与最新的系统更新有关)——我的监控工具向我发送有关无法运行的网站的短信。我已经检查过了,看起来对普通 cgi 的请求(在 perl 中实现)花费了 30 秒。重新启动 apache 后,问题在接下来的几个小时/几天内得到解决,然后再次发生。
最初我怀疑是 php,因为它只是更新 (5.3.15->5.3.18),这可能会影响 apache。我已经尝试将其恢复到 5.3.15,但这并不能解决这个问题。
接下来,我做了 strace,看起来在 clone() 系统调用时发生了延迟:
[pid 26659] 1356268557.675934 clone( <unfinished ...>
[pid 26659] 1356268587.684401 <... clone resumed> child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xa1033768) = 32169 <30.008452>
cgi 本身在此之后运行并且工作正常且快速:
[pid 32169] 1356268587.686614 execve("/var/www/mysite.com/mycgi.cgi", ["/var/www/mysite.com/mycgi.cgi"], [/* 26 vars */]) = 0 <0.000776>
为什么会发生这种情况的任何想法?clone(2) 如何以及为什么会阻塞 30 秒?!然后成功返回……看起来 clone() 中有一些超时,因为它总是恰好 30 秒。
我正在使用最新的 Hardened Gentoo Linux,内核 3.5.4-hardened-r1,apache 2.2.23(prefork,mod_cgi)。
更新:我可能应该补充:这台服务器没有高负载。Apache childs 仅使用大约 120/40 MB (VIRT/RSS)。服务器有 2GB RAM,只使用了 400MB(没有缓冲区/缓存)。
发生这种情况是因为 CONFIG_GRKERNSEC_BRUTE=y 内核选项。