為什么需要分布式?
在工作中經常需要對一些關鍵接口做高QPS的壓測,JMeter是由Java 語言開發,沒創建一個線程(虛擬用戶),JVM默認會為每個線程分配1M的堆棧內存空間。受限于單臺試壓機的配置很難實現太高的并發。所以,通過JMeter實現分布式,可以整合多臺主機的硬件資源,實現同時對被測試接口進行壓力測試。
Jmeter分布式測試環境中有兩個角色:Master 和 Slaves
Master節點:向參與的Slaves節點發送測試腳本,并聚合Agent節點的執行結果。
Slaves節點:接收并執行Master節點發送過來的測試腳本,并將執行結果返回給Master。
為什么要使用docker?
如果要分布式聯動每臺主機,就要求每臺主機都要有JMeter環境(JDK + JMeter),如果利用docker就可以通過docker管理 JMeter環境,簡單的拉取鏡像,啟動容器即可。
更進一步講,利用k8s、云服務可以無限的擴容JMeter試壓機,理論上多少的并發用戶都可以模擬。
準備工作
JDK:啟動 JMeter 工具需要
$ brew install openjdk@11
JMeter: 編寫JMeter腳本
https://archive.apache.org/dist/jmeter/binaries/
編寫一個簡單的腳本。
docker: 通過doker創建容器。
$ docker pull runcare/jmeter-master
$ docker pull runcare/jmeter-slave
查看docker鏡像
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
runcare/jmeter-master latest e052a8cd8680 3 years ago 326MB
runcare/jmeter-slave latest 05c7ba96d97d 3 years ago 326MB
請記住 jmeter-master 的鏡像ID e052a8cd8680,后面會用到。
分布式壓測使用
啟動 slave 節點。
假設有兩臺主機,可以啟動兩個slave。
$ docker run -it -d --name slave01 runcare/jmeter-slave
$ docker run -it -d --name slave02 runcare/jmeter-slave
查看啟動的容器
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b270636a7741 runcare/jmeter-slave "/bin/sh -c 'jmeter-…" 43 seconds ago Up 42 seconds 1099/tcp, 60001/tcp slave01
2584c7fef5f8 runcare/jmeter-slave "/bin/sh -c 'jmeter-…" 52 seconds ago Up 50 seconds 1099/tcp, 60001/tcp slave02
查看兩個slave 的IP 地址
$ docker inspect -f '{{ .Name }} => {{ .NetworkSettings.IPAddress }}' $(docker ps -q)/slave01 => 172.17.0.3
/slave02 => 172.17.0.2
/k8s_nginx_nginx-deployment1-fc7586d97-jvjvk_nginx_4379ed7f-b0be-4f9f-a0a9-4a5fd7b45b38_1 =>
/k8s_nginx_nginx-deployment1-fc7586d97-bztbh_nginx_6968e6b1-6689-4f1a-a9ea-04532577841c_1 =>
發送壓測腳本到 slave
$ result=`date +"%Y%m%d%H%M%S"` && docker run --rm -v /Users/fnngj/zhpro/script:/data e052a8cd8680 jmeter -n -t /data/baidu_script.jmx -l /data/$result.jtl -j /data/$result.log -e -o /data/$result -R 172.17.0.2,172.17.0.3
參數說明
result=date +“%Y%m%d%H%M%S”`: 指定測試結果的名稱,以當前日期時間命名。
/Users/fnngj/zhpro/script : 壓測腳本的目錄,測試結果也會存放到該目錄下。
baidu_script.jmx : 壓測腳本的名稱,存放于 /Users/fnngj/zhpro/script目錄下。
e052a8cd8680 : jmeter-master 的鏡像ID。
172.17.0.2,172.17.0.3 :兩臺 slave 的IP 地址。
測試結果
執行完的目錄
$ pwd
/Users/fnngj/zhpro/script$ ls
20230707005328 20230707005328.jtl 20230707005328.log baidu_script.jmx
查看報告
進入20230707005328 目錄,點擊 index.html 文件,可以看到壓測的結果。
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!?