說明
jmeter 分布式壓測:將需要模擬的大量并發(fā)用戶數(shù)分發(fā)到多臺壓力機兄墅,使 jmeter 擁有更大的負載量左腔,滿足真實業(yè)務場景(高并發(fā)場景)。 一臺壓力機(用來跑腳本的電腦)的 jmeter 默認最大支持 1000 左右的并發(fā)用戶數(shù)(線程數(shù))吼驶,再大的話董虱,容易造成卡頓、無響應等情況获讳,這是受限于 jmeter 其本身的機制和硬件配置(內存阴颖、CPU等); 由于 jmeter 是 java 應用赔嚎,對 CPU 和內存的消耗較大膘盖,在需要模擬大量并發(fā)用戶數(shù)時,單機很容易出現(xiàn) java 內存溢出尤误,導致測試腳本本身就有瓶頸侠畔。 場景: 測試 5000 并發(fā)的場景,如果只用一臺電腦跑壓測腳本损晤,無法達到 5000 并發(fā)(因為單機只能支持1000并發(fā))软棺。此時就需要通過分布式模擬5000并發(fā)(5臺機器起)。 通過一個 Jmeter 控制臺來遠程控制多個 Jmeter 引擎完成測試尤勋。
Apache Jmeter 官網地址:https://jmeter.apache.org/
Apache Jmeter 下載地址:https://jmeter.apache.org/download_jmeter.cgi
Apache Jmeter 分布式壓測官方文檔:https://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html
Apache Jmeter 插件庫:https://jmeter-plugins.org/
原理
jmeter 分布式原理:由控制機發(fā)壓測腳本到每臺遠程執(zhí)行機(壓力機)喘落,然后由控制機收集執(zhí)行機結果。 注意:控制機主要用于控制整個壓測機器集群并收集執(zhí)行數(shù)據(jù)最冰,匯總結果瘦棋。控制機也可以當做壓力機暖哨。 壓力機系統(tǒng)類型無限制:win赌朋、mac、linux 都可以篇裁。
Jmeter 分布式壓測架構圖
本文采用一臺控制機沛慢,三臺壓力機進行實驗。
壓測環(huán)境搭建
集群環(huán)境
四臺機器的相關配置如下表达布。
機器 | 環(huán)境 | IP 地址 | 端口(server_port) |
---|---|---|---|
控制機 | Windows 10 | 192.168.56.1 | 10950 |
壓力機01 | CentOS 8 | 192.168.56.21 | 10955 |
壓力機02 | CentOS 8 | 192.168.56.22 | 10955 |
壓力機03 | CentOS 8 | 192.168.56.23 | 10955 |
軟件環(huán)境
JDK:Java 8(理論上团甲,大版本一致即可) Apache Jmeter:5.5 將 Apache Jmeter 上傳到壓力機上,并解壓到 /usr/local/jmeter 目錄中黍聂。
[root@localhost tmp]# mkdir /usr/local/jmeter
[root@localhost tmp]# unzip apache-jmeter-5.5.zip -d /usr/local/jmeter/

目標服務
創(chuàng)建一個 web 服務作為壓測的目標服務躺苦。
編寫服務
此處采用 nodejs 編寫一個簡單的服務身腻。 創(chuàng)建 web-api.js 文件,內部代碼如下:
var http = require('http');
var times = 0;
const server = http.createServer(function (req, res) {
res.end("HelloWorld - " + Date.now());
console.log("請求來自" + req.connection.remoteAddress + "圾另,當前請求次數(shù): " + times++);
})
server.listen(12345);
console.log('Server running at port: 12345 ...');
啟動服務
需要安裝 node 環(huán)境霸株。 進入該文件所在目錄,執(zhí)行下面的命令集乔,啟動服務。
node web-api.js

服務啟動成功后坡椒,會監(jiān)聽 12345 端口扰路。 使用瀏覽器,訪問服務所在主機的該端口倔叼,就可以請求服務了汗唱。 該服務所在主機 IP 為:192.168.56.1,因此可以請求:http://192.168.56.1:12345丈攒。

訪問成功哩罪,結果圖上圖所示。

此處訪問兩次的原因是巡验,瀏覽器默認會請求一次 favicon.ico际插。

