![为什么静态页面响应时间会随着并发请求的增加而增加](https://linux22.com/image/571267/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9D%99%E6%80%81%E9%A1%B5%E9%9D%A2%E5%93%8D%E5%BA%94%E6%97%B6%E9%97%B4%E4%BC%9A%E9%9A%8F%E7%9D%80%E5%B9%B6%E5%8F%91%E8%AF%B7%E6%B1%82%E7%9A%84%E5%A2%9E%E5%8A%A0%E8%80%8C%E5%A2%9E%E5%8A%A0.png)
我不明白我从 Apache 中看到的性能。我期望更多的并发 Apache 请求的性能会比更少的请求更好,但超过 3 个并发请求后,整体性能就持平了。例如,如果我有 3 或 4 个并发请求,我看到的请求数/秒相同。随着每个额外的并发请求,平均响应时间会增加,因此整体请求处理率保持不变。
为了测试这一点,我在 Slicehost 上创建了一个新的 ubuntu 10.04 虚拟机。这是一个 4 核虚拟机。我使用以下命令进行设置
aptitude update
aptitude install apache2 apache2-utils curl
curl localhost/ # verify hello world static page works
然后我对响应时间和请求/秒进行了基准测试。
编辑 4:我使用类似“for x in $(seq 1 40); do ab -n 10000 -c $x -q localhost/ | grep whatever; done”之类的内容进行了基准测试。
运行测试时,每个核心的 CPU 使用率约为 25%。
编辑2:根据 htop,内存使用量为 45 / 245 MB。
编辑 1:我刚刚在 ubuntu 11.04 vm 上尝试了同样的事情,总体问题是一样的,但性能更差:在大多数并发级别下,它获得大约 2100 个请求/秒,并且每个核心使用大约 50% 的 CPU。
编辑 3:我在真实硬件上尝试了一下,发现峰值请求数/秒大约为 4 或 5 个并发请求,然后它下降了一点并趋于平稳。
有人能解释为什么会发生这种情况吗?我如何找出瓶颈是什么,或者我如何改进它?我做了一些搜索,但没有找到任何答案。
答案1
我不明白 Apache 的性能。我预计,在一定范围内,并发请求越多,性能越好,但超过 3 个并发请求后,整体性能就变得平淡无奇了。
听起来您看到的正是您所说的预期结果。更多的并发请求会导致 Apache 性能更好,直到达到一定程度,然后性能就会变得平缓。让您感到惊讶的是,这个点出现在并发请求数量较少的情况下。
我不知道你为什么会觉得这很意外。没有真正的磁盘 I/O,因为页面肯定在 RAM 中。所以这纯粹是一个 CPU 绑定和网络绑定的活动。一旦你有足够多的请求,你可以绑定所有核心,并用一个请求填满网络,而另一个请求正在增加,没有理由等待更多的连接会让情况变得更好。
所以这实际上只剩下限制因素是什么的问题了。如果没有更多细节就很难说,但我会查看系统 CPU 使用率和网络带宽。最有可能的是,CPU 或网络接口已经达到最大限度。
答案2
您可能会看到网络堆栈开销的影响。随着并发性的增加,您将同时打开更多连接,因此系统和 Apache 必须更加努力地打开和关闭这些连接。这通常会降低 Apache 的性能,并导致并发级别上每个请求的平均时间更长。
我还怀疑您有更多 Apache 子进程在更高的并发级别运行。这需要时间来启动和停止这些进程。
如果您在与 Web 服务器相同的系统上运行测试,网络问题可能会变得更加复杂。
调整你的 TCP/IP 堆栈、KeepAlive 设置(如果打开)和超时可以改善这种情况。
然而,这是一个长期存在的 Apache 扩展问题。
这是有关该主题的经典文章。PDF:http://www.stdlib.net/~colmmacc/Apachecon-EU2005/scaling-apache-handout.pdf
答案3
请查看 Apache httpd wiki 中的(尚未官方发布的)性能文档:
http://wiki.apache.org/httpd/PerformanceScalingUp
最后说一句:我不知道您所说的“VM”是什么意思,但它可能是一个性能瓶颈。