Apache 中的 keepAlive 导致 Apache 达到其 max_clients

Apache 中的 keepAlive 导致 Apache 达到其 max_clients

我有一个运行在 ubuntu 11.4 上的 Apache 2.2,具有 16Gb RAM,用于通过 GPRS 从手机托管图像,因为连接速度很慢我已经启用了 keepalive 并将超时设置为 6,**基于平均加载时间。但通常即使有 10-20 个用户,apache 也会达到其 max_clients 300 并阻止进一步的连接。但有趣的是,即使**关闭了 keepalive,Apache 也会达到其最大值并拒绝接受新连接

**KeepAlive ON /也尝试关闭

最大KeepAliveRequests 100

keepalivetimeout 设置为 6(因为有很多动态图像和慢速连接)

启动服务器 100

最小备用服务器 100

最大备用服务器数 150

服务器限制 300

最大客户数 300

每个子项的最大请求数 3000**

我应该怎么做才能在不达到 max_clients 的情况下提高性能。缓存和 deflate 模块也已启用。将 maxrequestperchild 设置为 10 可以防止达到 max-clients。

答案1

您正在使用 prefork MPM 运行 apache 2.2;众所周知,它不适合处理大量并发连接。

考虑切换到 worker MPM,或者升级到 apache 2.4。

即使使用 worker MPM 的 apache 2.2 也可以提供16GB 内存的并发请求数。

特别是在移动设备上,将 KeepAliveTimeout 设置得太低会对您造成伤害;考虑将其增加到至少 30 秒。

答案2

像适配器一样,切换到“worker” MPM 并扩展到数千个并发连接。

请注意,连接的最大持续时间也由TimeOutApache 参数控制:将其设置为较低的值,因为它是“空闲 I/O 超时”值。好吧,不要太低,因为 GPRS 客户端很慢,但默认的 300 秒太高了。

即使将“TimeOut”参数设置为较低的值,客户端仍会决定保持连接打开的时间。您可能需要检查 mod_reqtimeout(http://httpd.apache.org/docs/2.2/mod/mod_reqtimeout.html),这至少对阻止类似 slowloris 的攻击有很大帮助。

可以定义其他超时,但这取决于特定模块/用法。我通过 mod_proxy 和 mod_fcgid 控制更严格的超时。当可以强制连接使用时间不超过 N 秒时,您就会确切知道在达到 MaxClients 之前您的名义到达率是多少(即MaxClients / N新连接/秒)。这在很大程度上取决于您在 Apache 中运行的内容。

相关内容