Jmeter(四十七) - 從入門到精通高級篇 - 分布式壓測部署之負載機的設置(詳解教程)


1.簡介

  千呼萬喚始出來,這一篇感覺寫了好久,總想寫的清楚明白簡潔,但是還是洋洋灑灑寫了好多,希望大家喜歡吧!本來打算將這一篇文章是放在性能測試中講解和分享的,但是有的童鞋或者小伙伴們私下問的太多了,實在是忍不了也解答煩了,索性就在這里分享一下吧。權當參考,但是希望對大家有所幫助。

2.為什么要使用分布式測試

(1)Jmeter是基於java程序運行的,在windows上使用Jmeter進行性能測試時,非常耗費客戶機的CPU和內存,如果並發數稍微大一點(比如100、1000...並發),單台電腦的配置經常無法支持,很容易卡死,即使不卡死也會使電腦運行很慢,導致我們沒辦法進行其它操作。
(2)通過cmd命令行,或者是在Linux上使用Jmeter進行性能測試時,能夠大大縮減所需要的系統資源;但是需要將jmeter腳本上傳到Linux上使用命令行方式運行,如果腳本經常改動就要頻繁上傳;測試完成后要把結果數據下載到本地GUI環境中查看,當結果文件較大時,下載要花費大量時間,總是有很多不方便。
(3)按照一般的壓力機配置,jmeter的GUI模式下(Windows),最多支持300左右的模擬請求線程,再大的話,容易造成卡頓、無響應等情況,這是限於jmeter其本身的機制和硬件配置。
(4)有時候為了盡量模擬業務場景,需要模擬大量的並發請求,這個時候單台壓力機就顯得有心無力。針對這個情況,jmeter的解決方案是支持分布式壓測,即將大量的模擬並發分配給多台壓力機,來滿足這種大流量的並發請求場景。

普通壓測:單台機可以對目標機器產生的壓力比較小,受限因素包括CPU,網絡,IO等。
分布式壓測:利用多台機器向目標機器產生壓力,模擬幾萬用戶並發訪問。

3.分布式壓測的原理

1、分布式測試中,選擇一台作為管理機(Contorller),其他的機器作為測試執行的代理機(Agent);

2、執行測試時,由Contorller通過命令行將測試腳本發給Agent,然后Agent執行測試(不需要啟動GUI),同時將測試結果發送給Contorller;

3、測試完成,可以在Contorller上的監聽器里面看到Agent發來的測試結果,結果為多個Agent測試結果匯總而成;

4.開始前的准備工作

本簡短教程說明了如何使用多個系統執行壓力測試。在我們開始之前,有幾件事要檢查。

  • 系統上的防火牆已關閉或打開了正確的端口。
  • 所有客戶端都在同一子網上。
  • 如果使用192.xxx或10.xxx IP地址,則服務器位於同一子網中。如果服務器不使用192.xx或10.xx IP地址,則應該沒有任何問題。
  • 確保JMeter可以訪問服務器。
  • 確保在所有系統上使用相同版本的JMeter和Java。混合版本將無法正常工作。
  • 您已經為RMI設置了SSL或將其禁用。

一旦確定系統已准備就緒,就可以進行遠程測試了。本教程假定您已經在所有系統上安裝了JMeter。JMeter的工作方式是一個控制器節點在多個工作節點上啟動測試。

在本教程中,我們僅使用GUI模式進行演示。在現實生活中,您應該使用CLI模式(NON GUI)來開始負載測試

一個控制器節點和多個工作節點

一個控制器節點和多個工作節點

在深入了解分步說明之前,最好先定義術語並確保定義清楚。

控制器節點:運行JMeter GUI(控制測試)的系統
工作節點:運行 jmeter-server的系統,該系統從GUI接收命令並將請求發送到目標系統
目標:我們計划進行壓力測試的Web服務器

系統類別

5.普通壓測

普通壓測:單台機可以對目標機器產生的壓力比較小,受限因素包括CPU,網絡,IO等。下邊是宏哥簡單用圖形描述了一下普通壓測。如下圖所示:

6.Jmeter分布式壓測介紹

在工作中使用jmeter做大並發壓力測試的場景下,單機受限內存、CPU、網絡IO,會出現服務器壓力還沒有上去,但是壓測服務器已經由於模擬的壓力太大死機了。為了讓jmeter工具提供更強大的負載能力,jmeter提供了多台機器同時產生負載的機制,下面是架構圖。

