我正在使用Virtualbox 4.1.8虚拟化的Debian Squeeze 6.0.4 x64上运行的小型Java EE 1.7.0 / Tomcat 7.0.26应用程序上执行HTTP负载testing基准testing(使用Apache Benchmark和Siege )。 电脑主机是Ubuntu 11.10 x64。
我已经在Tomcat server.xml修改了这些参数:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="200000" redirectPort="8443" acceptCount="2000" maxThreads="150" minSpareThreads="50" />
在服务器上执行的应用程序大约需要300ms。
这个应用程序运行良好,直到一定数量的并发连接,如:
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发生,这完全超载主处理器(但VM内部的CPU负载是正常的)。
在主机上做一个htop ,我可以看到Virtualbox processus运行在300%的CPU 下,即使在负载testing完成之后也不会下降 。 (我已经分配了4个处理器到虚拟机,如果我只分配一个处理器,CPU负载低于100%)。
重新启动Tomcat什么也不做,我被迫重启整个虚拟机。
我已经尝试在VM上本地启动这些ab / siege命令,并且一切顺利。
我首先想到的是它与linuxnetworking限制有关,如下所述: 使用ab运行一些基准testing,而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
它似乎更好,但它继续超载主机CPU和输出socket connections time out在一定数量的并发连接。
我想知道这是否与Virtualbox如何处理外部并发连接有关。
我以前见过这个问题,当你有一个循环,导致你的networkingstream量永久重新发送。 尝试检查一下,看看是否会通过任何networking接口获得大量stream量。
如果这不起作用,客户操作系统停止时CPU使用率是否停止,或者是否需要closures整个VM容器?
首先你不会说VBox主机。 它有多强大? 当我进行VBox负载testing时,我使用一台具有12核心和32G内存的机器来运行具有2至8个内核和高达12G内存的虚拟服务器。 换句话说,底层主机比VBox客户机更强大,所以我相当确定客户机具有专用内核和RAM。
接下来,我调整主机和客户操作系统来处理负载。 像最大打开的文件,打开的最大套接字,以及各种TCP / IP设置,如缓冲区。 这些需要设置正确的负载testing。 如果您用一系列负载来绘制数据图表,那么当您达到操作系统限制时,您会看到它突然变得更糟。 在加载testing您的应用程序之前解决此问题
你在VM内testing吗? 还是从其他地方? 如果它的虚拟机尝试指向127.0.0.1而不是testing。
ab -n 500 -c 150 http://127.0.0.1:8080/myapp/