jmeter命令列執行-分散式測試
轉載:https://www.cnblogs.com/miaomiaokaixin/p/6116927.html
jmeter底層用java開發,耗記憶體、cpu,如果專案要求大併發去壓測服務端的話,jmeter單節點難以完成大併發的請求,這時就需要對jmeter進行分散式測試:
1:先說說分散式測試原理
處理過程:
一:排程機master啟動以後,會拷貝本地的jmx檔案分發到遠端的slave機器上;
二:slave機器拿到指令碼以後啟動命令列模式去執行指令碼,對於每臺slave機器拿到的指令碼都是一樣的,所以如果jmx指令碼為50個執行緒跑3分鐘,那麼實際併發就是50*3=150個執行緒併發跑3分鐘;
三:執行時,slave會把執行獲得的資料結果傳給master機器,master機器會收集所有slave機器的資訊並彙總,這樣master機器上就存在一份所有slave機器彙總的資料結果。
注意事項:
一:我們注意到master機器啟動後會拷貝jmx檔案到slave機器,所以我們不需要在每臺slave機器上也上傳一份jmx,只需要在master機器上上傳一份jmx指令碼即可。
二:引數化檔案:如果使用csv進行引數化,那麼需要把引數檔案在每臺slave上拷一份且路徑需要設定成一樣的。
三:排程機(master)和執行機(slave)最好分開,由於master需要傳送資訊給slave並且會接收slave回傳回來的測試資料,所以mater自身會有消耗,所以建議單獨用一臺機器作為master。
四:保證每臺機器的jmeter版本和外掛版本相同,避免造成一些意外問題。
五:分散式測試總樣本數 = 執行緒數 * 迴圈次數 * 執行機總數,樣本計數邏輯為:執行機slave執行的測試指令碼是由排程機master分發的,故每臺執行機執行的測試指令碼都是相同的,故而效能測試總樣本數 = 測試指令碼樣本數 * 執行機總數,而測試指令碼樣本數為執行緒數 * 迴圈次數
2:說完了原理,現在我們來說如何做jmeter分散式測試
- 在所有需要做分散式的機器上部署java和jmeter,要求需要保證每臺機器上部署的jmeter版本相同外掛版本也相同,最好部署在同一路徑下(這樣如果有csv引數化比較方便)
部署jmeter很簡單,只需從官網下載相應版本然後傳到伺服器上進行解壓縮就可以了這裡給出我的雲盤地址:http://pan.baidu.com/s/1bI3r2I 密碼:f5ll。
比如我部署在134.64.14.95、134.64.14.96、134.64.14.97、134.64.14.98四臺機器上,每臺機器部署路徑為:/home/tester
- 修改slave機器bin目錄下的jmeter.properties配置,我的3臺slave機器為:134.64.14.96、134.64.14.97、134.64.14.98
修改3臺slave機器jmeter/bin目錄下的jmeter.properties中server_port埠號為機器未被佔用的埠號,一般預設為1099,此處我修改為7899(可以使用預設埠或者改成其他埠,只要未被佔用就行),remote_hosts為127.0.0.1不需要修改
補充:自己 #server.rmi.ssl.disable=false 改成 server.rmi.ssl.disable=true
修改完成儲存,我配置的3臺機器為:
134.64.14.96機器(remote_hosts:127.0.0.1、server_port:7899)
134.64.14.97機器(remote_hosts:127.0.0.1、server_port:7899)
134.64.14.98機器(remote_hosts:127.0.0.1、server_port:7899)
- 完成slave機器的配置後,此時配置master機器,我的1臺master機器為134.64.14.95
注意到由於master機器作為排程機本身會有一定的效能消耗所以我們配置遠端執行機的時候並沒有把master機器配置進去,只配置了3臺執行機
補充:自己 #server.rmi.ssl.disable=false 改成 server.rmi.ssl.disable=true
修改完成儲存,我配置的1臺機器為:
134.64.14.95機器(remote_hosts:134.64.14.96:7899,134.64.14.97:7899,134.64.14.98:7899、server_port:註釋掉不用開啟)
- 完成了所有機器配置後,我們需要上傳測試指令碼,測試時只需要上傳jmx檔案到master機器即134.64.14.95機器的jmeter對應目錄即可,其他執行機不需要上傳jmx檔案,因為master啟動後會拷貝本地jmx到遠端執行機上
- 現在我們來啟動分散式測試,啟動分散式測試分兩步:
一:首先啟動執行機即slave機器134.64.14.96、134.64.14.97、134.64.14.98,每臺slave機器都需要執行以下命令來啟動jmeter-server
命令為:./jmeter-server
補充:自己,執行報錯,執行命令:
./jmeter-server -Djava.rmi.server.hostname=10.1.1.222
二:確認3臺slave執行機都啟動正確完成後,在啟動master機器134.64.14.95,執行如下命令開啟分散式測試
命令為:./jmeter -n -t baidu_requests_results.jmx -r-l baidu_requests_results.jtl
3:測試命令說明
./jmeter -n -t baidu_requests_results.jmx-r-l baidu_requests_results.jtl
n表示無GUI執行
t表示要執行的jmx檔案
l指生成的檔名稱
r指遠端將所有agent啟動
4:測試結果說明
注意到上面控制檯列印的資訊中
summary + 5504 in 00:00:02 = 3590.3/s Avg: 1 Min: 0 Max: 174 Err: 5504 (100.00%) Active: 59 Started: 58 Finished: 0
summary + 1224043 in 00:00:30 = 40802.8/s Avg: 0 Min: 0 Max: 188 Err: 1224043 (100.00%) Active: 60 Started: 59 Finished: 0
summary = 1229547 in 00:00:32 = 38989.9/s Avg: 0 Min: 0 Max: 188 Err: 1229547 (100.00%)
解析:
summary為請求數目,指在多少時間內增加了多少請求數目,由此算出後面的3590.3/s、40802.8/s、38989.9/s也就是每秒完成請求數(吞吐量),每隔一段時間列印一行,最後一行可以看到請求總數為8213739,平均吞吐量為45495.4/s(每秒完成請求數)
summary = 8213739 in 00:03:01 = 45495.4/s Avg: 0 Min: 0 Max: 191 Err: 8213739 (100.00%)
另外active:60指活躍執行緒數,我們用3臺機器併發測試,每臺執行的指令碼都為20個執行緒3分鐘,所以線上活躍執行緒數為20*3=60個,執行時間為3分鐘
錯誤率為:可以看出伺服器能否承受這麼大的併發,這裡都是100%報錯是由於同一ip短時間併發請求百度,百度是不允許的,所以會被拒絕發生報錯
當然我們除了看控制檯的資訊以外,效能測試還需要關注:所有測試機器以及被測試機器的伺服器指標如:cpu、磁碟io、記憶體消耗等,以及服務端和客戶端日誌資訊
對於生成的jtl檔案,我們可以進行解析生成我們關注的資訊如:吞吐量、響應時間、點選率、錯誤率等等
自己補充:
1. jdk和jmeter版本一致、網路環境一致
2. bin目錄下修改配置檔案:
remote_hosts=ip:1099 主控機寫節點機ip:1099 節點機寫自己ip:1099
server_port=1099
server.rmi.localport=1099
server.rmi.disable=True
3. bin目錄下修改jmeter.bat檔案
主控機配置項:
增加:set rmi_host=-Djava.rmi.server.hostname=ip
修改:set ARGS=%DUMP%....最後加上 %rmi_host%
節點機配置項:
修改:RMI_HOST_DEF=-Djava.rmi.server.hostname=ip