分享

apache的MaxRequestsPerChild指令设置不合理导致apache崩潰

 用勿龍潛 2012-05-08
apache的MaxRequestsPerChild指令设置不合理导致并发连接过高
 
服务器负荷增大,尝试优化和调整服务器,首先是从 Apache 的优化和调整开始的。之前考虑到我们的生产机负荷并不大,因此可以让apache的每一个派生子进程都尽可能处理更多的请求再释放,这样有利于促进子进程的复用,从而提高处理效率。于是我将apache的MaxRequestsPerChild参数调整为4000,一直大半年相安无事。
但是今天却出现了一个问题,网站突然打不开了,症状是浏览器始终处于正在打开网页的状态。检查后排除了DDoS攻击的可能。再查看apache进程,居然没有!赶紧查看apache错误日志/var/log/httpd/error_log,发现了以下错误日志:

[Tue May 08 12:21:22 2012] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48
[Tue May 08 12:21:23 2012] [alert] Child 8762 returned a Fatal error... Apache is exiting!
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (22)Invalid argument: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (22)Invalid argument: couldn't grab the accept mutex
[Tue May 08 12:21:24 2012] [emerg] (22)Invalid argument: couldn't grab the accept mutex
[Tue May 08 12:21:25 2012] [emerg] (22)Invalid argument: couldn't release the accept mutex
[Tue May 08 15:39:47 2012] [emerg] (22)Invalid argument: couldn't grab the accept mutex
[Tue May 08 15:39:47 2012] [emerg] (22)Invalid argument: couldn't grab the accept mutex
[Tue May 08 15:39:47 2012] [emerg] (22)Invalid argument: couldn't grab the accept mutex
[Tue May 08 15:39:47 2012] [emerg] (22)Invalid argument: couldn't grab the accept mutex
.
.
.
 
从时间上看,正是这次故障发生的时间点。重新启动apache后恢复正常。最后发现是 MaxRequestsPerChild 参数设置不合理。再次仔细阅读 Apache 手册关于 MaxRequestsPerChild 的说明后,认为在 prefork 下,KeepAlive 开启的情况下,每一个新连接都会导致一个 Apache 子进程开启, MaxRequestsPerChild 设置过大,导致新连接产生新的子进程后,长期空闲 ,这样并不一定合理。

根据我们网站的访问情况,其实远远不需要那么大的 MaxRequestsPerChild 值,每个用户点击网站的频率也不会很高,所以 MaxRequestsPerChild 设置得太高了反而适得其反,相反应该尽快释放连接,尽快回收系统资源,以尽可能快速的满足新的请求的连接需要。于是将 MaxRequestsPerChild 重新调整为64,估计不会再有这个问题产生了,具体情况是否如此还需要长期的观察。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多