我正在进行 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/