Apache Jmeter 配置
壓力機配置(以壓力機01為例)
壓力機主要是 Linux 系統(tǒng)。
hostname
確保 hostname 不是 localhost.localdomain显设。 查看 hostname
[root@localhost bin]# hostname
localhost.localdomain

修改 hostname 為 machine01框弛,重啟計算機生效。
hostnamectl set-hostname machine01
修改 /etc/hosts捕捂,將 machine01 指向本機的 IP 地址瑟枫,該地址不能是回環(huán)地址(127.0.0.1)。
vim /etc/hosts

jmeter.properties
修改服務監(jiān)聽的端口指攒,關閉 SSL 認證慷妙。
server_port=10955
server.rmi.ssl.disable=true

其他的壓力機配置方法與當前機器的配置類似,具體參數(shù)根據(jù)實際情況配置允悦。
系統(tǒng)參數(shù)調整
linux系統(tǒng)參數(shù)優(yōu)化膝擂。linux默認最大連接數(shù)1024,在壓測過程中經常會出現(xiàn)連接數(shù)不足導致的異常澡屡,需要先調整系統(tǒng)參數(shù)再做測試猿挚。 修改 /etc/sysctl.conf 配置文件
vm.max_map_count=655360
vm.swappiness=1
fs.file-max=655356000
fs.nr_open=104857600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
讓 sysctl 配置生效
sysctl -p
修改 /etc/security/limits.conf
root soft nofile 1048576
root hard nofile 67108864
root soft nproc 102400
root hard nproc 655360
* soft memlock unlimited
* hard memlock unlimited
啟動壓力機服務
在 jmeter 安裝目錄中的 bin 目錄下,啟動 jmeter-server 服務驶鹉。
[root@machine01 bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.56.21:32971](local),objID:[-3568d989:184ef374e05:-7fff, 7836004259729148648]]]

控制機配置
控制機為 Windows 系統(tǒng)绩蜻。
jmeter.properties
配置控制機的遠程控制地址和端口,關閉 SSL 認證室埋。
remote_hosts=192.168.56.21:10955,192.168.56.22:10955,192.168.56.23:10955
server_port=10950
server.rmi.ssl.disable=true

壓力測試
啟動控制機 jmeter 界面
在控制機的 jmeter 目錄下的 bin 目錄中办绝,啟動 jmeter 應用程序伊约。
jmeter.bat
jmeter 啟動后,界面如下圖所示孕蝉。

添加一個壓測計劃屡律,使用 10 個線程(用戶),發(fā)送 HTTP 請求降淮。

定義 HTTP 采樣器超埋,并配置要訪問的服務器地址,端口等信息佳鳖。

再添加結果樹霍殴、聚合報告,用于查看壓測結果系吩。
檢查壓力機服務是否運行正常
點擊控制機上面菜單中的 Run来庭,選擇 Remote Start,分別測試每一臺壓力機是否運行正常穿挨。 在這個過程中月弛,可以先將線程組配置小一點。

分別測試各個壓力機科盛,在目標服務器控制臺上帽衙,看到下面的結果,表示壓力機運行正常土涝。

啟動分布式壓測
jmeter 的運行方式有兩種模式:GUI 模式佛寿、CLI 模式。因此分布式壓測有就有兩種方式但壮。
GUI 模式
啟動控制機的 jmeter 的安裝目錄下的 bin 目錄中的 jmeter.bat冀泻,啟動 jmeter 界面。 此時蜡饵,可以修改好線程組的數(shù)量弹渔,在控制機中配置的線程數(shù)以及運行次數(shù)等信息,會分發(fā)給所有的壓測機執(zhí)行溯祸,即:每臺壓測機都會執(zhí)行該配置下的壓測肢专。 配置好線程組信息后,啟動所有壓力機焦辅。 點擊控制機上面菜單中的 Run博杖,選擇 Remote Start All,即同時啟動所有壓力機筷登。

