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

我不明白从Apache看到的性能。 我希望有更多的并发apache请求能够执行得更好,但是要超过3个并发请求,总体性能是平稳的。 例如,如果我有3个或4个并发请求,我看到相同的请求/秒。 对于每个额外的并发请求,平均响应时间会增加,这样整个请求处理速率将保持不变。

为了testing这个,我在slicehost上创build了一个新的ubuntu 10.04 vm。 这是一个4核心虚拟机。 我设置了它

aptitude update aptitude install apache2 apache2-utils curl curl localhost/ # verify hello world static page works 

然后我以响应时间和请求/秒为基准

编辑4:我用“for $ in(seq 1 40)”做了基准testing;做ab -n 10000 -c $ x -q localhost / | grep whatever; done“。

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

运行testing时,每个内核的CPU使用率大约为25%。

编辑2:根据htop,内存使用率为45/245 MB。

编辑1:我只是在Ubuntu 11.04虚拟机上尝试了同样的事情,总体问题是相同的,但性能更糟糕:大多数并发水平约为2100 reqs / sec,每个核心使用大约50%的cpu 。

编辑3:我在真正的硬件上试了一下,看到一个峰值reqs /秒约4或5个并发请求,然后它下降了一点点,并展平。

任何人都可以解释为什么会发生这种情况,我怎么能够找出瓶颈是什么,或者我可以怎样改进呢? 我做了一些search,并没有find任何答案。

我不明白从Apache看到的性能。 我希望有更多的并发apache请求能够执行得更好,但是要超过3个并发请求,总体性能是平稳的。

这听起来像你正在看到你所说的你所期望的。 更多的并发请求导致Apache性能更好,达到某一点,然后性能持平。 看起来让你感到惊讶的是,并发请求的数量很less。

我不确定你为什么会觉得奇怪。 没有真正的磁盘I / O,因为页面肯定在RAM中。 所以它纯粹是一个CPU绑定和networking绑定的活动。 一旦你有足够的请求,你可以绑定所有的核心,并填充networking,一个请求将另一个请求正在上升,没有理由更多的连接等待会让事情变得更好。

所以这实际上只留下了限制因素的问题。 很难说没有更多的细节,但我会看看系统CPU使用量和networking带宽量。 最有可能的是,无论是CPU或networking接口正在超出。

您可能会看到networking堆栈中的开销的影响。 随着并发性的增加,你将有更多的同时连接打开,所以系统和Apache必须更加努力地打开和closures这些连接。 这通常会降低Apache性能,并导致并发级别每个请求的平均时间较长。

我也怀疑你有更多的Apachesubprocess运行在更高的并发级别。 这需要时间来旋转这些上下。

如果您在与Web服务器相同的系统上运行testing,networking问题可能会变得更加复杂。

调整您的TCP / IP堆栈,KeepAlive设置(如果打开)和超时可以改善这一点。

然而,这是一个长期的apache扩展已知的问题。

这是一个关于这个主题的经典文章。 PDF: http : //www.stdlib.net/~colmmacc/Apachecon-EU2005/scaling-apache-handout.pdf

请检查Apache httpd wiki中的(尚未官方)性能文档:

http://wiki.apache.org/httpd/PerformanceScalingUp

最后一句话:我不知道你的情况下“VM”意味着什么,但它可能是一个性能瓶颈。