Virtualbox HTTP 负载测试,主机 CPU 过载问题

Virtualbox HTTP 负载测试,主机 CPU 过载问题

我正在进行 HTTP 负载测试基准测试(使用Apache 基准围城) 在一个小型 Java EE 1.7.0 / Tomcat 7.0.26 应用程序上运行,该应用程序运行在用 Virtualbox 4.1.8 虚拟化的 Debian Squeeze 6.0.4 x64 上。计算机主机是 Ubuntu 11.10 x64。

我在 Tomcat 中修改了这些参数server.xml

<Connector 
    port="8080" 
    protocol="HTTP/1.1"
    connectionTimeout="200000"
    redirectPort="8443" 
    acceptCount="2000"
    maxThreads="150"
    minSpareThreads="50" />

该应用程序在服务器上执行大约需要300毫秒。

这个应用程序运行良好,直到出现一定数量的并发连接,例如:

ab -n 500 -c 150 http://xx.xx.xx.xx:8080/myapp/
ab -n 1000 -c 50 http://xx.xx.xx.xx:8080/myapp/
siege -b -c 100 -r 20 http://xx.xx.xx.xx:8080/myapp/ 

发生了很多socket connection timed out事情,这会导致主机处理器完全超载(但虚拟机内部的 CPU 负载正常)。

htop在主机上执行此操作时,我可以看到 Virtualbox 进程的 CPU 使用率为 300%,并且即使负载测试结束后也不会下降。(我为 VM 分配了 4 个处理器,如果我只分配一个处理器,CPU 负载就会低于 100%)。

重新启动 Tomcat 没有任何作用,我被迫重新启动整个 VM。

我已尝试在虚拟机上本地启动这些 ab/siege 命令,一切顺利。

我首先认为它与 Linux 网络限制有关,如下所述:使用 ab 运行一些基准测试,发现 tomcat 的速度开始变慢 因此我修改了这些 TCP 参数:

echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

似乎变得更好,但它仍然会socket connections time out在一定数量的并发连接下导致主机 CPU 和输出过载。

我想知道这是否与 Virtualbox 如何处理外部并发连接无关。

答案1

我以前见过这个问题,当你有一个循环导致你的网络流量被永远重新发送时。试着检查一下你的任何网络接口是否有大量的流量。

如果这不起作用,那么当客户操作系统停止时 CPU 使用率是否会停止,或者是否需要关闭整个 VM 容器?

答案2

首先,您没有提到 VBox 主机。它有多强大?当我进行 VBox 负载测试时,我使用一台具有 12 个内核和 32G RAM 的机器来运行具有 2 到 8 个内核和最多 12G RAM 的虚拟服务器。换句话说,底层主机比 VBox 客户机更强大,因此我有理由相信客户机具有专用内核和 RAM。

接下来,我会调整主机和客户操作系统以处理负载。例如,最大打开文件数、最大打开套接字数以及各种 TCP/IP 设置(例如缓冲区)。需要正确设置这些设置才能进行负载测试。如果您用一系列负载绘制数据图表,您会发现当达到操作系统限制时,情况会突然变得更糟。请在对应用进行负载测试之前修复此问题。

答案3

您是在虚拟机内测试吗?还是在其他地方?如果是虚拟机,请尝试指向 127.0.0.1 进行测试。

ab -n 500 -c 150 http://127.0.0.1:8080/myapp/

相关内容