Jmeter之分佈式測試

由於

(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的信息並彙總。

如下圖所示:

wKioL1gFzy7BQLKVAAB_A3-0kLE290.png

               此圖取自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";

wKiom1gF0LCBBCuBAABuubkxT9g472.png

注:我這被坑了,如上截圖(我沒有改端口,使用默認的),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 端口號;


wKioL1gF1x2QyF2LAABYMAzgAnM705.png

   (引申閱讀:從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地址

wKiom1gF2C7STdzqAAB-vVuZerg567.png


在這裏,我們可分別啓動點擊ip地址啓動對應的slave機器,也可以直接選擇“遠程全部啓動”來將所有的slave啓動。



(4)有時候用作slave的機器太少,仍不能滿足需要,則需要將作爲master的電腦也當作slave,則同樣需要修改 JMeter.properties文件,將master的IP、端口寫入。

類似其他slave機器,需要先啓動機器的jmeter-server.bat,然後再打開JMeter.bat,進入Run -> Remote Start菜單,可以看到master機器也作爲遠程機器了。


5、驗證分佈式測試是否成功

爲了便於驗證,我先設置一個線程,發送一個請求;

wKioL1gF3R2wm59pAABvG90iNCo402.png


(1)我只啓動一臺192.168.88.180這臺slave機,

察看結果樹,可知,只發送了一次請求,且master機器沒有收集通過了斷言的請求;

wKiom1gF3x_xPKx8AACPqPF0Smw763.png


在slave機器的控制檯也輸出了被調用命令

wKiom1gF352yiUogAACPTswvPqY847.png


(2)我啓動所有slave機器(我這裏設置了兩臺),

察看結果樹可知,兩臺slave機器都各發送了一次請求,並且master機器收集沒有通過了斷言的請求響應信息;

wKioL1gF4PPzTXVHAACrBTtpwA8314.png


請求數計算

總樣本數 = 線程數 * 循環次數 * 執行機總數


樣本計數邏輯:由 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章