Jmeter之分布式測(cè)試
2017年10月27日 15:20:57
由于(1)Jmeter 是純java 應(yīng)用疾宏,對(duì)于CPU和內(nèi)存的消耗比較大,并且受到JVM的一些限制;?
??一般情況下,依據(jù)機(jī)器配置骄蝇,單機(jī)的發(fā)壓量為300~600,因此操骡,當(dāng)需要模擬數(shù)以千計(jì)的并發(fā)用戶時(shí)九火,使用單臺(tái)機(jī)器模擬所有的并發(fā)用戶就容易卡死赚窃,引起JAVA內(nèi)存溢出錯(cuò)誤;(在1.4GHz~3GHz的CPU岔激、1GB內(nèi)存的JMeter客戶端上勒极,可以處理線程100~300。但是WebService例外虑鼎。XML處理是CPU運(yùn)算密集的辱匿,會(huì)迅速消耗掉所有的CPU。一般來(lái)說(shuō)炫彩,以XML技術(shù)為核心的應(yīng)用系統(tǒng)匾七,其性能將是普通Web應(yīng)用的10%~25%。)
(2)單臺(tái)機(jī)器模擬的時(shí)候江兢,如果并發(fā)數(shù)量較多且發(fā)送的網(wǎng)絡(luò)包較大時(shí)昨忆,單機(jī)的網(wǎng)絡(luò)帶寬就會(huì)成為測(cè)試瓶頸,無(wú)法真正模擬高并發(fā)杉允,導(dǎo)致測(cè)試結(jié)果失真(例如在要一秒內(nèi)發(fā)送3000個(gè)請(qǐng)求邑贴,合計(jì)512kb,但是測(cè)試電腦只有256的上傳帶寬叔磷,那么實(shí)際測(cè)試的時(shí)候只是模擬了在一秒內(nèi)發(fā)送1500個(gè)請(qǐng)求(256kb)的場(chǎng)景拢驾,導(dǎo)致測(cè)試結(jié)果失真。下載帶寬的影響也是類(lèi)似的)改基;即:如果所有負(fù)載由一臺(tái)機(jī)器產(chǎn)生繁疤,網(wǎng)卡和交換機(jī)端口都可能產(chǎn)生瓶頸,所以一個(gè)JMeter客戶端線程數(shù)不應(yīng)超過(guò)100寥裂。
(以上是測(cè)試機(jī)器的分析;應(yīng)該還有別的案疲,如硬盤(pán)等)
(3)真正的業(yè)務(wù)場(chǎng)景并發(fā)封恰,我覺(jué)得應(yīng)該是用戶數(shù)大,每個(gè)用戶的請(qǐng)求數(shù)小褐啡。如:更可能是1000個(gè)用戶在2秒內(nèi)各發(fā)起2個(gè)請(qǐng)求诺舔,而不是200個(gè)用戶在2秒內(nèi)各發(fā)起10個(gè)請(qǐng)求,雖然總的請(qǐng)求數(shù)都是2000個(gè)备畦。
? 為避免以上問(wèn)題低飒,更合理地進(jìn)行性能測(cè)試,我們可以使用Jmeter提供的分布式測(cè)試功能懂盐。
Jmeter分布式執(zhí)行原理:
1褥赊、Jmeter分布式測(cè)試時(shí),選擇其中一臺(tái)作為調(diào)度機(jī)(master/Controller)莉恼,其它機(jī)器做為執(zhí)行機(jī)(slave/Agent)拌喉。
2速那、執(zhí)行時(shí),master會(huì)把腳本發(fā)送到每臺(tái)slave上尿背,slave 拿到腳本后就開(kāi)始執(zhí)行端仰,slave執(zhí)行時(shí)不需要啟動(dòng)GUI,應(yīng)該是通過(guò)命令行模式執(zhí)行的田藐。
3荔烧、執(zhí)行完成后,slave會(huì)把結(jié)果回傳給master汽久,master會(huì)收集所有slave的信息并匯總鹤竭。
如下圖所示:
???????????????此圖取自http://www.cnblogs.com/fengpingfan/p/5583954.html
注意:
(1)每一臺(tái)jmeter遠(yuǎn)程服務(wù)器(slave機(jī)器)都執(zhí)行相同的測(cè)試計(jì)劃,jmeter不會(huì)在執(zhí)行期間做負(fù)載均衡回窘,每一臺(tái)服務(wù)器都會(huì)完整地運(yùn)行測(cè)試計(jì)劃诺擅;
(2)采用JMeter遠(yuǎn)程模式并不會(huì)比獨(dú)立運(yùn)行相同數(shù)目的非GUI?測(cè)試更耗費(fèi)資源。但是啡直,如果使用大量的JMeter?遠(yuǎn)程服務(wù)器烁涌,可能會(huì)導(dǎo)致客戶端過(guò)載,或者網(wǎng)絡(luò)連接發(fā)生擁塞酒觅;
(3)默認(rèn)情況下撮执,master機(jī)器是不執(zhí)行參與生成并發(fā)數(shù)據(jù)的;
(4)調(diào)度機(jī)(master)和執(zhí)行機(jī)(slave)最好分開(kāi)舷丹,由于master需要發(fā)送信息給slave并且會(huì)接收slave回傳回來(lái)的測(cè)試數(shù)據(jù)抒钱,所以mater自身會(huì)有消耗,所以建議單獨(dú)用一臺(tái)機(jī)器作為mater颜凯。
分布式測(cè)試操作步驟:
1谋币、準(zhǔn)備多個(gè)測(cè)試電腦(m1、s1症概、s2蕾额、s3, master彼城、slave)诅蝶,并都安裝1.7以上版本jdk,配置環(huán)境變量募壕;
2调炬、將m1使用的Jmeter打包發(fā)到c1、c2舱馅、c3電腦缰泡,并于在相同路徑下安裝。這樣就保證了Jmeter版本一致代嗤,額外下載安裝的插件一致匀谣。如果要用到csv作為數(shù)據(jù)源照棋,那么強(qiáng)烈建議將csv文件放到bin\examples等文件夾下,這樣在slave機(jī)上才能正確讀取-因?yàn)榘惭b路徑一致所以csv路徑也就一致了武翎;
3烈炭、設(shè)置并啟動(dòng)slave機(jī)器
(1)分別在s1、s2宝恶、s3(slave機(jī)器)上符隙,進(jìn)入%JMETER HOME%/bin/目錄,
打開(kāi)“jmeter.properties”垫毙,配置執(zhí)行機(jī)遠(yuǎn)程啟動(dòng)端口(默認(rèn)為 1099)霹疫,
如改為:
server_port=1029
server.rmi.localport=1029
(2)運(yùn)行JMeter-server.bat(windows系統(tǒng))/jmeter-server.sh (linux)來(lái)啟動(dòng)slave機(jī)器的Jmeter,正常啟動(dòng)后會(huì)彈出命令行窗口综芥,提示"created remote object"丽蝎;
注:我這被坑了,如上截圖(我沒(méi)有改端口膀藐,使用默認(rèn)的)屠阻,ip后面有一個(gè)冒號(hào),跟著一串?dāng)?shù)字61470额各,我開(kāi)始以為有這么奇怪的端口號(hào)国觉,把這個(gè)配到master機(jī)中,發(fā)現(xiàn)啟動(dòng)不了虾啦,所以slave機(jī)器的端口號(hào)要在“jmeter.properties”中查看麻诀、配置;
4傲醉、配置蝇闭、啟動(dòng)master機(jī)器
(1)在m1(master機(jī)器)的%JMETER HOME%/bin/目錄,找到 JMeter.properties 這個(gè)文件硬毕,使用notepad++或記事本等工具打開(kāi)呻引。
(2)在打開(kāi)的文件中查找“remote_hosts”,你會(huì)找到“remote_hosts=127.0.0.1”昭殉。
127.0.0.1指本機(jī)苞七,表示本機(jī)也可作為JMeter Agent運(yùn)行的機(jī)器藐守。
??這里需要將slave機(jī)器的IP及端口號(hào)以追加的形式填入挪丢,使用逗號(hào)分隔,末尾不用加標(biāo)點(diǎn)符號(hào)卢厂,如“remote_hosts=192.168.88.180:1099,192.168.88.218:1099”乾蓬;
其中的 1099 為 JMeter 的 Controller 和 Agent 之間進(jìn)行通訊的默認(rèn) RMI 端口號(hào);
? ?(引申閱讀:從JMeter 2.3.1開(kāi)始慎恒,JMeter遠(yuǎn)程服務(wù)器會(huì)自己?jiǎn)?dòng)RMI注冊(cè)任内;用戶沒(méi)有必要單獨(dú)啟動(dòng)RMI注冊(cè)撵渡。假設(shè)測(cè)試人員一定要單獨(dú)啟動(dòng)RMI注冊(cè),可以在遠(yuǎn)程節(jié)點(diǎn)上定義JMeter屬性server.rmi.create=false死嗦。
???默認(rèn)情況下趋距,JMeter遠(yuǎn)程服務(wù)器的RMI使用動(dòng)態(tài)端口號(hào)。這樣就會(huì)為防火墻配置帶來(lái)麻煩越除,因此JMeter 2.3.2及其以后的版本节腐,會(huì)檢查JMeter屬性server.rmi.localport。如果該值非零摘盆,JMeter遠(yuǎn)程服務(wù)器就會(huì)用它來(lái)作為本地端口號(hào)翼雀。)
(3)保存文件,然后運(yùn)行m1上Jmeter.bat孩擂,啟動(dòng)gui界面狼渊,并進(jìn)入 Run -> Remote Start 菜單項(xiàng),在這里可以看到遠(yuǎn)程啟動(dòng)菜單下面有剛剛添加的兩個(gè)slave機(jī)器的ip地址
在這里类垦,我們可分別啟動(dòng)點(diǎn)擊ip地址啟動(dòng)對(duì)應(yīng)的slave機(jī)器狈邑,也可以直接選擇“遠(yuǎn)程全部啟動(dòng)”來(lái)將所有的slave啟動(dòng)。
(4)有時(shí)候用作slave的機(jī)器太少护锤,仍不能滿足需要官地,則需要將作為master的電腦也當(dāng)作slave,則同樣需要修改 JMeter.properties文件烙懦,將master的IP驱入、端口寫(xiě)入。
類(lèi)似其他slave機(jī)器氯析,需要先啟動(dòng)機(jī)器的jmeter-server.bat亏较,然后再打開(kāi)JMeter.bat,進(jìn)入Run -> Remote Start菜單掩缓,可以看到master機(jī)器也作為遠(yuǎn)程機(jī)器了雪情。
5、驗(yàn)證分布式測(cè)試是否成功
為了便于驗(yàn)證你辣,我先設(shè)置一個(gè)線程巡通,發(fā)送一個(gè)請(qǐng)求;
(1)我只啟動(dòng)一臺(tái)192.168.88.180這臺(tái)slave機(jī)舍哄,
察看結(jié)果樹(shù)宴凉,可知,只發(fā)送了一次請(qǐng)求表悬,且master機(jī)器沒(méi)有收集通過(guò)了斷言的請(qǐng)求弥锄;
在slave機(jī)器的控制臺(tái)也輸出了被調(diào)用命令
(2)我啟動(dòng)所有slave機(jī)器(我這里設(shè)置了兩臺(tái)),
察看結(jié)果樹(shù)可知,兩臺(tái)slave機(jī)器都各發(fā)送了一次請(qǐng)求籽暇,并且master機(jī)器收集沒(méi)有通過(guò)了斷言的請(qǐng)求響應(yīng)信息温治;
請(qǐng)求數(shù)計(jì)算
總樣本數(shù) = 線程數(shù) * 循環(huán)次數(shù) * 執(zhí)行機(jī)總數(shù)
樣本計(jì)數(shù)邏輯:由 JMeter分布式執(zhí)行原理可知,執(zhí)行機(jī)(Slave)執(zhí)行的測(cè)試腳本是由調(diào)度機(jī)(master)分發(fā)的戒悠,故每臺(tái)執(zhí)行機(jī)執(zhí)行的測(cè)試腳本都是相同的熬荆,故而性能測(cè)試總樣本數(shù) = 測(cè)試腳本樣本數(shù) * 執(zhí)行機(jī)總數(shù)。
為更好的模擬性能并發(fā)場(chǎng)景绸狐,還需要設(shè)置集合點(diǎn)惶看。后面再寫(xiě)對(duì)應(yīng)的blog。
常見(jiàn)問(wèn)題及解決
1六孵、在連接時(shí)報(bào):connection refused to host:10.10.90.69 nested exception is...錯(cuò)誤纬黎,
可能原因:jmeter安裝文件放到有中文字符的目錄路徑下,導(dǎo)致啟動(dòng)JMeter-server.bat時(shí)報(bào)錯(cuò)劫窒;
解決辦法:把jmeter安裝文件放到其他沒(méi)有中文字符的路徑下本今。
2、agent機(jī)器在發(fā)送請(qǐng)求時(shí)拿不到CSV文件中的值主巍。
答:Jmeter主機(jī)能夠傳遞測(cè)試腳本給Agent機(jī)器冠息,但是不能夠傳遞CSV文件的內(nèi)容,也就是說(shuō)CSV文件需要在每臺(tái)agent機(jī)器上對(duì)應(yīng)目錄拷貝一份孕索」浼瑁可參考我前面提到的做法;
3搞旭、例如我們要求性能是并發(fā)數(shù)1200散怖,然后我們有兩臺(tái)slave,那我們寫(xiě)性能測(cè)試腳本的時(shí)候肄渗,是把并發(fā)數(shù)寫(xiě)成600镇眷,然后把腳本復(fù)制到每一臺(tái)Agent設(shè)備?還是寫(xiě)一個(gè)并發(fā)數(shù)1200的腳本翎嫡,在Controller上運(yùn)行即可欠动,Controller會(huì)自動(dòng)分配性能壓力?抑或者寫(xiě)一個(gè)并發(fā)數(shù)為600在Controller端運(yùn)行惑申,同樣配置下發(fā)到每個(gè)Agent上呢具伍?
答:master會(huì)給每個(gè)slave發(fā)送同一份jmx,所以每一個(gè)slave都運(yùn)行相同并發(fā)數(shù)圈驼,只要保證總和是我們的性能需求即可人芽。
4、怎么查看端口是否被占用碗脊?被占用怎么處理啼肩?
答:
(1)查看1099端口:
netstat -ano | findstr "1099"
tasklist | findstr "1099"
(2)打開(kāi)“jmeter.properties”,配置執(zhí)行機(jī)遠(yuǎn)程啟動(dòng)端口(默認(rèn)為 1099)衙伶,
如改為:
server_port=1029
server.rmi.localport=1029
5祈坠、在Controller端上控制某臺(tái)機(jī)器Run,提示"Bad call to remote host"矢劲。
解決方法:檢查slave機(jī)器上的jmeter-server有沒(méi)有啟動(dòng)赦拘,
檢查master機(jī)器上的JMeter.properties中remote_hosts的配置是否有錯(cuò)誤。
6芬沉、Agent機(jī)器啟動(dòng)Jmeter_server.bat時(shí)躺同,后臺(tái)提示:"could not find ApacheJmeter_core.jar"
解決方法:確定在Agent機(jī)器安裝jdk,并設(shè)置環(huán)境變量
7丸逸、無(wú)法連接slave機(jī)器蹋艺,
可能原因:slave機(jī)器開(kāi)啟了防火墻,網(wǎng)絡(luò)不通等黄刚;
解決辦法:關(guān)掉防火墻捎谨;
檢查slave服務(wù)器和被測(cè)試服務(wù)器之間是否可以ping通;
8憔维、slave機(jī)器執(zhí)行腳本的時(shí)候涛救,若斷言執(zhí)行成功則不返回請(qǐng)求響應(yīng)數(shù)據(jù)及詳細(xì)斷言信息。
9业扒、master機(jī)器上收不到slave機(jī)器連接過(guò)來(lái)的信息检吆。
方案:檢查slave服務(wù)器的hostname和/etc/hosts中服務(wù)器對(duì)應(yīng)的名字是否相同,就是ip程储、端口配對(duì)了沒(méi)
10蹭沛、csv文件最好設(shè)置相對(duì)路徑,不要設(shè)置絕對(duì)路徑以免出現(xiàn)問(wèn)題章鲤。
參考:http://jmeter.apache.org/usermanual/remote-test.html
http://www.cnblogs.com/puresoul/p/4844539.html
http://www.cnblogs.com/fengpingfan/p/5583954.html
http://www.51testing.com/html/15/175815-132407.html
http://zlfwmm.blog.51cto.com/5892198/1762598
http://chenmg.blog.51cto.com/3039876/1730456
http://m.blog.csdn.net/article/details?id=42063231
http://m.blog.csdn.net/article/details?id=42004959
本文出自 “ydhome” 博客致板,http://ydhome.blog.51cto.com/8948432/1862841