(1 )采用負載平衡和集群技術(shù),初步機構(gòu)采用Apache+Tomcat 的機群技術(shù)。
(2 )采用壓力測試工具,測試壓力。工具是Loadrunner.
硬件環(huán)境搭建:
為了能夠進行壓力測試,需要搭建一個環(huán)境。剛開始時,測試在公司局域網(wǎng)內(nèi)進行,但很快發(fā)現(xiàn)了一個問題,即一個腳本的壓力測試結(jié)果每次都不一樣,并且差別很大。原來是受公司網(wǎng)絡(luò)的影響,于是決定搭建一個完全隔離的局域網(wǎng)測試。搭建后的局域網(wǎng)配置如下:
(1) 網(wǎng)絡(luò)速度:100M
(2) 三臺服務(wù)器:
負載服務(wù)器 :操作系統(tǒng)windows2003,
Tomcat服務(wù)器:操作系統(tǒng)windows2000 Professional
數(shù)據(jù)庫服務(wù)器:操作系統(tǒng)windows2000 Professional
三臺機器的cpu 2.4 G, 內(nèi)存 1G。
軟件環(huán)境搭建:
軟件的版本如下:
Apache 版本:2.054,
Tomcat5.0.30,
mysql :4.1.14.
JDK1.5
壓力測試工具:Loadrunner7.8。
負載平衡方案如下:
一臺機器(操作系統(tǒng)2003)安裝apache,作為負載服務(wù)器,并安裝tomcat作為一個worker;一個單獨安裝tomcat,作為第二個worker;剩下的一臺單獨作為數(shù)據(jù)庫服務(wù)器。
Apache和tomcat的負載平衡采用JK1.2.14(沒有采用2.0,主要是2.0不再維護了)。
集群方案:
采用Tomcat本身的集群方案。在server.xml配置。
壓力測試問題:
壓力測試后,發(fā)現(xiàn)了一些問題,現(xiàn)一一列出來:
(1) 采用Tocmat集群后,速度變得很慢。因為集群后,要進行session復(fù)制,導(dǎo)致速度較慢。Tomcatd的復(fù)制,目前不支持application復(fù)制。復(fù)制的作用,主要用來容錯的,即一臺機器有故障后,apache可以把請求自動轉(zhuǎn)發(fā)到另外一個機器。在容錯和速度的考慮上,我們最終選擇速度,去掉了Tomcat集群。
(2) 操作系統(tǒng)最大并發(fā)用戶的限制:
為了采用網(wǎng)站的壓力,我們開始的時候,僅測試Tomcat的最大負載數(shù)。Tomcat服務(wù)器安裝的操作系統(tǒng)是windows2000 Professional。當(dāng)我們用壓力測試工具,并發(fā)測試時,發(fā)現(xiàn)只要超過15個并發(fā)用戶,會經(jīng)常出現(xiàn)無法連接服務(wù)器的情況。經(jīng)過研究,發(fā)現(xiàn)是操作系統(tǒng)的問題:windows2000 Professional 支持的并發(fā)訪問用戶有限,默認的好像是15個。于是我們把操作系統(tǒng)全部采用windows2003 server版本。
(3) 數(shù)據(jù)庫連接池的問題:
測試數(shù)據(jù)庫連接性能時,發(fā)現(xiàn)數(shù)據(jù)庫連接速度很慢。每增加一些用戶,連接性能就差了很多。我們采用的數(shù)據(jù)庫連接池是DBCP,默認的初始化為50個,應(yīng)該不會很慢吧。查詢數(shù)據(jù)庫的連接數(shù),發(fā)現(xiàn)初始化,只初始化一個連接。并發(fā)增加一個用戶時,程序就會重新創(chuàng)建一個連接,導(dǎo)致連接很慢。原因就在這里了。如何解決呢?偶爾在JDK1.4下的Tomcat5.0.30下執(zhí)行數(shù)據(jù)庫連接壓力測試,發(fā)現(xiàn)速度很快,程序創(chuàng)建數(shù)據(jù)庫連接的速度也是很快的。看來JDK1.5的JDBC驅(qū)動程序有問題。于是我們修改 JDK的版本為1.4.
(4) C3P0和DBCP
C3P0是Hibernate3.0默認的自帶數(shù)據(jù)庫連接池,DBCP是Apache開發(fā)的數(shù)據(jù)庫連接池。我們對這兩種連接池進行壓力測試對比,發(fā)現(xiàn)在并發(fā)300個用戶以下時,DBCP比C3P0平均時間快1秒左右。但在并發(fā)400個用戶時,兩者差不多。
速度上雖然DBCP比C3P0快些,但是有BUG:當(dāng)DBCP建立的數(shù)據(jù)庫連接,因為某種原因斷掉后,DBCP將不會再重新創(chuàng)建新的連接,導(dǎo)致必須重新啟動Tomcat才能解決問題。DBCP的BUG使我們決定采用C3P0作為數(shù)據(jù)庫連接池。
調(diào)整后的方案:
操作系統(tǒng)Windows2003 server版本
JDK1.4
Tomcat 5.0.30
數(shù)據(jù)庫連接池C3P0
僅采用負載平衡,不采用集群。
軟件的配置:
Apache配置:主要配置httpd.conf和新增加的文件workers.properties
Httpd.conf:
#一個連接的最大請求數(shù)量
MaxKeepAliveRequests 10000
#NT環(huán)境,只能配置這個參數(shù)來提供性能
<IfModule mpm_winnt.c>
#每個進程的線程數(shù),最大1920。NT只啟動父子兩個進程,不能設(shè)置啟動多個進程
ThreadsPerChild 1900
每個子進程能夠處理的最大請求數(shù)
MaxRequestsPerChild 10000
</IfModule>
# 加載mod_jk
#
LoadModule jk_module modules/mod_jk.so
#
# 配置mod_jk
#
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
#請求分發(fā),對jsp文件,.do等動態(tài)請求交由tomcat處理
DocumentRoot "C:/Apache/htdocs"
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
JkMount /servlet/* loadbalancer
#關(guān)掉主機Lookup,如果為on,很影響性能,可以有10多秒鐘的延遲。
HostnameLookups Off


