Jmeter之分布式測試
2017年10月27日 15:20:57
由于(1)Jmeter 是純java 應用,對于CPU和內存的消耗比較大,并且受到JVM的一些限制;?
??一般情況下,依據機器配置,單機的發壓量為300~600,因此,當需要模擬數以千計的并發用戶時,使用單臺機器模擬所有的并發用戶就容易卡死,引起JAVA內存溢出錯誤;(在1.4GHz~3GHz的CPU、1GB內存的JMeter客戶端上,可以處理線程100~300。但是WebService例外。XML處理是CPU運算密集的,會迅速消耗掉所有的CPU。一般來說,以XML技術為核心的應用系統,其性能將是普通Web應用的10%~25%。)
(2)單臺機器模擬的時候,如果并發數量較多且發送的網絡包較大時,單機的網絡帶寬就會成為測試瓶頸,無法真正模擬高并發,導致測試結果失真(例如在要一秒內發送3000個請求,合計512kb,但是測試電腦只有256的上傳帶寬,那么實際測試的時候只是模擬了在一秒內發送1500個請求(256kb)的場景,導致測試結果失真。下載帶寬的影響也是類似的);即:如果所有負載由一臺機器產生,網卡和交換機端口都可能產生瓶頸,所以一個JMeter客戶端線程數不應超過100。
(以上是測試機器的分析;應該還有別的,如硬盤等)
(3)真正的業務場景并發,我覺得應該是用戶數大,每個用戶的請求數小。如:更可能是1000個用戶在2秒內各發起2個請求,而不是200個用戶在2秒內各發起10個請求,雖然總的請求數都是2000個。
? 為避免以上問題,更合理地進行性能測試,我們可以使用Jmeter提供的分布式測試功能。
Jmeter分布式執行原理:
1、Jmeter分布式測試時,選擇其中一臺作為調度機(master/Controller),其它機器做為執行機(slave/Agent)。
2、執行時,master會把腳本發送到每臺slave上,slave 拿到腳本后就開始執行,slave執行時不需要啟動GUI,應該是通過命令行模式執行的。
3、執行完成后,slave會把結果回傳給master,master會收集所有slave的信息并匯總。
如下圖所示:
???????????????此圖取自http://www.cnblogs.com/fengpingfan/p/5583954.html
注意:
(1)每一臺jmeter遠程服務器(slave機器)都執行相同的測試計劃,jmeter不會在執行期間做負載均衡,每一臺服務器都會完整地運行測試計劃;
(2)采用JMeter遠程模式并不會比獨立運行相同數目的非GUI?測試更耗費資源。但是,如果使用大量的JMeter?遠程服務器,可能會導致客戶端過載,或者網絡連接發生擁塞;
(3)默認情況下,master機器是不執行參與生成并發數據的;
(4)調度機(master)和執行機(slave)最好分開,由于master需要發送信息給slave并且會接收slave回傳回來的測試數據,所以mater自身會有消耗,所以建議單獨用一臺機器作為mater。
分布式測試操作步驟:
1、準備多個測試電腦(m1、s1、s2、s3, master、slave),并都安裝1.7以上版本jdk,配置環境變量;
2、將m1使用的Jmeter打包發到c1、c2、c3電腦,并于在相同路徑下安裝。這樣就保證了Jmeter版本一致,額外下載安裝的插件一致。如果要用到csv作為數據源,那么強烈建議將csv文件放到bin\examples等文件夾下,這樣在slave機上才能正確讀取-因為安裝路徑一致所以csv路徑也就一致了;
3、設置并啟動slave機器
(1)分別在s1、s2、s3(slave機器)上,進入%JMETER HOME%/bin/目錄,
打開“jmeter.properties”,配置執行機遠程啟動端口(默認為 1099),
如改為:
server_port=1029
server.rmi.localport=1029
(2)運行JMeter-server.bat(windows系統)/jmeter-server.sh (linux)來啟動slave機器的Jmeter,正常啟動后會彈出命令行窗口,提示"created remote object";
注:我這被坑了,如上截圖(我沒有改端口,使用默認的),ip后面有一個冒號,跟著一串數字61470,我開始以為有這么奇怪的端口號,把這個配到master機中,發現啟動不了,所以slave機器的端口號要在“jmeter.properties”中查看、配置;
4、配置、啟動master機器
(1)在m1(master機器)的%JMETER HOME%/bin/目錄,找到 JMeter.properties 這個文件,使用notepad++或記事本等工具打開。
(2)在打開的文件中查找“remote_hosts”,你會找到“remote_hosts=127.0.0.1”。
127.0.0.1指本機,表示本機也可作為JMeter Agent運行的機器。
??這里需要將slave機器的IP及端口號以追加的形式填入,使用逗號分隔,末尾不用加標點符號,如“remote_hosts=192.168.88.180:1099,192.168.88.218:1099”;
其中的 1099 為 JMeter 的 Controller 和 Agent 之間進行通訊的默認 RMI 端口號;
? ?(引申閱讀:從JMeter 2.3.1開始,JMeter遠程服務器會自己啟動RMI注冊;用戶沒有必要單獨啟動RMI注冊。假設測試人員一定要單獨啟動RMI注冊,可以在遠程節點上定義JMeter屬性server.rmi.create=false。
???默認情況下,JMeter遠程服務器的RMI使用動態端口號。這樣就會為防火墻配置帶來麻煩,因此JMeter 2.3.2及其以后的版本,會檢查JMeter屬性server.rmi.localport。如果該值非零,JMeter遠程服務器就會用它來作為本地端口號。)
(3)保存文件,然后運行m1上Jmeter.bat,啟動gui界面,并進入 Run -> Remote Start 菜單項,在這里可以看到遠程啟動菜單下面有剛剛添加的兩個slave機器的ip地址
在這里,我們可分別啟動點擊ip地址啟動對應的slave機器,也可以直接選擇“遠程全部啟動”來將所有的slave啟動。
(4)有時候用作slave的機器太少,仍不能滿足需要,則需要將作為master的電腦也當作slave,則同樣需要修改 JMeter.properties文件,將master的IP、端口寫入。
類似其他slave機器,需要先啟動機器的jmeter-server.bat,然后再打開JMeter.bat,進入Run -> Remote Start菜單,可以看到master機器也作為遠程機器了。
5、驗證分布式測試是否成功
為了便于驗證,我先設置一個線程,發送一個請求;
(1)我只啟動一臺192.168.88.180這臺slave機,
察看結果樹,可知,只發送了一次請求,且master機器沒有收集通過了斷言的請求;
在slave機器的控制臺也輸出了被調用命令
(2)我啟動所有slave機器(我這里設置了兩臺),
察看結果樹可知,兩臺slave機器都各發送了一次請求,并且master機器收集沒有通過了斷言的請求響應信息;
請求數計算
總樣本數 = 線程數 * 循環次數 * 執行機總數
樣本計數邏輯:由 JMeter分布式執行原理可知,執行機(Slave)執行的測試腳本是由調度機(master)分發的,故每臺執行機執行的測試腳本都是相同的,故而性能測試總樣本數 = 測試腳本樣本數 * 執行機總數。
為更好的模擬性能并發場景,還需要設置集合點。后面再寫對應的blog。
常見問題及解決
1、在連接時報:connection refused to host:10.10.90.69 nested exception is...錯誤,
可能原因:jmeter安裝文件放到有中文字符的目錄路徑下,導致啟動JMeter-server.bat時報錯;
解決辦法:把jmeter安裝文件放到其他沒有中文字符的路徑下。
2、agent機器在發送請求時拿不到CSV文件中的值。
答:Jmeter主機能夠傳遞測試腳本給Agent機器,但是不能夠傳遞CSV文件的內容,也就是說CSV文件需要在每臺agent機器上對應目錄拷貝一份??蓞⒖嘉仪懊嫣岬降淖龇?;
3、例如我們要求性能是并發數1200,然后我們有兩臺slave,那我們寫性能測試腳本的時候,是把并發數寫成600,然后把腳本復制到每一臺Agent設備?還是寫一個并發數1200的腳本,在Controller上運行即可,Controller會自動分配性能壓力?抑或者寫一個并發數為600在Controller端運行,同樣配置下發到每個Agent上呢?
答:master會給每個slave發送同一份jmx,所以每一個slave都運行相同并發數,只要保證總和是我們的性能需求即可。
4、怎么查看端口是否被占用?被占用怎么處理?
答:
(1)查看1099端口:
netstat -ano | findstr "1099"
tasklist | findstr "1099"
(2)打開“jmeter.properties”,配置執行機遠程啟動端口(默認為 1099),
如改為:
server_port=1029
server.rmi.localport=1029
5、在Controller端上控制某臺機器Run,提示"Bad call to remote host"。
解決方法:檢查slave機器上的jmeter-server有沒有啟動,
檢查master機器上的JMeter.properties中remote_hosts的配置是否有錯誤。
6、Agent機器啟動Jmeter_server.bat時,后臺提示:"could not find ApacheJmeter_core.jar"
解決方法:確定在Agent機器安裝jdk,并設置環境變量
7、無法連接slave機器,
可能原因:slave機器開啟了防火墻,網絡不通等;
解決辦法:關掉防火墻;
檢查slave服務器和被測試服務器之間是否可以ping通;
8、slave機器執行腳本的時候,若斷言執行成功則不返回請求響應數據及詳細斷言信息。
9、master機器上收不到slave機器連接過來的信息。
方案:檢查slave服務器的hostname和/etc/hosts中服務器對應的名字是否相同,就是ip、端口配對了沒
10、csv文件最好設置相對路徑,不要設置絕對路徑以免出現問題。
參考: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