硬件系统:
CPU:AthlonXP 2500+
内存:HY 1GB DDR333 SDRAM
硬盘:Matrox 金钻 40GB (7200rpm、 2MB缓存)
主板:华擎K7VM4
软件系统:
操作系统:Microsoft Windows XP with Service Pack 2
负载平衡器:Apache Httpd Server2.0.52+ mod_jk2.0.4
集群节点:Tomcat 5.5.4 × 4
测试应用:struts-blank.war中的/Welcome.do
测试客户端:ApacheBench
测试结果:
次数 | 每秒处理请求数 | 次数 | 每秒处理请求数 |
平衡负载 | 集群 | ||
并发1请求,执行请求总数为40000 | |||
1 | 263.61 | 1 | 72.26 |
2 | 263.96 | 2 | 84.82 |
3 | 263.32 | 3 | 85.03 |
并发200请求,执行请求总数为40000 | |||
1 | 529.55 | 1 | 94.89*** |
2 | 534.42 | 2 | 93.11 |
3 | 529.76 | 3 | 91.22 |
并发500请求,执行请求总数为100000* | |||
1 | 522.44 | 1 | 86.33**/*** |
2 | 511.26 | 2 | 86.87**/*** |
3 | 521.48 | 3 | 86.51**/*** |
注解:
*:在并发五百连接的测试中,负载平衡器会抛出“指定网络名称不可用”的错误,具体在这里:
[Mon Nov 17 01:43:39 2003] [warn] (OS 64)The specified.network name is no longer available. : winnt_aclearcase/" target="_blank" >ccept: Asynchronous AcceptEx failed.
出现这样的问题,我的解决方法是:禁止使用AcceptEx,方法为在httpd.conf文件中增加Win32DisableAcceptEx标记,例如:
<IfModule mpm_winnt.c>
…
Win32DisableAcceptEx
…
</IfModule>
虽然这样会使负载平衡器的性能降低一些,但是总之还是通过了严格的并发五百连接的测试。
**:数据是在提供集群服务的本机上进行测试得到的。
***:测试前重启集群节点和负载平衡器。
结论
1.平衡负载
本测试使用mod_jk默认的以轮循方式进行平衡负载,以这次测试举例:假设有10个请求,则四个节点分别接受请求编号如下:
Node 1 | Node 2 | Node 3 | Node 4 |
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 |
以下的集群方式也是使用这种方法进行平衡。
由测试结果可以看出,负载平衡是为拥有高并发量的网站准备的。同样是40000个请求,使用并发二百个连接比单连接执行效率高出近两倍。而并发五百个请求的重型测试性能并不比并发连接数少的测试低多少。
因此,平衡负载对于流量大且对高可用性(主要是会话服务)需求不是很苛刻的网站来说还是一个比较实用的方案。
2.集群
Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制。
这里提示一下就是,对每个请求的处理,Tomcat都会进行会话复制,复制后的会话将会慢慢变得庞大,例如该项并发五百连接的集群测试,测试后复制的会话大小达到了70MB,而使用的总内存更是达到了1GB以上,因此如果进行下一项测试,就必须对系统进行重新启动来初始化内存以得到正确的数据,这就是测试数据内有“***”符号的原因。
相对于单纯的负载平衡,由于集群服务需要在处理请求之间不断地进行会话复制,因此它的资源占用率是非常高的,这也降低了连接请求的处理速度,但增加了系统的高可用性。
因此,对于硬件性能高(尤其是内存要大)且对用户高可用性需求苛刻(不需重复保存会话中的数据,例如用户连接任何一台节点服务器不需要重新输入密码)的站点,选择集群方式可以满足需求。
后续情况, 可以到偶的Blog中查看: http://blog.yipsilon.com