寫在前面
平時在使用Jmeter做壓力測試的過程中,由于單機的并發能力有限,所以常常無法滿足壓力測試的需求。因此,Jmeter還提供了分布式的解決方案。本文是一次利用Jmeter分布式對業務系統登錄接口做的壓力測試的實踐記錄。按照慣例,在正式開始前,先簡單介紹一下本文大綱:
- Jmeter集合點用法
- Jmeter命令行參數詳解
- Jmeter分布式部署方案
- Jmeter分布式調度原理
- Jmeter分布式部署過程
- Jmeter分布式壓測業務系統登錄接口實踐
一、Jmeter集合點用法
集合點是使用Jmeter進行壓力測試中一個繞不開的話題。
集合點通俗地理解就是,例如要模擬100個并發用戶,集合點會將這100個線程集結完畢后,統一釋放,同時對系統進行施壓。Jmeter中可以通過同步定時器 Synchronizing Timer 來完成:
同步定時器中”模擬用戶組的數量“與線程組的線程數量的關系:
1.當模擬用戶組的數量 = 線程組的線程數量
例如數量都是5,那么運行測試,Jmeter會等到5個用戶同時準備好后,并發發起請求;
2.當模擬用戶組的數量 < 線程組的線程數量
① 未設置超時時間
例如:模擬用戶為5,線程數量為8,那么在運行Jmeter后,Jmeter會先同時發起5個請求,剩下3個用戶不足集合點的數量5,由于又沒有設置超時時間,因此達不到集合點的數量要求,Jmeter就會一直處于等待狀態;
② 已設置超時時間
例如:模擬用戶為5,線程數量為8,超時時間設置為3000(以毫秒為單位,即3秒)
那么在運行Jmeter后,Jmeter會先同時發起5個請求,由于剩下3個用戶不足集合點要求的數量5,因此會超時等待3秒鐘,在3秒鐘后再同時發起剩下的3個用戶的請求,共8個用戶;
3.當模擬用戶組的數量 > 線程組的線程數量
① 未設置超時時間
例如:模擬用戶為8,線程數量為5,超時時間為0
由于設置的模擬用戶數量為8,即集合點數量為8,而線程組的總用戶數只有5,因此達不到集合點數量要求,且又沒有設置超時時間,所以Jmeter會一直處于等待狀態,不會發起任何請求,如下圖所示:
② 已設置超時時間
例如:模擬用戶為5,線程數量為8,超時時間設置為3000(以毫秒為單位,即3秒)
由于設置的模擬用戶數量為8,即集合點數量為8,而線程組的總用戶數只有5,因此達不到集合點數量要求,但是設置了超時時間為3秒,所以Jmeter會在3秒后,同時發起5個(用戶)請求,如下圖所示:
二、Jmeter命令行參數詳解
參數 | 作用 |
---|---|
-n | 表示在命令行模式下運行 JMeter |
-t | 指定腳本文件 |
-R | 指定從節點(agent)執行測試,多個ip用逗號隔開 |
-r | 表示啟動全部agent |
-f | 表示每次都會清空前一次的執行結果,寫入新的結果 |
-l | 生成測試結果文件,默認以 jtl 結尾 |
-e | 生成測試報告 |
-o | 指定生成測告的位置,必須為空 |
-g | 指定已存在的jtl結尾的測試文件生成報告 |
常見用法:
./jmeter.bat -n -t test.jmx # 以命令行方式運行test.jmx腳本./jmeter.bar -n -t test.jmx -l test.jtl # 以命令行方式運行test.jmx腳本,并生成測試結果文件test.jtl./jmeter.bar -n -t test.jmx -f -l test.jtl -e -o report # 以命令行方式運行test.jmx腳本,每次生成結果前先清空test.jtl,同時在report目錄下生成測試報告./jmeter.bar -n -t test.jmx -l test.jtl -R 192.168.1.122 # 指定遠程主機192.168.1.122執行測試
三、Jmeter分布式部署方案
主機 | IP地址 |
---|---|
Master主節點(Windows) | 192.168.1.131 |
Slave從節點-1(Linux) | 192.168.1.121 |
Slave從節點-2(Linux) | 192.168.1.122 |
Slave從節點-3(Linux) | 192.168.1.123 |
注意事項:
- 主節點及各個從節點機器必須提前安裝好Java環境;
- 主節點及各個從節點的Jmeter版本保持統一;
- master會在發送測試計劃時將jmx的腳本文件發送到各個從節點,因此,腳本文件不用手動上傳到各個從節點;
- 但是master不會將外部文件一起發送,所以在測試中用到的CSV等參數化文件,需要把CSV等文件手動上傳到各個從節點,最好都放置在bin目錄下,Jmeter會直接從bin目錄下開始查找;
四、Jmeter分布式調度原理
1.各節點作用
- 主節點:主要負責管理從節點(負載機)、分配調度任務(腳本分發)、收集測試結果
- 從節點:執行測試任務,模擬并發請求
2.工作流程
① 主節點負責將測試任務、測試腳本下發給各個從節點;
② 從節點接收到測試任務后,開始驅動各自環境上的Jmeter執行測試任務、模擬并發請求;
③ 從節點執行完成后會將測試結果回傳給主節點;
④ 最后主節點將各個從節點的收集回來的測試結果進行展示;
五、Jmeter分布式部署過程
1.主節點部署
① 編輯主節點jmeter.properties配置文件
- 第268行,remote_hosts添加從節點主機地址,多個從節點用逗號隔開(注意:不同版本可能存在差異)
- 第272行,為主節點端口號,如有端口占用,可手動修改
- 第345行,server.rmi.ssl.disable由false改為true(關閉ssl)
② 主節點啟動jmeter-server服務
Windows環境下直接點擊運行Jmeter的bin目錄下的jmeter-server.bat即可,啟動成功會出現如下提示:
2.從節點部署
① 將Jmeter壓縮包上傳到各個從節點并解壓
從節點均為Linux環境,解壓命令為:
-
unzip apache-jmeter.zip
② 修改jmeter.properties配置文件
- 第345行,server.rmi.ssl.disable由false改為true(關閉ssl)
③ 啟動jmeter-server服務
-
chmod -R +x bin # jmeter-server、jmeter文件都需要執行權限,可以簡單粗暴使用chmod -R參數賦予整個bin目錄執行權限
-
./jmeter-server # 啟動jmeter-server服務
啟動成功會出現如下提示:
3.測試主節點與從節點的連通性
可以通過Jmeter工具-運行-遠程啟動,選擇一個從節點;也可以使用命令行-R參數指定一個從節點運行:
如下圖所示,Starting...表示主節點已將任務下發到指定的從節點,從節點開始執行測試任務
4.Jmeter分布式部署常見問題及報錯解決
1)啟動遠程主機,提示“Engine is busy - please try later”
原因:本地或者遠程負載機,未正常關閉
解決:殺掉進程重新啟動(可以觀察主節點及從節點的jmeter-server日志,如果只有Starting,沒有Finished,那么大概率是這臺機器出現了問題)
2)主節點發起測試后未接收到結果數據
如:執行成功后,察看結果樹無數據,主節點及從節點也沒有任何報錯
原因:測試腳本中有參數化,遠程節點上參數化csv文件跟本地測試中設置的目錄不一致,或從節點上缺少csv文件
解決:將csv文件分別上傳一份到各個從節點,csv文件最好設置相對路徑,不要設置絕對路徑,將csv文件存放在bin目錄下
3)Jmeter啟動從節點運行測試報錯“connection refused”
原因:從節點未啟動jmeter-server服務
解決:各個從節點均啟動jmeter-server服務
六、Jmeter壓測業務系統登錄接口實踐
- 最大并發量:和我們業務系統負責人交流后,得知系統理論上支持6000~7000個左右的用戶同時并發登錄是沒有問題的;
- 測試的目標:測試出業務系統是否如他提供的數據、支持那么大的用戶并發登錄;
- 實測數據:3臺負載機,每臺啟動500個線程,共1500個用戶并發,測試結果如下,各個負載機模擬的用戶均登錄正常、無報錯,被測業務系統所在服務器內存、CPU均無大的波動;
- 升壓:并發用戶數量1500、2100左右,系統響應都比較穩定,當并發用戶量達到每臺1000,一共3000個用戶同時請求時,部分用戶登錄會返回500,總體失敗率在3%左右(預測當并發用戶數達到更大規模4000、5000、6000,失敗的比例還會增大)
小結
- 以上就是利用Jmeter實現分布式壓測的一次實踐,確切的說應該是初探;
- 在壓力測試過程中,CPU和內存的動態變化我并沒有做詳細的監控,后續準備借助JMeter+InfluxDB+Grafana的監控組合來可視化監控測試過程;
- 性能測試是一個龐大的工程和命題,性能測試工具僅僅是實現性能測試的技術手段,會使用性能測試工具不代表就掌握了性能測試;
- 所有使用性能測試工具的目的都只是為了模擬壓力的發起,在性能測試過程中,工具僅僅起到腳本開發、場景實現、測試執行等作用,而性能測試還包括需求獲取、場景設計、結果分析和調優等諸多環節,最終還是要靠人來實現;
- 尤其是性能瓶頸分析和調優,除了依賴性能測試結果外,還需要依賴于人的強大的性能測試功底,以及對業務、對系統架構的了解;
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
?
這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!