在生产环境中,我们使用Apache HTTPD来处理从客户端到Tomcat示例的请求。我们有三个节点。
有一天,我们得到了以下错误:
AH 00288:记分板已满,不在MaxRequestWorkers
更确切地说,一个节点显示这些消息,几分钟后另一个节点也开始,最后第三个节点也开始。只有第三个节点在显示记分板错误之前显示了以下两条消息:
AH 00287:服务器在MaxRequestWorkers的MinSpareThreads内,请考虑提高MaxRequestWorkers设置AH 00286:服务器已达到MaxRequestWorkers设置,请考虑提升MaxRequestWorkers设置
第三个节点上的记分板满消息发生在这些消息之后大约一小时。现在,我做了很多的reasonable在谷歌,论坛等..我已经阅读了所有关于mpm事件错误等的帖子。我使用的是mpm worker(所以没有事件),我的设置是:
启动服务器3 MinSpareThreads 25 MaxSpareThreads 100 ThreadLimit 64 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0
我想知道的是,至少当Apache打印这些消息时。记分板满了到底是什么意思?我读了很多关于优雅地关闭线程之类的东西,但是除了潜在的根本原因之外,仍然不明白这是什么意思。我知道记分板会跟踪每个踏步的状态(写,阅读,优雅地关闭,等等),它也有空白的空间。我希望“spaces”的总数至少等于MaxRequestWorkers的数量(否则我无法看到Apache如何跟踪所有线程的状态)。所以我不明白在哪种情况下它可以填充到我得到这个错误的点。有人可以解释我或提供一些例子(或指向我一个链接),让我明白这个记分牌可以得到填补,所以我可以尝试做一些测试,以重现问题。在错误期间,Apache似乎不接受流量,这是一个大问题,你可能猜到了。
这个问题出现了几个小时,然后当交通停止时就消失了。第二天交通再次拥堵时,幸运的是这个问题不再出现。
非常感谢您!
1条答案
按热度按时间x0fgdtte1#
来自server fault上的另一个用户,带有answer
来自应答
我们在Apache 2.4.6上遇到了同样的问题。在监控服务器并调整了几个小时的设置后,我们发现Apache可能有一个bug。服务器进程偶尔会进入
G
状态(优雅地结束)并重新启动以接受新请求,这很正常。不正常的是,由于某种原因,这可能需要几分钟才能重新启动。如果你只有几个服务器进程在运行,并且它们都同时进入G
状态,那么你的记分牌就会被填满,你将无法再为任何请求提供服务。我们所做的是增加服务器的数量,这样它们就不太可能同时进入
G
状态。还要确保为每个服务器进程分配至少25个线程(MaxRequestWorkers
),因为这似乎是默认值(即如果5Servers
x 25ThreadsPerChild
= 125MaxRequestWorkers
)。如果你喜欢,你可以改变ThreadsPerChild
,我们把它保留在默认值。如果你没有分配足够的线程,额外的服务器将不会启动。我们将MinSpareThreads
保留为默认值25,MaxSpareThreads
的默认值为75。如果您修改这些设置,MaxSpareThreads
的值必须大于或等于MinSpareThreads
和ThreadsPerChild
之和。MaxRequestWorkers
必须等于或小于ServerLimit
。这是我们的工作,但它可能不是最好的配置为您。
编辑:这是httpd的mpm_event模块中确认的bug,可能无法通过配置修复。
链接的bugtracker条目有一个假定的补丁和更多关于如何修复这个问题的讨论,直到新版本的事件模块正式发布。