項目中使用Jmeter進行大並發壓測時,單機受限內存、CPU、網絡IO,會出現服務器壓力還沒有上
去,但壓測服務器由於模擬的壓力太大死機的情況。JMeter的集群模式可以讓我們將多台機器聯合起來
一起產生負載,從而彌補單台機器負載生成能力不足的問題。
分布式壓測原理
1、控制機為Master,負載機為Slave
2、Master啟動后,會拷貝jmx腳本文件到所有的Slave上
3、Slave會回傳壓測數據給Master,最后由Master匯總出結果文件
注意事項
1、腳本文件上傳到master即可,不用所有的slave都傳一份
2、所有機器最好在同一個網段
3、由於master需要發送信息給slave並接收slave回傳回來的測試數據,自身會有一定的消耗,建議單獨
配置一台機器作為master
4、所有機器的jmeter版本和插件版本要一致
5、如果jmeter版本在4.0以上,需在jmeter.properties中設置 server.rmi.ssl.disable=true
分布式環境配置
Slaves機器配置
編輯所有slave機器jmeter/bin目錄下的jmeter.properties文件,slaves機器上remote_hosts不動,根
據需要修改服務端口。默認端口為1099,可以修改為任意未被占用的端口。我這里默認端口沒有被占用,
就不做修改。
# Remote Hosts - comma delimited remote_hosts=127.0.0.1 #remote_hosts=localhost:1099,localhost:2010 # RMI port to be used by the server (must start rmiregistry with same port) #server_port=1099
Master機器配置
編輯master機器jmeter/bin目錄下的jmeter.properties文件,將所有slave機器的地址配置到文件中,
server_port不用修改。
# Remote Hosts - comma delimited remote_hosts=166.188.20.86,166.188.21.75(slave機器的ip和端口) #remote_hosts=localhost:1099,localhost:2010 # RMI port to be used by the server (must start rmiregistry with same port) #server_port=1099
master機器也可以作為負載機,在remote_hosts中加上127.0.0.1即可,但考慮到自身消耗,這里
不使用。如果修改了負載機的端口號,則需帶上修改后的端口號,我這里使用的默認值,不用再單獨
標注。修改了端口號使用如下配置:
# Remote Hosts - comma delimited remote_hosts=166.188.20.86:2099,166.188.21.75:2099 #remote_hosts=localhost:1099,localhost:2010 # RMI port to be used by the server (must start rmiregistry with same port) server_port=2099
參數化文件配置
參數化文件的路徑要保持一致,我這里配置在jmeter/bin目錄下。注意:所有的slave機器都要上傳一
份參數化文件。
分布式壓測執行
Slave機器執行
在所有的slave機器上執行 ./jmeter-server 命令,出現以下界面為執行成功。
Master機器執行
確認好所有slave機器都正確啟動后,在master機器上執行命令
jmeter -n -t stress0804.jmx -r -l testResult.jtl
命令解析:
- n 非GUI模式運行
- t 要運行的jmx文件
- r 將遠程所有的agent啟動
- l 生成結果文件
執行結果:
腳本中設置了5個線程,有2台負載機,所有Active為5*2=10個,運行時間2分鍾。
常見問題處理
問題一
[test@localhost bin]$ ./jmeter-server Writing log file to: /home/test/jmeter/apache-jmeter-3.1/bin/jmeter-server.log Created remote object: UnicastServerRef [liveRef: [endpoint:[127.0.0.1:37863](local),objID:[-3217392f:17b104e6552:-7fff, 742049333908920389]]] 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.
解決方法:執行命令中指定本地IP ./jmeter-server -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
問題二
[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Created remote object: UnicastServerRef2 [liveRef: [endpoint:[:39308](local),objID:[24e78a63:16243c70661:-7fff, 7492480871343944173]]] Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.; nested exception is: java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known An error occurred: Cannot start. Unable to get local host IP address.; nested exception is: java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
解決方法:使用hostname命令獲取機器名稱,追加一個映射iZwz95j86y235aroi85ht0Z
[root@iZwz95j86y235aroi85ht0Z bin]# vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 120.79.160.143 iZwz95j86y235aroi85ht0Z
windows中修改c:\windows\system32\drivers\etc\hosts文件,增加一條域名與IP的映射
問題三
[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is: java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory) An error occurred: Listen failed on port: 0; nested exception is: java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
解決方法:編輯jmeter.properties文件,將server.rmi.ssl.disable的值改為true
問題四
slave機器無法啟動或者沒有返回執行數據
解決方法:
1、檢查master機器和slave機器能否ping通
2、檢查防火牆
3、檢查master機器和slave機器的服務器時間是否一致