apache - MaxKeepAliveRequests 和 MaxConnectionsPerChild 之间的交互

标签 apache keep-alive amazon-elb

好的,这是在一系列非常繁忙的 Apache 2.4 服务器上,使用 AWS ELB 后面的 prefork MPM。因为我们在 ELB 后面,所以不启用 keepalive 是愚蠢的,但是,我们希望子进程定期回收。在打开 keepalive 之前,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

预计 child 生命周期会增加四倍。但是,子进程现在每 50 秒到 2 分钟循环一次,没有明显的模式。

我开始认为这两个设置并没有像我想象的那样相互作用。对此有何见解?和/或确保在这种情况下偶尔回收子进程的“最佳实践”方法?

最佳答案

看来您的 KeepAlive 没有激活。

我可以在我的 Apache 上看到,当我将 MaxKeepAliveRequests 从 1500 设置为 6000 时,我的子生命周期增加了四倍(请求率不变)。

  • 您确定 KeepAlive 在 apache 上处于事件状态吗? (默认情况下:是)。
  • 验证负载平衡器“keepalive”是否处于事件状态。
  • 您应该验证负载平衡器是否向 apache 发送 HTTP 1.1 请求(从 HTTP/1.1 开始仅支持保持事件连接)。 你可以在日志中看到它。

关于apache - MaxKeepAliveRequests 和 MaxConnectionsPerChild 之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30084740/

相关文章:

utf-8 - mod_jk utf-8 字符集设置

c# - 在客户端的SQL Server 2012中检测断开的连接

iphone - NSURLConnection 和保持事件状态

重定向到 HTTPS 时 ELB 上的 SSL 混淆

linux - 为单个 IP 创建两个虚拟主机

python - django长时间运行进程数据库连接

apache - 为 Apache 2.4.4 编译 libapache2-svn

Haproxy:Keepalive 连接不平衡

amazon-web-services - AWS 自动扩展 ELB 状态检查宽限期

django - 在 awsvpc 网络模式下,从 aws ELB hostcheck 获取 400 以在 aws ECS 中使用 django ALLOWED_HOSTS?