Jmeter的集群模式可以讓我們將多台機器聯合起來一起產生負載,從而彌補單台機器負載生成能力不足的問題。
假設我們的測試計划會產生100個threads,我們使用6台機器進行分布式測試的時候,一共會產生100 * 6 = 600的負載。
日常情況,大部分的性能需求,單台壓測機就可以抗住的。4C8G的window server機器,使用UI方式,最高壓測過2000並發(RT 20ms以內),單機沒什么問題(當然如果IO很高的話,注意壓測機網卡可能會先出現瓶頸。)
超過2000並發,可使用分布式。
一、注意事項
1、關閉防火牆,開放端口
2、所有機器最好都在同一個子網上。
選擇和被測目標服務同網段的機器作為壓測機,很多人都是直接在辦公環境的自己機器上壓測,這種壓測很不穩定,時好時壞,如果你們沒有做流量隔離,說不定你會把你們的辦公環境壓垮!
3、一定要用內網IP,不要用公網IP,用ping去檢查。
4、確保所有系統上使用相同版本的jdk和jmeter,包括大版本和小版本。
可使用下面的命令,遠程拷貝,確保所有機器的軟件包相同
遠程拷貝命令(內網地址):
scp -r /usr/local/software/jdk-8u141-linux-x64.tar.gz root@172.18.230.233:/usr/local/software
scp -r /usr/local/software/jmeter/apache-jmeter-4.0.tgz root@172.18.230.233:/usr/local/software/jmeter
5、禁用SSL
vim jmeter.properties
server.rmi.ssl.disable=true
二、專業名稱
master:司令
slave:奴隸
target:目標
Jmeter分布式壓測原理
1、總控機器的節點master,其他產生壓力的機器叫“肉雞” server
2、master會把壓測腳本發送到 server上面
3、執行的時候,server上只需要把jmeter-server打開就可以了,不用啟動jmeter
4、結束后,server會把壓測數據回傳給master,然后master匯總輸出報告
三、壓測步驟
1、在master和slaves機器上分別按照相同版本的jdk和jmeter
2、在master機器上
1)修改配置文件,進入jmeter/bin目錄下
vim jmeter.properties
remote_hosts=192.168.0.102:8899,192.168.0.101:8899(slaves機器的ip和端口) server.rmi.ssl.disable=true(禁用ssl)
如果master即作為master也作為slaves
remote_hosts=192.168.0.102:8899,192.168.0.101:8899,master的ip:8899 server_port=8899 server.rmi.ssl.disable=true(禁用ssl)
2)啟動jmeter服務
./jmeter-server(linux)
jmeter-server.bat(windows)
3)檢查是否啟動成功
ps -ef|grep jmeter-server
3、在slaves機器上
1)修改配置文件,進入jmeter/bin目錄下
vim jmeter.properties
remote_hosts=127.0.0.1
server_port=8899 server.rmi.ssl.disable=true(禁用ssl)
2)啟動jmeter服務
./jmeter-server(linux)
jmeter-server.bat(windows)
3)檢查是否啟動成功
ps -ef|grep jmeter-server
4、分布式執行
GUI模式 :運行——》遠程啟動、遠程啟動全部
non-GUO模式:命令行增加-r參數
jmeter -n -t /Users/jack/Desktop/remote.jmx -r -l /Users/jack/Desktop/jtl/result.jtl -e -o /Users/jack/Desktop/result
四、常見問題
安裝常見問題
1、問題
[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
vim /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的映射
2、問題
[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)
解決:
擁有RMI over SSL的有效密鑰庫,或者禁用了SSL。
1、禁用SSL
jmeter.property里面 server.rmi.ssl.disable 改為 true,表示禁用
3、問題:
[root@userCenter bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[127.0.0.1:39687](local),objID:[-18db419a:167773db861:-7fff, -176377700206527642]]]
Server failed to start: java.rmi.RemoteException: Cannot start. userCenter is a loopback address.
An error occurred: Cannot start. userCenter is a loopback address.
解決:
執行時加上參數./jmeter-server -Djava.rmi.server.hostname=10.1.1.222
4、問題:
[root@iZ949uw2xehZ bin]# ./jmeter
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/jmeter/apache-jmeter-4.0/bin/hs_err_pid5855.log
解決:
編輯jmeter
搜索 : "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
改變初始堆內存和最大堆內存
5、僅修改 server_port 即可,下面兩者一樣
server.rmi.localport=8899 表示slave server啟動顯示的端口
server_port=8899 表示master機器要遠程連接的端口 即 remote_hosts=xxxx:8899
6、<!-- jmeter 分布式性能測試(多網卡配置) -->
我們要在多網卡的服務器上開啟RMI服務的話必須指定IP,使他們能夠在同一個網段內。
需要以下幾步(假定所有機器都在10.120.11.*網段,agent服務器為linux,controller服務器為windows):
1) 修改agent服務器,指定agent機器的IP
修改jmeter-server文件
# vi jmeter-server
修改RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(需要連接的IP)
2)修改server服務器,指定server機器的IP
修改jmeter.bat文件
新增set rmi_host=-Djava.rmi.server.hostname=10.120.11.214
修改set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%
7、確定在controller機器上安裝jdk,版本和jmeter一致,配置環境變量:Java_home等
在Agent機器上安裝jdk,配置環境變量:Java_home和JMeter_home
安裝目錄不要帶空格,最好都是簡短的英文路徑
8、master機器啟動后會拷貝jmx文件到slave機器,所以不需要在每台slave機器上也上傳一份jmx,只需要在master機器上上傳一份jmx腳本即可。
如果使用csv進行參數化,則需要把參數文件在每台slave上拷一份且路徑需要設置成一樣的。
總樣本數 = 線程數 * 循環次數 * 執行機總數
9、連接失敗原因排查
以下步驟進行排查:
1. jmeter-server是否啟動;
2. 是否聯網
3. ping 服務器IP是否暢通.
4. telnet 端口 192.168.3.10 1099
5. 檢查服務器的防火牆是否關閉。
6. 阿里雲安全策略是否正常
10、"could not find ApacheJmeter_core.jar"
解決:在Agent機器安裝jdk,並設置環境變量
11、”Bad call to remote host"
解決:檢查被控制機器上的jmeter-server有沒有啟動,或者remote_hosts的配置是否正確。