为什么 Apache 无法在 Windows 上提供高并发的静态内容?

Why is Apache unable to serve static content with high concurrency on Windows?

在 windows 7,8,2012 测试 Apache 2.4.16 时,在提供静态内容时存在严重限制。在 Keep Alive 关闭的情况下,Apache 无法为超过 700 个静态内容并发请求提供服务。

当您尝试这样做时,会发生以下两种情况之一:

  1. 一开始您将能够处理几千个请求,然后剩余的请求最多需要 10 秒才能完成。 或者
  2. 您将收到连接被拒绝的错误消息

测试方法:

siege -b -c700 -t10s -v http://10.0.0.31/10k.txt    (10KB file)

ab -c 700 -n 40000 http://10.0.0.31/10k.txt 

但是,当在本地主机上使用 Apache 工作台进行测试时(绕过网络)Apache 工作正常并且可以为 10K 静态文件提供 1000 个并发请求。

Apache 有 ThreadsPerChild 7000(增加到 14000 没有任何区别)
MaxConnectionsPerChild 0

堆栈参数:
最大用户端口 = 65534
TcpTimedWaitDelay = 30
服务器有超过 60,000 个可用的临时端口,从端口 5,000 到端口 65534

可能的结论: 起初我以为这是 OS 堆栈调整问题,但服务 php 具有相同并发性的文件工作正常。

ab -c 700 -n 10000 http://10.0.0.31/phpinfo.php

然后我在同一台机器上尝试了 windows 的 Nginx,Nginx 没有问题。

ab -c 700 -n 10000 http://10.0.0.31/10k.txt

Nginx 能够提供高达每秒 2000 个请求(静态内容)的更高并发性,并且 OS 打开了大约 40,000 个 TCP 连接。

所以在我看来,这像是 Apache 与 windows 上的 TCP/IP 堆栈通信方式中的错误或限制。

当尝试重现此问题时,请确保“保持活动”处于关闭状态并通过网络(而不是在本地主机上)对其进行测试。

如有任何关于此主题的回答或评论,我们将不胜感激。

感谢会议的建议,这里就是答案。

  1. Keep Alive 被有意禁用,以模拟大量用户从不同的 IP 地址连接并产生新的 TCP 连接。

  2. 将 AcceptFilter http 设置为 "none" 并关闭 MultiViews 提高了静态内容的性能,并允许 windows 上的 Apache 以 2000 甚至更高的并发度提供服务,直到所有短暂的端口耗尽。