我们面临一个问题,即使 apache 尚未达到其 max_client 设置,也不会处理新的请求。
Max_client 设置为 800
max_spare 服务器为 36
min_spare 服务器为 35
超时 300
keepalive 开启
keepalive 超时 10最大保持活动请求数 100
为什么 apache 不处理新请求并发送超时,即使它还没有达到其 max_client 值。
strace 显示大约有 80 多个 apache 子进程处于空闲状态,即 strace 输出中的 0.0000 秒。
为什么这么多子代处于空闲状态并且仍在生成新的子代,但仍然不处理请求并发送超时。
我们正在使用 Php5、带有 mpm-prefork 的 Apache 2、Mysql 5,在带有 CSF 防火墙的 Ubuntu 11.04 上运行。
所有请求均来自单个 ip(我们的 ip 地址)。
来自单个 IP 的请求过多是否会导致任何 TCP/IP 或 Apache 连接限制,从而拒绝新的请求?
答案1
为什么这么多子代处于空闲状态并且仍在生成新的子代,但仍然不处理请求并发送超时。
“没人知道”
首先,您需要了解,在 prefork 中生成新进程的代价非常高。
为了尽可能避免这样做,请为服务器负载和预期的流量峰值配置正确的参数。
要找到答案,你可以看看服务器状态并检查这实际上是什么类型的负载 - 它是连接数、保持活动、每个 IP 并发性、带宽、后端代理延迟、空闲进程太少的瓶颈 - 什么?
如果您已启用服务器状态(和 ExtendedStatus!)并了解输出的含义,请回复我们。
答案2
您可能正在从测试平台通过同一连接发送多个请求。
基本上你设置了:
keepalive on
maxkeepaliverequests 100
因此在这种情况下,如果您通过同一个连接生成多个请求,那么在 100 个请求时就会遇到问题。
尝试:
keepalive off
或者
maxkeepaliverequests 0
注意:你的 ServerLimit 设置也应该至少与 MaxClients 匹配