jmeter命令行運行但是是單節點下的,
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,以GUI模式運行,同時控制測試的運行,在這里就是client,啟動腳本所在的那台機器。
- slave,運行jmeter-server並從master接收指令、向目標服務器發送請求
注意事項:
一:我們注意到master機器啟動后會拷貝jmx文件到slave機器,所以我們不需要在每台slave機器上也上傳一份jmx,只需要在master機器上上傳一份jmx腳本即可。
二:參數化文件:如果使用csv進行參數化,那么需要把參數文件在每台slave上拷一份並且路徑必須需要設置成一樣的。
三:調度機(master)和執行機(slave)最好分開,由於master需要發送信息給slave並且會接收slave回傳回來的測試數據,所以mater自身會有消耗,所以建議單獨用一台機器作為master。
即master機不建議也作為壓測機。
四:保證每台機器的jmeter版本和插件版本相同,避免造成一些意外問題。
jdk版本保證大版本一致,小版本可不一致。
jmeter版本必須保證大小版本都一致。
五,注意監控壓測機器的CPU,內存,網絡。
六:分布式測試總樣本數 = 線程數 * 循環次數 * 執行機總數,
樣本計數邏輯為:執行機slave執行的測試腳本是由調度機master分發的,
故每台執行機執行的測試腳本都是相同的,
故而性能測試總樣本數 = 測試腳本樣本數 * 執行機總數,
而測試腳本樣本數為線程數 * 循環次數
一、壓測機
1、數量&成本
無論是從成本角度還是維護的難易方面,壓測機的數量,適量就好。
舉個例子,8C16G的一台服務器,部署jmeter后,根據我個人的測試比對數據,配置≤1500個線程數,最好。太多了性能損耗較大,延時高;太少了又浪費。
2、controller&agent
模擬的並發線程數超過5K,我個人建議留出一台做專門的controller機器,主要是避免agent機器數據上報帶來的影響(如果有其他的數據存儲+可視化服務,可以忽略)。
3、服務授權
如果壓測啟動和服務配置都是root權限,那么在linux環境下,需要給jmeter和jmeter-server授權,命令為 chmod 777 jmeter ,授權后,顯示如下:
二、服務通信
1、網絡
所有的壓測機和被測服務,最好在同一個網段內,盡可能減少時延問題(如果不在同一個網段,就需要找運維建立專門的網絡通道,這個很浪費)。
2、端口
在分布式壓測配置時,需要在controller機器的jmeter.properties文件中配置agent機器的IP+端口,默認端口1099,如果該端口沒有被占用,則無需配置端口信息,比如:
3、內網和公網
如果壓測機在內網,而訪問的請求地址(現在都是統一的網關域名)在外網,就要注意一點:內網到公網一般是有帶寬限制的,最好在壓測開始前和運維確認。
三、數據切割
壓測時候需要用到參數化數據,有些業務場景是需要先登錄再進行操作的,或者某些數據具有唯一屬性。
在分布式壓測時候,需要注意,進行均勻的數據切割,確保每個請求的入參請求都是唯一的(可共用的參數不用切割)。
其實,在參數化數據准備階段,就應該考慮到這個問題,數據的可用性、唯一性以及數量級。
四、服務啟動
壓測機到位,服務授權配置好了,腳本也寫好了,網絡也沒問題,那么如何在NGUI模式(即linux環境)下啟動呢?
1、以服務形式啟動agent機
網上很多其他博客都寫着利用命令 ./jmeter-server 啟動壓測服務,但這樣有個缺點,只要服務連接中斷,這個壓測服務就不可用了。
但是以后台服務的形式啟動agent機器的jemter-server,就不用擔心服務不可用的問題,命令為 nohup sh jmeter-server & ,示意如下:
PS:注意,輸入如上命令后,需要回車兩次,然后通過命令,即可查看服務是否啟動成功。
2、壓測啟動的2種方式
①、指定壓測機啟動,命令: ./jmeter -n -t /path/test.jmx -R 127.0.0.1,127.0.0.2
②、啟動所有壓測機,命令: ./jmeter -n -t /path/test.jmx -r ,示意如下:
3、更多命令
分布式壓測判定環境:
在性能測試過程中,如果要求並發數較大時(例如1000+),單機配置cpu與內存等無法支持,則需要使用Jmeter的分布式測試方法。
一、一般什么情況下需要分布式
1.前輩經驗:比如機器i5雙核的cpu,8g的內存。壓測一個簡單的接口,可以支持500+的並發。(但是如果壓測方案邏輯復雜,比如在jmeter里面加了很多控制器,監聽器,這些都是很耗機器性能,這時候可能連100並發都壓不上去)
2. 壓測過程中如果Jmeter未響應,卡住,反應慢,隨即啟動任務管理器,如果cup和內存特別大時,則說明單機扛不住了,則要使用分布式了
3. 隨着並發的增大,tps不會增長,即出現瓶頸(排除服務器瓶頸及其他),可能是本測試機扛不住了。則要分布式。
二、Jmeter分布式測試原理(原理摘抄前輩,感謝)
1、Jmeter分布式測試時,選擇其中一台作為調度機(master),其它機器做為執行機(slave)。
2、執行時,master會把腳本發送到每台slave上,slave 拿到腳本后就開始執行,slave執行時不需要啟動GUI,我理解它應該是通過命令行模式執行的。(如果引用到csv等外部的文件,則每台slaver所在的機器都需要相應位置放置該文件。)
3、執行完成后,slave會把結果回傳給master,master會收集所有slave的信息並匯總。