原理:比如我在jmeter server配置線程數為10,循環次數為100,也就是會對測試服務器發起1000次請求,我有3台agent服務器,如果我在server端選擇遠程啟動壓力測試,那么每台agent都會對測試服務器發起10*100次請求,那么這次壓力測試產生的請求就是10*100*3=3000次。

如果對原理不是很明白,看完下面的操作之后就會理解了。

6.1JMeter分布式執行原理說明

前提:在調度機上安裝JDK(我們這里使用1.8版本的)+Jmeter(5.3)

1、客戶端機器(window系統)作為一個控制器controller,控制多台slave機器的操作。
2、Controller和slave機器上最好裝有相同版本的jdk和jmeter,並配置好環境變量,安裝和配置方法跟windows環境類似。
3、controller通過GUI界面啟動slave機器,將jmeter壓測腳本發送給每台啟動的slave,slave獲得腳本后開始執行。slave本地不需預先存儲腳本,但是需要有腳本中的依賴文件(如csv文件等)。
4、各台slave執行完成后,將結果傳回給controller,controller收集后整合顯示出來。

7.Jmeter分布式壓測環境搭建

7.1搭建前說明

服務器環境說明:做性能測試可以直接在在雲平台按需購買壓力機,一旦測試結束釋放壓力機即可。當然了這是個視公司資源和公司情況而定,如確實需要提前報備和領導申請經費或者設備、時間等等。

分布式環境壓力服務器要求:

  • 需要server(控制機)和agent(壓力機),agent搭建在linux(centos 6.5)服務器環境下,server搭建在windows(server 2012)環境下。
  • 壓力測試瓶頸大都在帶寬上面,需要保證壓力機的帶寬要比服務器的帶寬高,不然壓力上不去。
  • 需要保證agent和server都在一個網絡中,且在多網卡環境需要保證啟動的網卡都在一個網段。
  • 需要保證server和agent之間的時間同步。
  • 關閉防火牆。

7.2windows下配置

1、在Windows系統上安裝相同版本的JDk和Jmeter(參考調度機的安裝)

注意:JDK和Jmeter都要配置環境變量

Jmeter 環境變量的配置:

在系統環境變量中添加:JMETER_HOME=C:\jmeter\apache-jmeter-3.3\bin

在path系統變量中添加如下配置:%JMETER_HOME%\bin;

7.2.1調度機Controller

1.在多台機器中按照上述步驟配置jmeter,選擇其中一台為調度機,其他為執行機。宏哥這里將自己的本地電腦作為調度機。

2.在調度機上修改JMETER_HOME/bin/jmeter.properties, 添加執行機的IP及端口 , 1099是默認的rmi通信端口。

remote_hosts=192.168.174.130:1000,192.168.3.148:1888

代碼中 , 192.168.174.130:1000即是執行機IP和端口號。

3.取消server.rmi.ssl.disable=false的中注釋並將false改為ture,或者你復制一下這一行代碼,將false改為ture,當然了不要忘記去掉前邊的注釋。

server.rmi.ssl.disable=true  

4.開啟執行腳本機器上的server服務,JMETER_HOME/bin/jmeter-server

5.在控制機執行分布式命令

#使用 -r 啟動所有從機執行腳本
jmeter -n -t testplan/comic.jmx -r -l testResult/result1.jtl  

#指定從機IP
jmeter -n -t testplan/comic.jmx -R 10.15.243.53,10.15.230.78 -l testResult/result1.jtl
7.2.2執行機Agent

1、和調度機同樣的原理,找到對應的代碼修改jmeter.properties文件中的代碼,如下:

server_port=1000
server.rmi.localport=1000
server.rmi.ssl.disable=true

2、在執行機上自定義端口號

(1)進入Jmeter的bin目錄,找到Jmeter.properties文件,打開該文件修改如下兩個配置項,比如修改端口號為:1355(默認端口號為:1099)(記得取消注釋)

server_port=1355
server.rmi.localport=1355
server.rmi.ssl.disable=true

(2)啟動執行機上的Jmeter-server.bat,如下圖所示,端口號已經修改為:1000.宏哥這里是修改成1000。

3、在調度機上添加遠程的負載機

