为什么静态页面响应时间会随着并发请求的增加而增加

为什么静态页面响应时间会随着并发请求的增加而增加

我不明白我从 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”之类的内容进行了基准测试。

确切的命令和数据位于https://docs.google.com/spreadsheet/pub?hl=en_US&hl=en_US&key=0AurdDQB5QBe7dGtiLUc1SWdOeWQ4dGo3VDI5Yk8zbWc&output=html

运行测试时,每个核心的 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”是什么意思,但它可能是一个性能瓶颈。

相关内容