遠程壓力機接收指令并執(zhí)行成功的話剃根,會看到 Starting ... 和 Finished ... 兩行信息。
[root@machine01 bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.56.21:32971](local),objID:[-3568d989:184ef374e05:-7fff, 7836004259729148648]]]
Starting the test on host 192.168.56.21:10955 @ December 8, 2022 8:52:42 AM CST (1670460762930)
Finished the test on host 192.168.56.21:10955 @ December 8, 2022 8:52:44 AM CST (1670460764297)
在壓測的過程中前方,可以在聚合報告中狈醉,看到壓測的結果廉油。 此處配置的線程組中的線程數(shù)是 10,循環(huán)一次苗傅,共有 3 臺壓力機抒线,因此采樣數(shù)量就是 10*3=30,總共執(zhí)行了 30 次請求渣慕。

分布式壓測完成嘶炭。
CLI 模式
控制機進入 jmeter 的安裝目錄下的 bin 目錄中,打開控制臺摇庙。
# 執(zhí)行壓測腳本,-r 表示啟動所有壓力機旱物;-R:IP:PORT 啟動指定壓力機
jmeter -n -t ${jmx_file_path} -r -l ${jtl_result_path}
# 生成報告
jmeter -g ${jtl_result_path} -e -o ${output_dir_path}
說明
{jtl_result_path}:jtl 結果存儲位置卫袒;
${output_dir_path}:測試報告的結果保存目錄;
案例
# 指定壓力機執(zhí)行壓測腳本
jmeter -n -t /home/test/test.jmx -R 192.168.56.21:10955,192.168.56.22:10955 -l /home/test/test_result.jtl
# 創(chuàng)建目錄
mkdir -p /home/test/results
# 生成報告
jmeter -g /home/test/test_result.jtl -e -o /home/test/results
常見問題
在進行分布式壓測的過程中单匣,可能會遇到一些問題夕凝。
loopback address 問題
[root@localhost bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[127.0.0.1:46787](local),objID:[-4b9cf262:184ed155baf:-7fff, -7793164881645611591]]]
Server failed to start: java.rmi.RemoteException: Cannot start. localhost.localdomain is a loopback address.
An error occurred: Cannot start. localhost.localdomain is a loopback address.

解決方法
方法一
修改 hostname,讓主機名指向本機非回環(huán)地址户秤。 例如:壓力機01 的 IP 地址為 192.168.56.21码秉,修改 hostname 為 machine01,重啟計算機生效鸡号。
hostnamectl set-hostname machine01
修改 /etc/hosts转砖,將 machine01 指向本機的 IP 地址,該地址不能是回環(huán)地址(127.0.0.1)鲸伴。
vim /etc/hosts

方法二
帶本地IP參數(shù)啟動 jmeter-server
# windows
jmeter-server.bat -Djava.rmi.server.hostname=192.168.56.21
# Linux
./jmeter-server -Djava.rmi.server.hostname=192.168.56.21
方法三
修改 jmeter-server府蔗,固定壓力機的 RMI_HOST_DEF。
RMI_HOST_DEF=-Djava.rmi.server.hostname=192.168.56.21
然后啟動 jmeter-server 服務汞窗。
SSLHandshakeException
error during JRMP connection establishment; nested exception is:
javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
解決方法
修改 jmeter.properties姓赤,關閉 SSL 認證。
server.rmi.ssl.disable=true
RegCreateKeyEx(...)
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
解決方法
使用管理員權限啟動 jmeter-server.bat仲吏。
rmi_keystore.jdk

解決方法
出現(xiàn)該問題的原因是不铆,壓力機需要控制機提供認證文件。
方法一
修改 jmeter.properties 配置文件裹唆,關閉 SSL 認證誓斥。
server.rmi.ssl.disable=true
方法二
啟動 create-rmi-keystore.bat,生成一個認證文件许帐。


將該文件分發(fā)到所有壓力機的 jmeter 安裝目錄中的 bin 目錄下劳坑。 重啟壓力機 jmeter-server 服務。
機器之間 PING 不通
所有的機器最好在同一個局域網舞吭,關閉防火墻泡垃。 windows 關閉防火墻析珊。

Linux 關閉防火墻
systemctl stop firewalld
遠程服務執(zhí)行腳本后,響應數(shù)據(jù)為空
jmeter 客戶端默認是統(tǒng)計模式蔑穴,不顯示響應數(shù)據(jù)忠寻,減少開銷。 如果想要查看響應數(shù)據(jù)存和,修改 jmeter.properties 配置文件奕剃。
mode=Standard