進入Jmeter的bin目錄,找到Jmeter.properties文件,進行如下配置:

4、在調度機上打開,Jmeter,如下圖即可啟動遠程的負載機

5、驗證:啟動后如果運行正常,在調度機上可以看到遠端負載機的執行結果,如下圖:

在執行機上有如下顯示:

7.3linux下的配置

1、在Linux下安裝同調度機相同的JDK和Jmeter版本

JDK環境變量的配置參考如下:https://www.cnblogs.com/du-hong/p/14428790.html

Jmeter的環境變量配置,export PATH=/opt/apache-jmeter-3.3/bin/:$PATH(配置文件位置:/etc/profile)如下圖所示:

驗證:Jmeter -v

2、在執行機上自定義端口號

(1)進入Jmeter的bin目錄,找到Jmeter.properties文件,打開該文件修改如下兩個配置項,比如修改端口號為:1355(默認端口號為:1099)

server_port=1355
server.rmi.localport=1099

(2)啟動執行機上的Jmeter-server.bat,命令:./jmeter-server -Djava.rmi.server.hostname=192.168.0.199,如下圖,端口號已經修改為:1099。宏哥的如下圖所示:

3、在調度機上添加遠程的負載機

進入Jmeter的bin目錄,找到Jmeter.properties文件,進行如下配置:

 4、在調度機上打開,Jmeter,如下圖即可啟動遠程的負載機

5、驗證:啟動后如果運行正常,在調度機上可以看到遠端負載機的執行結果,如下圖:

在執行機上有如下顯示:

8.分布壓測(全部啟動)

1、選擇遠程啟動-->遠程全部啟動,如下圖所示:

2、master結果,全部啟動,宏哥配置了2台slave,所以有兩次執行結果:

 3、查看結果樹,查看執行機(兩台兩個結果),如下圖所示:

察看結果樹如圖:

執行機宏哥配置的是一台Linux系統,一台Windows系統,如圖:

9.小結

9.1實戰過程遇到問題

1、Linux下Jmeter-server啟動失敗,如下圖所示:

解決辦法:在啟動Jmeter-server的時候加上如下參數,完成命令如下:

./jmeter-server -Djava.rmi.server.hostname=192.168.0.199

2、Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

在使用java遠程啟動linux服務器上的jmeter服務是報Neither the JAVA_HOME nor the JRE_HOME environment variable is defined,如下圖所示:

 

 解決辦法:查詢該報錯基本都是tomcat操作 , 編輯jmeter/bin/jmeter-server文件,在頂部添加JAVA_HOMEJRE_HOME即可

 

3、調度機報如下錯誤:

 

解決辦法:將執行機上的端口設置為固定端口即可(在之前的部署中已經說明如何自定義端口了,參考上文)

4、啟動Jmeter報錯:Java.net.ConnectionException: Connection refused:connect

 

解決問題:在執行機上重新啟動Jmeter-server服務,或者是你這個服務壓根就沒有啟動(我的測試環境這樣是可以解決的,如果你的環境解決不了,請仔細查看執行機上的Jmeter-server.log中的報錯信息)

5、啟動Jmeter報錯

 

解決辦法:1、找到JMETER_HOME\bin\jmeter.properties
2、修改server.rmi.ssl.disable=true (記得去除server.rmi.ssl.disable=true前的#),重新啟動jmeter-server.bat

9.2其它說明

1.調度機(master)和執行機(slave)最好分開,由於master需要發送信息給slave並且會接收slave回傳回來的測試數據,所以mater自身會有消耗,所以建議單獨用一台機器作為mater。

2.參數文件:如果使用csv進行參數化,那么需要把參數文件在每台slave上拷一份且路徑需要設置成一樣的。

3.每台機器上安裝的Jmeter版本和插件最好都一致,否則會出一些意外的問題。

4.若是腳本中設置的並發線程數是100,采用3台slaver機器去施加壓力,那么對於服務端來說,此時的並發線程數是300。

5.為了減少出錯的可能性,最好按照如下Jmeter 分布式要求:

  • 各個機器在相同目錄下安裝相同版本的jdk;
  • 各個機器在相同的目錄下安裝相同版本的jmeter;
  • 配置/etc/hosts的IP和hostname的映射。
  • 修改各個機器的jmeter的默認內存參數,從512m調整為合適大小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM