【发布时间】:2015-07-17 01:29:42
【问题描述】:
好的,这是在 AWS ELB 后面使用 prefork MPM 的一系列非常繁忙的 Apache 2.4 服务器上。因为我们支持 ELB,所以不启用 keepalives 是愚蠢的,但是,我们希望子进程定期回收。在开启 keepalives 之前,MaxConnectionsPerChild 设置处理了这个问题。但是使用 keepalives,on 基本上只有一个连接,因此 MaxConnectionsPerChild 会有些无效。 FWIW,服务器太忙了 KeepAliveTimeout 或类似的启动 - 他们通常每秒收到数百个请求,24/7 基本上没有空闲时间。
此外,几乎所有请求都是原子请求,没有后续请求图像、CSS 等。保持活动的真正原因是因为所有连接都来自单一来源,即负载平衡器。
所以这就是问题所在......我们在想,为了偶尔回收子进程,我们可以使用这样的设置:
KeepAlive On
KeepAliveTimeout 20
MaxKeepAliveRequests 1500
MaxConnectionsPerChild 4
同样,KeepAliveTimeout 基本上没有效果。所以想法是,通过这种设置,持久连接将每 1500 次请求重置一次,然后在 4 次重置后,子节点将被回收,即;每 6000 个请求回收子进程。但是,这导致子进程大约每分钟回收一次,这与流量水平不符。作为测试,我们将设置更改为:
KeepAlive On
KeepAliveTimeout 20
MaxKeepAliveRequests 6000
MaxConnectionsPerChild 4
预计儿童寿命将增加四倍。但是,子进程现在每 50 秒到 2 分钟循环一次,没有明显的规律。
我开始认为这两个设置不像我想象的那样相互作用。对此有何见解?和/或确保在这种情况下偶尔回收子进程的“最佳实践”方法?
【问题讨论】:
-
你有没有运气解决这个问题?
-
不。而且这里没有回应(显然)。
标签: apache keep-alive amazon-elb