一、jmeter為什么要做分布式壓測
jmeter本身的局限性
- 一台壓力機的 Jmeter 支持的線程數受限於 Jmeter 其本身的機制和硬件配置(內存、CPU等)是有限的
- 由於 Jmeter 是 Java 應用,對 CPU 和內存的消耗較大,在需要模擬大量並發用戶數時,單機很容易出現 JAVA 內存溢出的錯誤,導致測試腳本本身就有瓶頸
JVM 堆內存的局限性
Java 應用的 jvm 堆內存 heap 受壓力機硬件限制,雖然我們可以調整堆內存大小
cmd 啟用 Jmeter GUI 時,也會有提示
increase Java Heap to meet your test requirements: Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
翻譯:增加 Java 堆內存來滿足測試的要求
但是單機無法支撐數以萬計大並發,此時,需要多個壓力機進行分布式壓力測試,這樣性能瓶頸就不會是我們的壓力機了
聯想場景
- 測試 1000 線程並發的場景,但單機只能支持 200 並發無法達到1000
- 通過分布式(5 台機器起)可以模擬 1000 並發
分布式壓測
Jmeter 支持分布式壓測,將需要模擬的大量並發用戶數分發到多台壓力機,使 Jmeter 擁有更大的負載量,滿足真實業務場景(高並發場景)
分布式的最終目的
- 確保壓力機不會出現性能瓶頸
- 在后面進行性能分析時,不需要考慮壓力機是否會導致性能瓶頸的主要原因之一
二、分布式原理
把上面的動圖完整看完,就懂了,原理如下:
- Cnotroller 是控制機,Slaves 是多個壓力機
- 分布式測試中,Cnotroller 通過命令行將測試腳本分發給所有 Slave
- Slave 不需要啟動 Jmeter GUI,通過 CLI 模式執行測試
- Slave 執行完后,會把結果回傳給 Master
- Master 收集所有 Slave 的結果並匯總成一個結果集
注意
- 壓力機也可以叫:負載機、代理機、執行機、肉雞....各種各樣的名字,但他們都是 Slave
- Master 也可以執行測試腳本,也可以不執行只負責管理
三、分布式壓測的前提條件已經配置
注意事項
1、保持Contorller和Slave機器的JDK、jmeter以及插件等配置版本一致; 2、如果測試數據有用到CSV或者其他方式進行參數化,需要將data在每台Slave上復制一份,且讀取路徑必須保持一致; 3、確保Contorller和Salve機器在同一個子網里面; 4、檢查防火牆是否被關閉,端口是否被占用(防火牆會影響腳本執行和測試結構收集,端口占用會導致Slave機報錯); 5、分布式測試中,通過遠程啟動代理服務器,默認查看結果樹中的響應數據為空,只有錯誤信息會被報回; 6、如果並發較高,建議將Contorller機設置為只啟動測試腳本和收集匯總測試結果,在配置文件里去掉Contorller機的IP;
1、修改Contorller配置
打開Contorller機下jmeter安裝文件下的bin目錄:jmeter.properties文件,搜索remote_hosts=127.0.0.1,將Slave機的IP和端口寫在后面,比如:
remote_hosts=127.0.0.1:1099,172.16.6.90:1099,172.16.6.91:1099
其中172.16.6.90和172.16.6.90為Slave機的IP,每個Agent機之間用英文半角逗號隔開,修改保存。注意默認端口都為1099
切記不論從主機器都要修改:server.rmi.ssl.disable=true,並且去掉#,否則會報錯誤
-
首先安裝好jdk和jmeter環境,具體見我的上一篇文章。然后打開配置文件 /bin/jmeter.properties 找到並取消這段配置的注釋 server.rmi.ssl.disable=false ,false改成true。
# Password of Trust store #server.rmi.ssl.truststore.password=changeit # # Set this if you don't want to use SSL for RMI server.rmi.ssl.disable=true # 改成true
-
輸入命令:jmeter-server -Djava.rmi.server.hostname=172.16.2.114 ,啟動 anget 節點。jmeter-server 后面的參數指定 agent 的 IP
3、啟動jemter
啟動jmeter后,設置線程組、配置元件、取樣器、監聽器等原件,點擊“運行-遠程啟動”:
可以選擇遠程啟動一個Slave機,或者選擇遠程全部啟動,即可進行分布式測試了。