硬件系統:
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
原文轉自:http://www.anti-gravitydesign.com