使用JMeter對Tomcat進行壓力測試與Tomcat效能調優
一、準備工作。
1、安裝JDK1.6或1.6版本以後的,並配置環境變數。
2、在Apache的官網下載最新的Jmeter, http://jmeter.apache.org/download_jmeter.cgi,截止目前為止,最新的Jmeter是2.12版本,需要注意的是下載使用的時候不能下載source版本的,必須下載內容更加完整的binaray版本的,比如如果下載 apache-jmeter-2.12_src.zip,執行jmeter.bat時,會出現下面的exception:
unable to access jarfile apachejmeter.jar error value=1
這個exception的原因是 apache-jmeter-2.12_src.zip中的bin目錄中,缺少了ApacheJemeter.jar.所以要下載binary版本的。
3、在Apache的官網上下載Tomcat,本文中以Tomcat7.0.42為例。
二、開發一個簡單的J2EE工程,可以是基於Servlet的,可以是基於Spring等MVC框架的,而且不需要實現什麼樣的功能,只需要滿足使用者訪問http://localhost: 9999時,瀏覽器中能夠輸出(index.html)Hello World或者其它任何內容。
三、開始在Jmeter中配置模擬對Tomcat的index.html(localhost:9999)進行併發訪問。
首先是使用Tomcat 7.0.42的預設配置
1、選中Test Plan,點選Edit選單按鈕,選擇Add操作,選擇Thread(Users),然後選擇Thread Group建立一個執行緒組。
2、選中Thread Group,點選Edit選單按鈕,選擇Add操作,選擇Sampler,並選擇Http Request。
3、選中Test Group,點選Edit選單安丘,選擇Add操作,選擇Listener,然後分別新增Aggregate Graph(聚集圖形),View Results Tree(檢視結果樹)。
3、不修改Tomcat的預設配置,啟動Tomcat,由於預設的Tomcat執行在8080埠,將上面的9999埠先改回8080或者遵照後面點的步驟將Tomcat預設的8080埠改為9999。
4、啟動Tomcat。
5、點選上面的綠色執行按鈕執行該測試計劃。
由測試執行緒組可知,Jemeter將模擬150000個執行緒請求不斷的訪問localhost:8080。執行10分鐘後,執行結果截圖可得:
下面將詳解這個聚合報告中的每個引數:
1)Label:每個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,label顯示的就是 Name 屬性的值
2)#Samples:表示你這次測試中一共發出了多少個請求,如果模擬10個使用者,每個使用者迭代10次,那麼這裡顯示100,這裡顯示的應該是150000而不是172649,之所以是172649,是因為我中間點選停止,然後又再原來的基礎上重新開始執行。
3)Average:平均響應時間——預設情況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也可以以Transaction 為單位顯示平均響應時間
4)Median:中位數,也就是 50% 使用者的響應時間
5)90% Line:90% 使用者的響應時間
6)Min:最小響應時間
7)Max:最大響應時間
8)Error%:本次測試中出現錯誤的請求的數量/請求的總數
9)Throughput:吞吐量——預設情況下表示每秒完成的請求數(Request per Second),當使用了 Transaction Controller 時,也可以表示類似 LoadRunner 的 Transaction per Second 數
10)KB/Sec:每秒從伺服器端接收到的資料量,相當於LoadRunner中的Throughput/Sec
這裡我們可以看到,在這172649多次的訪問之中,tomcat的訪問出錯率是0.15%,即大概有100多次的請求是由於忙碌而失敗了的。當然,這只是一個參考,具體還要根據軟硬體的條件才能最終確定下來。
對Tomcat進行調優後再用Jmeter進行測試
1、增加Tomcat對JVM記憶體的分配:即 調整虛擬記憶體
Linux:
在/usr/local/tomcat_home/bin目錄下的catalina.sh
新增:JAVA_OPTS='-Xms1024m -Xmx2048m'
要加“m”說明是MB,否則就是KB了,在啟動tomcat時會報記憶體不足。
-Xms:初始值
-Xmx:最大值
-Xmn:最小值
Windows:
在catalina.bat最前面加入
set JAVA_OPTS=-Xms1024m -Xmx2048m
如果用startup.bat啟動tomcat,OK設定生效。夠成功的分配2048M記憶體.
但是如果不是執行startup.bat啟動tomcat而是利用windows的系統服務啟動tomcat服務,上面的設定就不生效了,就是說set JAVA_OPTS=-Xms1024m -Xmx2048m沒起作用。
windows服務執行的是bin\tomcat.exe.他讀取登錄檔中的值,而不是catalina.bat的設定.。
解決辦法:
修改登錄檔HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat7\Parameters\JavaOptions
原值為
-Dcatalina.home="C:\ApacheGroup\Tomcat 7.0.42"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 7.0.42\common\endorsed"
-Xrs
加入 -Xms1024m -Xmx2048m
重起tomcat服務,設定生效
2、修改執行緒池並將預設的8080埠修改為9999埠。
即將預設的
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改為:
<Connector port="9999" redirectPort="8443" maxHttpHeaderSize="8192" useBodyEncodingForURI="true" minProcessors="100" maxProcessors="5000" maxThreads="5000" minSpareThreads="1000" maxSpareThreads="4000" enableLookups="false" acceptCount="3500" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" connectionTimeout="60000" disableUploadTimeout="true" debug="0" URIEncoding="UTF-8"/>
3. 禁用DNS查詢
當web應用程式向要記錄客戶端的資訊時,它也會記錄客戶端的IP地址或者通過域名伺服器查詢機器名轉換為IP地址。DNS查詢需要佔用網路,並且包括可能從很多很遠的伺服器或者不起作用的伺服器上去獲取對應的IP的過程,這樣會消耗一定的時間。為了消除DNS查詢對效能的影響我們可以關閉 DNS查詢,方式是修改server.xml檔案中的enableLookups引數值: 將其設定為false。
4、修改完後,重啟tomcat。
5、在Jmeter的Thread Group中將上面的8080改成9999.
6、重新執行Jmeter,執行10分鐘後,儲存執行結果,得到如下的執行結果:
對比調優後的執行結果,發現Tomcat的吞吐率得到了相當的提升,平均執行時間大大減少了