Jmeter 是java 應(yīng)用,對(duì)于CPU和內(nèi)存的消耗比較大,使用單臺(tái)機(jī)器模擬以千計(jì)的并發(fā)用戶就有些力不從心,甚至?xí)餔AVA內(nèi)存溢出錯(cuò)誤。
為了讓jmeter工具提供更大的負(fù)載能力,jmeter短小精悍一有了使用多臺(tái)機(jī)器同時(shí)產(chǎn)生負(fù)載的機(jī)制。
那么,是如何實(shí)現(xiàn)多臺(tái)負(fù)載機(jī)同時(shí)運(yùn)行的呢?當(dāng)然不會(huì)多個(gè)人坐在多臺(tái)負(fù)載機(jī)面前,一喊開始,大家同時(shí)啟動(dòng)jmeter。這種方式很笨,也很難達(dá)到真正的同步。其實(shí),我們通過(guò)單個(gè)jmeter 客戶端就可以控制多個(gè)遠(yuǎn)程的jmeter服務(wù)器,使它們同步的對(duì)服務(wù)器進(jìn)行壓力測(cè)試。
通過(guò)遠(yuǎn)程運(yùn)行jmeter,測(cè)試人員可以跨越多臺(tái)低端計(jì)算機(jī)復(fù)制測(cè)試,這樣就可以模擬一個(gè)比較大的服務(wù)器壓力,一個(gè)jmeter客戶端實(shí)例,理論上可以控制任意多的遠(yuǎn)程jmeter實(shí)例,并通過(guò)他們收集測(cè)試數(shù)據(jù)。這樣一樣,就有了如下特性:
- 保存測(cè)試采樣數(shù)據(jù)到本地機(jī)器
- 通過(guò)單臺(tái)機(jī)器管理多個(gè)jmeter執(zhí)行引擎。
- 沒(méi)有必要將測(cè)試計(jì)劃復(fù)制到每一臺(tái)機(jī)器,jmeter GUI客戶端會(huì)將它發(fā)往每一臺(tái)jmeter服務(wù)器。
- 每一臺(tái)jmeter遠(yuǎn)程服務(wù)器都執(zhí)行相同的測(cè)試計(jì)劃,jmeter不會(huì)在執(zhí)行期間做負(fù)載均衡,每一臺(tái)服務(wù)器都會(huì)完整地運(yùn)行測(cè)試計(jì)劃。
在1.4G Hz~3GHz 的CPU 、1GB 內(nèi)存的 JMeter 客戶端上,可以處理線程 100~300。但是Web Service 例外。XML處理是 CPU 運(yùn)算密集的,會(huì)迅速消耗掉所有的CPU 。一般來(lái)說(shuō),以XML技術(shù)為核心的應(yīng)用系統(tǒng),其性能將是普通Web 應(yīng)用的 10%~25% 。另外,如果所有負(fù)載由一臺(tái)機(jī)器產(chǎn)生,網(wǎng)卡和交換機(jī)端口都可能產(chǎn)生瓶頸,所以一個(gè)JMeter 客戶端線程數(shù)不應(yīng)超過(guò) 100 。
采用JMeter 遠(yuǎn)程模式并不會(huì)比獨(dú)立運(yùn)行相同數(shù)目的非GUI 測(cè)試更耗費(fèi)資源。但是,如果使用大量的JMeter 遠(yuǎn)程服務(wù)器,可能會(huì)導(dǎo)致客戶端過(guò)載,或者網(wǎng)絡(luò)連接發(fā)生擁塞。
使用多臺(tái)機(jī)器產(chǎn)生負(fù)載的操作步驟如下:
(1)在所有期望運(yùn)行jmeter作為 負(fù)載生成器的機(jī)器上安裝jmeter, 并確定其中一臺(tái)機(jī)器作為 controller ,其他的的機(jī)器作為agent 。
(2) 運(yùn)行所有 agent 機(jī)器上的jmeter-server 文件(假定使用兩臺(tái)機(jī)器192.168.9.99 和192.168.9.130 作為agent)
(3)在controller機(jī)器的jmeter的bin目錄下,找到j(luò)meter.properties 文件,編輯該文件:
查找:remote_hosts=127.0.0.1修改為:remote_hosts=192.168.9.99:1099,192.168.9.130:1099
這里要特別注意端口后,有些資料說(shuō)明端口1644為jmeter的controller 和agent 之間進(jìn)行通信的默認(rèn)RMI端口號(hào),但是在測(cè)試時(shí)發(fā)現(xiàn),設(shè)置為1644運(yùn)行不成功,改成1099后運(yùn)行通過(guò)。另外還要留意agent的機(jī)子是否開啟了防火墻等。
(4)啟動(dòng)controller 機(jī)子上的jmeter應(yīng)用jmeter.bat,選擇菜單“運(yùn)行/run”--->“遠(yuǎn)程啟動(dòng)/remote start”,來(lái)分別啟動(dòng)agent ,
也可以直接選擇“遠(yuǎn)程全部啟動(dòng)”來(lái)將所有的agent啟動(dòng)。
遇到的常見問(wèn)題:
1、在Controller端上控制某臺(tái)機(jī)器Run,提示"Bad call to remote host"。
解決方法:檢查被控制機(jī)器上的jmeter-server有沒(méi)有啟動(dòng),或者JMeter.properties中remote_hosts的配置錯(cuò)誤。
2、Agent機(jī)器啟動(dòng)Jmeter_server.bat時(shí),后臺(tái)提示:"could not find ApacheJmeter_core.jar"解決方法:確定在Agent機(jī)器安裝jdk,并設(shè)置環(huán)境變量
3、遠(yuǎn)程啟動(dòng)時(shí),報(bào)錯(cuò):

ERROR - jmeter.gui.action.RemoteStart: Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: java.net.ConnectException: Connection refused: connectat sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)at sun.rmi.server.UnicastRef.newCall(Unknown Source)at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)at java.rmi.Naming.lookup(Unknown Source)at org.apache.jmeter.engine.ClientJMeterEngine.getEngine(ClientJMeterEngine.java:54)at org.apache.jmeter.engine.ClientJMeterEngine.<init>(ClientJMeterEngine.java:67)at org.apache.jmeter.gui.action.RemoteStart.doRemoteInit(RemoteStart.java:180)at org.apache.jmeter.gui.action.RemoteStart.doAction(RemoteStart.java:80)at org.apache.jmeter.gui.action.ActionRouter.performAction(ActionRouter.java:81)
這個(gè)問(wèn)題終于被我解決了,其實(shí)原因好簡(jiǎn)單呀。只要將本機(jī)的jmter-server.bat執(zhí)行即可。要是在jmeter.properties配置的地方寫了127.0.0.1 的話 就要開本機(jī)的 jmeter-sever.bat. 不寫的話 就不用開了
4、查看1099端口是否被占用
netstat -ano | findstr "1099"tasklist | findstr "1099"
其它說(shuō)明:
1、調(diào)度機(jī)(master)和執(zhí)行機(jī)(slave)最好分開,由于master需要發(fā)送信息給slave并且會(huì)接收slave回傳回來(lái)的測(cè)試數(shù)據(jù),所以mater自身會(huì)有消耗,所以建議單獨(dú)用一臺(tái)機(jī)器作為mater。
2、參數(shù)文件:如果使用csv進(jìn)行參數(shù)化,那么需要把參數(shù)文件在每臺(tái)slave上拷一份且路徑需要設(shè)置成一樣的。
3、每臺(tái)機(jī)器上安裝的Jmeter版本和插件最好都一致,否則會(huì)出一些意外的問(wèn)題。