一 測試目的
這次對Jetty和Tomcat進行性能測試,主要是為了給新版本WebPortal的開發選擇合適的Java Web Server。
我們之前對老的Rest和新的TMMI都進行過性能測試,Rest有Akamai的緩存,性能基本沒有問題。但是WebPortal的內容是不斷更新的,不適合使用Akamai緩存,所以性能就全靠WebPortal本身以及均衡負載了。所以我想,在開發新版本WebPortal時,要盡量進行優化,包括硬件、Web Server、數據庫訪問等。
Jetty和Tomcat是兩個主要的開源Java Web Server,兩者都比較成熟,Google App Engine使用Jetty,JBoss是使用Tomcat作為Web容器。究竟哪個更適合我們的需求,還是自己做測試比較靠譜。
這次測試中,Jetty的版本是6.1.19,Tomcat版本是6.0.35。被測試的應用是Akamai地圖應用(AkamaiLogParser),為了方便測試,對代碼進行了部分修改,后面會介紹。
二 Jetty和Tomcat的部署、配置
我們之前版本的Rest、WebPortal都是使用embedded的Jetty進行部署。Jetty和Tomcat都能支持stand-alone和embedded方式。下面就來介紹下Jetty和Tomcat stand-alone方式的部署和配置。
Jetty的部署、配置
1. 將Jetty的zip文件copy至服務器並解壓,解壓后可以看到如下文件(夾)
其中,bin中是一些啟動Jetty的腳本和jar文件;contextes中是各個context的配置信息,一個context相當於一個應用,比如AkamaiLogParser可以對應一個context;etc中是jetty的配置信息;webapps是jetty默認的存放部署的應用的目錄,不過在這次測試中,我建立了一個文件夾myapp,用於存放AkamaiLogParser。
2. 將AkamaiLogParser程序包copy至myapp目錄下。要注意的時,要把項目所有依賴的jar文件放在{JETTY_HOME}/myqpp/AkamaiLog/webapps/WEB-INF/lib里面,jetty會在這個目錄下加載需要的jar文件。另外,web.xml和spring的配置文件也可以放在WEB-INF下。
3. 在{JETTY_HOME}/contexts下新建文件akamai.xml,文件內容為:
其中contextPath是指訪問AkamaiLogParser的URL,這里設置為“/”,URL就是http://domianname:port/***.html了。jetty.home是指AkamaiLogParser程序包所在的相對於{ JETTY_HOME }的路徑。
4. Log4j.properties放在{ JETTY_HOME }/ resources下,jetty會從此目錄讀取log配置
5. AkamaiLogParser用到的額外配置文件conf.properties,可以直接放在{ JETTY_HOME }下,這是啟動Jetty時的當前路徑
6. 在{ JETTY_HOME }下,使用java –jar start.jar啟動jetty
7. 可以使用java –XmsXXXm –XmxXXXm來調整分配給jetty的內存大小
8. 可以在{ JETTY_HOME }/etc/jetty.xml中修改jetty的配置信息,比如jetty的端口、minThreads和maxThreads等。后面在測試中,對jetty進行性能調優時,主要就是修改minThread和maxThreads這兩個參數。
Tomcat的配置、部署
1. Tomcat的部署方法比較簡單,這里僅僅是為了測試,所以沒有理會log的配置等。部署方法為將AkamaiLogParser的webapps下的所有內容copy之{TOMCAT_HOME}/webapps/ROOT目錄下,這里同jetty一樣,需要將所有依賴的jar包放在WEB-INF/lib目錄下。
2. 使用{TOMCAT_HOME}/bin/startup.sh啟動tomcat
3. 調整為tomcat分配的內存大小的方法為,修改{TOMCAT_HOME}/bin/catalina.sh,在echo "Using CATALINA_BASE: $CATALINA_BASE"前添加如下代碼:JAVA_OPTS="-server -Xms512m -Xmx2048m"。
4. 調整連接池的方法為在{TOMCAT_HOME}/conf/server.xml的Connector節點中添加如下參數:connectionTimeout="…" maxThreads="…" acceptCount="…"。
三 測試環境
被測服務器:
CentOS 5.6 64位
CPU:兩個2.93GHz的CPU
內存:2G
JDK:1.6.0_29,Java HotSpot(TM) 64-Bit Server VM
Jetty:6.1.19
Tomcat:6.0.35
發送測試請求的Jmeter機器:
使用三台機器運行JMeter,采用JMeter遠程測試的方法(稍后介紹),其中兩台機器用作JMeter server,一台用作client。
被測服務器和Jmeter的三台機器都是同一台物理上划分出來的虛擬機,所以網絡傳輸的速度應該很快,不會成為影響測試結果的因素。
測試時,還對AkamaiLogParser的代碼進行了修改,讓每次請求都直接返回內存中的一個字符串,這樣就屏蔽了磁盤文件的讀寫速度對測試結果的影響。
另外,為jetty和tomcat分配的內存大小都是“-Xms512m –Xmx2048m”。
至此,就確保了在相同的硬件條件下,jetty和tomcat的處理能力是唯一影響測試結果的因素。
四 Jmter遠程測試
Jmeter遠程測試中,用兩種角色:server和client。Server用來向被測服務器發送請求,client用來檢測測試結果。下面是本次測試中的物理環境圖:
使用Jmeter進行遠程測試的步驟為:
1. 啟動Jmeter server,啟動命令為:JMETER_HOME/bin/jmeter-server。由於需要同時發送數量很大的請求,需要更改為Jmeter分配的java 堆的大小,修改方法為:在JMETER_HOME/bin/jmeter.sh中添加JVM_ARGS="-Xms512m -Xmx2048m"。
有時會碰到Server failed to start: java.rmi.RemoteException: Cannot start. XXX is a loopback address.的錯誤,這時需要修改/etc/hosts文件,將127.0.0.1指向localhost.localdomain,將機器的實際IP指向真實的機器名。
2. 將Jmeter server的地址添加到Jmeter client的屬性文件中。編輯JMeter控制機的屬性文件。在/bin/jmeter.properties文件中找到屬性"remote_hosts",使用JMeter遠程服務器的IP地址作為其屬性值。可以添加多個服務器的IP地址,以逗號作為分隔。
3. 通過Jmeter client啟動遠程測試,添加線程組:
其中“Number of Threads(users)”是同時發送的請求數量。Ramp-UP Period是在多長時間內達到並發數。Loop Count就是發送多少輪請求。
4. 新建HTTP REQUEST:
5. 創建測試結果監聽器。
6. 通過Run->Remote Start All開啟測試。
五 測試結果分析
下面是測試中搜集到的數據
Tomcat測試結果
並發數 |
maxThreads |
acceptCount |
CPU |
內存 |
Error% |
吞吐量(次/秒) |
4000 |
2000 |
2000 |
47.5% |
7.5% |
0.34% |
987 |
6000 |
3000 |
3000 |
56.2% |
7.5% |
0.63% |
1150 |
8000 |
4000 |
4000 |
63.2% |
7.7% |
0.15% |
1120 |
10000 |
5000 |
5000 |
54.4% |
7.4% |
0.31% |
1188 |
10000 |
10000 |
10000 |
66.2% |
7.9% |
0.53% |
1148 |
Jetty測試結果
並發數 |
maxThreads |
minThreads |
CPU |
內存 |
Error% |
吞吐量(次/秒) |
4000 |
5000 |
100 |
53.9% |
29.5% |
0.32% |
1009.6 |
4000 |
8000 |
800 |
48.8% |
19.8% |
0.25% |
1000.1 |
10000 |
5000 |
100 |
58.5% |
29.4% |
3.23% |
1130 |
10000 |
10000 |
1000 |
65.1% |
20.2% |
0.99% |
1106 |
上面兩組數據中,紅色部分為保證較低錯誤路的前提下獲得的最佳性能。比較上面兩組數據可知,tomcat的吞吐量是1188次/秒,Jetty是1009.6次/秒,兩者相差並不太多,但是對於jetty,當並發數上升后,錯誤率也在上升,同時,Jetty也消耗更多的資源。總結而言,在本次測試環境下,tomcat性能比jetty略優,tomcat穩定性較好,資源消耗也小於Jetty。建議新版本WebPortal的開發中,選擇Tomcat作為web server。
由於本次測試的硬件環境跟MARS Production的硬件環境並不一致,測試結果對production環境中的性能表現並不一定具有參考價值。