Jmeter的集群模式可以讓我們將多臺(tái)機(jī)器聯(lián)合起來(lái)一起產(chǎn)生負(fù)載,從而彌補(bǔ)單臺(tái)機(jī)器負(fù)載生成能力不足的問(wèn)題精绎。
假設(shè)我們的測(cè)試計(jì)劃會(huì)產(chǎn)生100個(gè)threads歪泳,我們使用6臺(tái)機(jī)器進(jìn)行分布式測(cè)試的時(shí)候锉屈,一共會(huì)產(chǎn)生100 * 6 = 600的負(fù)載。
日常情況办龄,大部分的性能需求烘绽,單臺(tái)壓測(cè)機(jī)就可以抗住的。4C8G的window server機(jī)器俐填,使用UI方式安接,最高壓測(cè)過(guò)2000并發(fā)(RT 20ms以?xún)?nèi)),單機(jī)沒(méi)什么問(wèn)題(當(dāng)然如果IO很高的話玷禽,注意壓測(cè)機(jī)網(wǎng)卡可能會(huì)先出現(xiàn)瓶頸赫段。)超過(guò)2000并發(fā),可使用分布式矢赁。
一糯笙、注意事項(xiàng)
1、關(guān)閉防火墻撩银,開(kāi)放端口
2给涕、所有機(jī)器最好都在同一個(gè)子網(wǎng)上。
選擇和被測(cè)目標(biāo)服務(wù)同網(wǎng)段的機(jī)器作為壓測(cè)機(jī),很多人都是直接在辦公環(huán)境的自己機(jī)器上壓測(cè)够庙,這種壓測(cè)很不穩(wěn)定恭应,時(shí)好時(shí)壞,如果你們沒(méi)有做流量隔離耘眨,說(shuō)不定你會(huì)把你們的辦公環(huán)境壓垮昼榛!
3、一定要用內(nèi)網(wǎng)IP剔难,不要用公網(wǎng)IP胆屿,用ping去檢查。
4偶宫、確保所有系統(tǒng)上使用相同版本的jdk和jmeter非迹,包括大版本和小版本。
可使用下面的命令纯趋,遠(yuǎn)程拷貝憎兽,確保所有機(jī)器的軟件包相同
遠(yuǎn)程拷貝命令(內(nèi)網(wǎng)地址):
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
二吵冒、專(zhuān)業(yè)名稱(chēng)
master:司令
slave:奴隸
target:目標(biāo)
Jmeter分布式壓測(cè)原理
1纯命、總控機(jī)器的節(jié)點(diǎn)master,其他產(chǎn)生壓力的機(jī)器叫“肉雞” server
2痹栖、master會(huì)把壓測(cè)腳本發(fā)送到 server上面
3扎附、執(zhí)行的時(shí)候,server上只需要把jmeter-server打開(kāi)就可以了结耀,不用啟動(dòng)jmeter
4、結(jié)束后匙铡,server會(huì)把壓測(cè)數(shù)據(jù)回傳給master,然后master匯總輸出報(bào)告
三图甜、壓測(cè)步驟
1、在master和slaves機(jī)器上分別按照相同版本的jdk和jmeter
2鳖眼、在master機(jī)器上
1)修改配置文件黑毅,進(jìn)入jmeter/bin目錄下
vim jmeter.properties
remote_hosts=192.168.0.102:8899,192.168.0.101:8899(slaves機(jī)器的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)啟動(dòng)jmeter服務(wù)
./jmeter-server(linux)
jmeter-server.bat(windows)
3)檢查是否啟動(dòng)成功
ps -ef|grep jmeter-server
3、在slaves機(jī)器上
1)修改配置文件钦讳,進(jìn)入jmeter/bin目錄下
vim jmeter.properties
remote_hosts=127.0.0.1server_port=8899
server.rmi.ssl.disable=true(禁用ssl)
2)啟動(dòng)jmeter服務(wù)
./jmeter-server(linux)
jmeter-server.bat(windows)
3)檢查是否啟動(dòng)成功
ps -ef|grep jmeter-server
4矿瘦、分布式執(zhí)行
GUI模式 :運(yùn)行——》遠(yuǎn)程啟動(dòng)、遠(yuǎn)程啟動(dòng)全部
non-GUO模式:命令行增加-r參數(shù)
jmeter -n -t /Users/jack/Desktop/remote.jmx -r -l /Users/jack/Desktop/jtl/result.jtl -e -o /Users/jack/Desktop/result
四愿卒、常見(jiàn)問(wèn)題
安裝常見(jiàn)問(wèn)題
1缚去、問(wèn)題:java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
[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 命令獲取機(jī)器名稱(chēng),追加一個(gè)映射 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易结、問(wèn)題:rmi_keystore.jks (No such file or directory)
[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的有效密鑰庫(kù),或者禁用了SSL。
jmeter.property里面 server.rmi.ssl.disable 改為 true搞动,表示禁用
3躏精、問(wèn)題:Cannot start. userCenter is a loopback address.
[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.
解決:
執(zhí)行時(shí)加上參數(shù):
./jmeter-server -Djava.rmi.server.hostname=10.1.1.222
-D表示傳入的是system.properties
4、問(wèn)題:There is insufficient memory for the Java Runtime?
[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"}"
改變初始堆內(nèi)存和最大堆內(nèi)存鹦肿,最大不超過(guò)PC的50%內(nèi)存矗烛。
5、僅修改 server_port 即可,下面兩者一樣
server.rmi.localport=8899 表示slave server啟動(dòng)顯示的端口
server_port=8899 表示master機(jī)器要遠(yuǎn)程連接的端口箩溃,即 remote_hosts=xxxx:8899
6瞭吃、要在多網(wǎng)卡的服務(wù)器上開(kāi)啟RMI服務(wù)的話必須指定IP,使他們能夠在同一個(gè)網(wǎng)段內(nèi)碾篡。
需要以下幾步(假定所有機(jī)器都在10.120.11.*網(wǎng)段,agent服務(wù)器為linux, controller服務(wù)器為windows):
1) 修改agent服務(wù)器虱而,指定agent機(jī)器的IP
修改jmeter-server文件
# vi jmeter-server
修改RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(需要連接的IP)
2)修改server服務(wù)器,指定server機(jī)器的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機(jī)器上安裝jdk,版本和jmeter一致牡拇,配置環(huán)境變量:Java_home等
在Agent機(jī)器上安裝jdk,配置環(huán)境變量:Java_home和JMeter_home
安裝目錄不要帶空格穆律,最好都是簡(jiǎn)短的英文路徑
8惠呼、master機(jī)器啟動(dòng)后會(huì)拷貝jmx文件到slave機(jī)器,所以不需要在每臺(tái)slave機(jī)器上也上傳一份jmx峦耘,只需要在master機(jī)器上上傳一份jmx腳本即可剔蹋。
如果使用csv進(jìn)行參數(shù)化,則需要把參數(shù)文件在每臺(tái)slave上拷一份且路徑需要設(shè)置成一樣的辅髓。
總樣本數(shù) = 線程數(shù) * 循環(huán)次數(shù) * 執(zhí)行機(jī)總數(shù)
9泣崩、連接失敗原因排查
以下步驟進(jìn)行排查:
1. jmeter-server是否啟動(dòng);
2. 是否聯(lián)網(wǎng)
3. ping 服務(wù)器IP是否暢通.
4. telnet 端口 192.168.3.10 1099
5. 檢查服務(wù)器的防火墻是否關(guān)閉洛口。
6. 阿里云安全策略是否正常
10矫付、"could not find ApacheJmeter_core.jar"
解決:在Agent機(jī)器安裝jdk,并設(shè)置環(huán)境變量
11第焰、”Bad call to remote host"
解決:檢查被控制機(jī)器上的jmeter-server有沒(méi)有啟動(dòng)买优,或者remote_hosts的配置是否正確。