为什么 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 个静态内容并发请求提供服务。
当您尝试这样做时,会发生以下两种情况之一:
- 一开始您将能够处理几千个请求,然后剩余的请求最多需要 10 秒才能完成。
或者
- 您将收到连接被拒绝的错误消息
测试方法:
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
我的负载测试服务器 Linux 在单独的服务器上,并通过网络将请求通过 10Gb/s 网络发送到 Apache Windows 服务器。
Apache 日志中没有错误,系统日志中也没有任何错误。任务列表没有显示任何异常。
netstat 显示几千 (5,000) 个打开的 TCP 连接,然后 Apache 停止响应。但是,当以较低的 300 并发进行测试时,OS 可以打开 60,000 个 TCP 连接并且 Apache 工作正常。
可能的结论:
起初我以为这是 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 堆栈通信方式中的错误或限制。
当尝试重现此问题时,请确保“保持活动”处于关闭状态并通过网络(而不是在本地主机上)对其进行测试。
如有任何关于此主题的回答或评论,我们将不胜感激。
感谢会议的建议,这里就是答案。
Keep Alive 被有意禁用,以模拟大量用户从不同的 IP 地址连接并产生新的 TCP 连接。
将 AcceptFilter http 设置为 "none" 并关闭 MultiViews 提高了静态内容的性能,并允许 windows 上的 Apache 以 2000 甚至更高的并发度提供服务,直到所有短暂的端口耗尽。
在 windows 7,8,2012 测试 Apache 2.4.16 时,在提供静态内容时存在严重限制。在 Keep Alive 关闭的情况下,Apache 无法为超过 700 个静态内容并发请求提供服务。
当您尝试这样做时,会发生以下两种情况之一:
- 一开始您将能够处理几千个请求,然后剩余的请求最多需要 10 秒才能完成。 或者
- 您将收到连接被拒绝的错误消息
测试方法:
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
我的负载测试服务器 Linux 在单独的服务器上,并通过网络将请求通过 10Gb/s 网络发送到 Apache Windows 服务器。
Apache 日志中没有错误,系统日志中也没有任何错误。任务列表没有显示任何异常。
netstat 显示几千 (5,000) 个打开的 TCP 连接,然后 Apache 停止响应。但是,当以较低的 300 并发进行测试时,OS 可以打开 60,000 个 TCP 连接并且 Apache 工作正常。
可能的结论: 起初我以为这是 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 堆栈通信方式中的错误或限制。
当尝试重现此问题时,请确保“保持活动”处于关闭状态并通过网络(而不是在本地主机上)对其进行测试。
如有任何关于此主题的回答或评论,我们将不胜感激。
感谢会议的建议,这里就是答案。
Keep Alive 被有意禁用,以模拟大量用户从不同的 IP 地址连接并产生新的 TCP 连接。
将 AcceptFilter http 设置为 "none" 并关闭 MultiViews 提高了静态内容的性能,并允许 windows 上的 Apache 以 2000 甚至更高的并发度提供服务,直到所有短暂的端口耗尽。