linux環境下Jmeter分布式環境搭建及執行


目錄

一、使用Jmeter分布式測試的背景

1、GUI、非GUI(即命令行)的區別

Jmeter有兩種運行方式,GUI、非GUI。

GUI:在Windows系統上運行,圖形化界面,方便收集測試結果,但是消耗壓力機資源較高,容易卡死,有並發限制。

非GUI:在Linux系統上通過命令行運行,無圖形化界面,不方便收集測試結果,但是占用壓力機資源較低,可以支持較大並發。

2、GUI遇到的問題

1)圖形化界面消耗更多資源,如CPU和內存,容易使壓力機達到瓶頸,從而影響測試結果。

Jmeter是基於java程序運行的,在windows上使用Jmeter進行性能測試時,非常耗費客戶機的CPU和內存,如果並發數稍微大一點(比如100、1000...並發),單台電腦的配置經常無法支持,很容易卡死,即使不卡死也會使電腦運行很慢,導致我們沒辦法進行其它操作。

2)圖形化界面不支持大型的負載測試和性能測試,並發較大時,jmeter會崩潰。
綜上,jmeter壓測時需要使用非GUI即命令行執行,減少資源消耗。
3、非GUI單點遇到的問題
在使用Jmeter進行性能測試時,在不進行調優的情況下,並發用戶數很難突破1000;Jmeter進行調優后,單台並發數可以突破2000。但是如果要支持更大的並發,例如:5000、20000並發,則需要使用Jmeter提供的分布式測試的功能。

二、Jmeter分布式執行原理

1、Jmeter分布式測試時,選擇其中一台作為控制機(master),其它機器作為執行機(slave)。

建議:一台linux作為master,多台linux作為slave。主要是避免slave壓測機數據上報帶來的影響。要求:slaver服務的jdk和Jmeter版本要一致,避免出現一些疑難雜症。

2、執行時,master會把腳本發送到每台slave上,slave拿到腳本后就開始執行,slave執行時不需要啟動GUI,如果引用到csv等外部的文件,則每台slave所在的機器都需要相應位置(腳本中可以指定文件路徑)手工上傳該文件。slave本地不需預先存儲腳本,但是需要有腳本中的依賴文件(如csv文件等),並需要設置正確的路徑。

3、執行完成后,slave會把結果回傳給master,master會收集所有slave的信息並匯總。

注意:

(1)每一台jmeter遠程服務器(slave機器)都執行相同的測試計划,jmeter不會在執行期間做負載均衡,每一台服務器都會完整地運行測試計划;

(2)采用JMeter遠程模式並不會比獨立運行相同數目的非GUI測試更耗費資源。但是,如果使用大量的JMeter遠程服務器,可能會導致客戶端過載,或者網絡連接發生擁塞;

(3)默認情況下,master機器是不執行參與生成並發數據的;

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

三、Jmeter分布式設備資源准備(根據並發數量准備,此處僅供參考)

2台16核32G linux環境Centos7.6(代理機),1台8核16Glinux環境(控制機),linux系統版本由jmeter版本兼容環境決定,本次使用的系統是Cenos7.6,Jmeter版本5.2.1,JDK版本1.8。
3台機器分別各自安裝好jdk、jmeter。

四、Jmeter分布式搭建

1台作為控制機,2台作為從機(執行機)。

1、JDK1.8安裝

1)官網下載文件

下載鏈接:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
本次使用的安裝包:jdk-8u91-linux-x64.tar.gz

2)上傳文件解壓

進入安裝包目錄執行解壓命令:tar -xzvf jdk-8u91-linux-x64.tar.gz

3)linux環境變量配置

執行命令vi /etc/profile,在文件底部增加如下內容(安裝路徑根據實際情況修改),並保存:

JAVA_HOME=/usr/local/jdk1.8
export JAVA_HOME
JRE_HOME=\$JAVA_HOME/jre
export JRE_HOME
PATH=\$JAVA_HOME/bin:\$JRE_HOME:bin:\$PATH
export PATH
CLASSPATH=\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tool.jar:\$CLASSPATH
export CLASSPATH

執行命令source /etc/profile ,生效文件修改。

4)驗證jdk安裝是否成功

執行命令java -version,顯示java版本信息則表示安裝成功

2、Jmeter安裝

1)官網下載文件

下載鏈接:http://jmeter.apache.org/download_jmeter.cgi 或 鏈接: https://pan.baidu.com/s/1mQ1y8yh0pEU8_tzyxv7zww 提取碼: 33ts
本次使用的安裝包:apache-jmeter-5.2.1.tgz

2)上傳文件並解壓

進入安裝包目錄執行解壓命令:tar zxvf apache-jmeter-5.2.1.tgz

3)linux環境變量配置

執行命令vi /etc/profile,在文件底部增加如下內容,並保存:

export JMETER_HOME=/opt/apache-jmeter-5.2.1
export CLASSPATH=${JMETER_HOME}/lib/ext/ApacheJMeter_core.jar:${JMETER_HOME}/lib/jorphan.jar:${CLASSPATH}
export PATH=${JMETER_HOME}/bin:${PATH}

執行命令source /etc/profile ,生效文件修改。

4)驗證jmeter安裝是否成功

執行命令jmeter -v,顯示jmeter版本信息則表示安裝成功

5)服務授權

如果壓測啟動和服務配置都是root權限,需要在linux環境下給jmeter和jmeter-server授權,命令:chmod 777 jmeter

3、jmeter控制機配置文件修改

1)修改jmeter.properties中的remote_hosts

文件路徑:jmeter安裝路徑的bin目錄下
修改點1:文件中remote_hosts值,原文件是remote_hosts=127.0.0.1,修改成remote_hosts=134.175.16.161:1099,193.112.110.50:1099,此處IP是代理機IP地址(騰訊雲機器此處寫內網IP)和端口按默認值則填寫1099或直接寫IP即可。

修改點2:文件中server.rmi.ssl.disable值,原文件是#server.rmi.ssl.disable=false,修改成server.rmi.ssl.disable=true。若未修改則啟動執行時會報錯:java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory),如下所示:

2)內存修改

方法一(推薦):修改jmeter,修改后啟動命令直接使用jmeter
使用UE軟件打開該文件搜索HEAP修改最大值
: "${HEAP:="-Xms4g -Xmx8g -XX:MaxMetaspaceSize=512m"}"

方法二:修改jmeter.sh,修改后啟動命令需使用jmeter.sh
文件底部增加以下內容:
java $JVM_ARGS -Xms1G -Xmx3G -XX:MaxPermSize=512m -Dapple.laf.useScreenMenuBar=true -jar dirname $0/ApacheJMeter.jar "$@"

4、jmeter執行機(slave)配置文件修改

slave執行機與控制機配置文件修改基本一樣,不同之處在於控制機需要修改jmeter.properties文件中remote_hosts的值,添加各個執行機IP地址。

1)修改jmeter.properties

文件路徑:jmeter安裝路徑的bin目錄下
修改點1:文件中server.rmi.ssl.disable值,原文件是#server.rmi.ssl.disable=false,修改成server.rmi.ssl.disable=true

2)內存修改(參照控制機修改方法)

3)slave執行機端優化:linux端口數量調整

vim /etc/sysctl.conf 添加
net.ipv4.ip_local_port_range = 1024 65000
fs.file-max = 6553560
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 3
net.core.netdev_max_backlog = 3000
net.core.somaxconn = 3000
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_rmem = 8192 4194304 8388608
net.ipv4.tcp_wmem = 8192 4194304 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.ipv4.tcp_timestamps = 1

sysctl.conf文件修改生效命令:sysctl -p
若未做此優化,會出現較多如下報錯:
Non HTTP response code: java.net.NoRouteToHostException

4)slave執行機關閉防火牆

分布式執行出現報錯”No route to host“時需要slave執行機關閉防火牆
查看防火牆狀態(CentOS7.6需使用命令systemctl status firewalld)
service iptables status/systemctl status firewalld
關閉防火牆
systemctl stop firewalld

5、jmeter的slave執行機服務啟動(兩台都分別啟動)

啟動命令:
jmeter-server -Djava.rmi.server.hostname=134.175.16.161 (slave執行機本機IP) ,注意點:如果是配置內網ip,此處ip為該slave執行機對應的內網ip地址
啟動命令若未加入本機IP,可能會出現“An error occurred: Cannot start. localhost is a loopback address”錯誤,若想直接通過命令jmeter-server啟動不加入IP可修改文件jmeter-server增加內容:RMI_HOST_DEF=-Djava.rmi.server.hostname=134.175.16.161
備注:后台運行執行時,可在命令前面加入nohup,命令末尾加入&,例:nohup jmeter-server -Djava.rmi.server.hostname=134.175.16.161 &
啟動成功標志如下:

6、上傳壓測腳本和外部讀取的csv文件

只需要上傳壓測腳本到控制機master服務器,節點機slave不需要上傳,壓測腳本自動回發到slaver執行機上;但是如果腳本中涉及從外部讀取的csv文件,那該文件就需要上傳到各個slaver執行機上。
注意:參數化文件路徑若只寫文件名稱無具體路徑時,linux環境下默認讀取用戶目錄下的文件(例:登錄用戶是root,則是在root目錄下),windows環境默認讀取的是跟腳本同目錄的路徑。

7、jmeter控制機命令啟動執行

1)命令行格式
常用格式(單機執行命令):
jmeter -n -t [jmx腳本路徑] -l [測試輸出結果文件路徑] -e -o [結果文件html格式存放路徑] -j [測試輸出結果日志]
示例:
jmeter -n -t /opt/testplan/xssb.jmx -l /opt/testplan/result_xssb_200user_01.jtl -e -o /opt/testplan/result_xssb_200user_01/ -j /opt/testplan/result_xssb_200user_01.log
分布式執行,啟動所有slave壓力機執行命令:
jmeter -n -t [jmx腳本路徑] -r -l [測試輸出結果文件路徑] -j [測試輸出結果日志]
例:jmeter -n -t /opt/testplan/xssb.jmx -r -l /opt/testplan/result_xssb_200.jtl -j /opt/testplan/result_xssb_200.log

分布式執行,啟動指定slave機執行命令:
jmeter -n -t [jmx腳本路徑] -R ip1,ip2 -l [測試輸出結果文件路徑] -j [測試輸出結果日志]
例:jmeter -n -t /opt/testplanHn/count.jmx -R 172.16.0.12,172.16.0.7 -l /opt/testplanHn/count88.jtl -j /opt/testplanHn/result_count88.log

(不推薦)啟動所有slave機執行命令並將結果轉成html報告格式:
jmeter -n -t [jmx腳本路徑] -r -l [測試輸出結果文件路徑] -e -o [結果文件html格式存放路徑] -j [測試輸出結果日志]
不推薦原因說明:轉成html文件占用空間大,下載效率慢,建議下載jtl文件在本機直接,本處僅供了解。
例:jmeter -n -t /opt/testplanHn/count.jmx -r -l /opt/testplanHn/result_count_8.jtl -e -o /opt/testplanHn/result_count_8/ -j /opt/testplanHn/result_count_8.log

(推薦)下載jtl文件到本機windows電腦上,將jtl文件轉成html報告命令:
jmeter -g [jtl結果路徑] -o [結果文件html格式存放路徑] ,注意:html存放文件夾需為空或不存在,否則生成會失敗,失敗信息:folder is not empty
例:jmeter -g F:\perf200218\result_login_500\resultCq_login_500_01.jtl -o F:\perf200218\result_login_500\html
2)解讀命令行參數
-g : 指定已存在的測試結果文件
-n :以非GUI形式運行Jmeter,表示 non gui mode,就是非圖形化模式

-t :source.jmx 腳本路徑,

即testplan,后跟要運行的jmeter腳本的路徑和腳本名稱。

若指定路徑下沒有指定名稱的腳本,則自動創建。

若沒有路徑只寫腳本名稱,則默認是在當前目錄查找或創建。

-r:啟動所有slave機執行,遠程將所有slave機啟動用在分布式測試場景下,不是分布式測試只是單點就不需要-r

-R:指定遠程連接的slave機器的ip地址,多個ip之間用逗號隔開

-l :result.jtl 運行結果保存路徑(.jtl),此文件必須不存在,重新執行需要手動刪除已經生成的jtl文件

-j:存放日志路徑。注意:不要寫太多日志,否則轉成html報告時會出現內存溢出錯誤。分布式時,該處是控制機日志,非執行機日志,執行機日志放置路徑是各個執行機的/root/jmeter-server.log。腳本中輸出的日志都是在執行機上。但是當輸出日志時過大時轉成html報告會報錯Java Heap space,如下圖所示:

-e :在腳本運行結束后生成html報告

-o :用於存放html報告的目錄,指定的文件及文件夾,必須不存在 ,否則執行會失敗。

注意:-r/R啟動遠程服務,即分布式執行啟動slave機時,首先在這些slave執行機上啟動jmeter-server的服務

3)分布式執行,啟動成功標志如下:

五、Jmeter分布式執行注意點

單個壓測機線程數配置<=1500,太多性能損耗較大,延時高。

1、分布式線程數設置

分布式運行時,最終執行線程數=腳本設置的線程數 * slave壓力機的個數,如線程數設置為4,使用2個slave機運行,則總並發數是4*2=8.
例:執行1000並發時,腳本中設置的線程數=並發數/slave機的個數即1000/2=500。
分布式執行時,可通過最后一條summary=的Finished值進行判斷本次執行的並發數是多少。
例:腳本設置線程數4,代理機2台,分布式執行時,該處的Finished是8,即進行的並發數是8

summary=為總的數據,368是請求數,23.9/s是TPS,Avg是平均響應時間單位ms,這里是0.319s,Err是錯誤率
其中主要有兩種信息:summary + 和summary =,其它項都是類似的

summary + 203 in 00:00:15:在30秒內增加了203個請求,其中時間間隔由配置文件中的interval統計頻率的值決定

summary = 368 in 00:00:15:在15秒內產生的總請求數是3685個,其中的時間段是從腳本運行開始計算到當前時間為止,一般在腳本運行過程中主要關注summary=信息即可

23.9/s:系統每秒處理的請求數,相當於TPS

Avg: 319:平均響應時間(單位ms)

Min: 178:最小響應時間(單位ms)

Max: 1761:最大響應時間(單位ms)

Err: 0 (0.00%):錯誤數/率

Active: 1:活動的線程數

2、Jmeter傳參命令在分布式時不起作用(Jmeter缺陷)

Jmeter單機可使用傳參命令動態修改線程數,但在分布式時不起作用,此問題是Jmeter存在的缺陷。故分布式時,只能通過本機修改線程數后再上傳執行。
Jmeter單機傳參命令參考如下(腳本中需設置對應的線程參數):
jmeter -Jthreads1=4 -Jrampup=1 -Jduration=20 -n -t /opt/testplanHn/count.jmx -l /opt/testplanHn/result_count_new4.jtl -j /opt/testplanHn/result_count_new4.log

3、分布式的多台單點替代方法

當分布式部署存在問題無法解決或者不想使用分布式時,可采取多台單點執行替代方法,統計數據時,並發數=單點數量並發數相加,TPS=多台單點的TPS相加,平均響應時間=多台單點平均響應時間相加/單點數量。
例:2台單點同時執行,並發數=2台單點並發數相加,TPS=2台單點的TPS相加,平均響應時間=2台單點平均響應時間的平均值。

4、單點命令行執行,保存響應結果(該方法只適應單點,且轉成html報告存在問題,此處僅供了解,后續有新方法再更新。目前分布式的保存響應結果還待研究。)

Jmeter為了減少壓力機負擔,默認是不保存響應結果。需要做以下設置:
修改bin目錄下的user.properties文件,追加配置:

jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.responseHeaders=true

但是該配置添加后,將jtl轉化成html格式報告出錯(原因:轉換成html格式需要jmeter.save.saveservice.output_format=csv,linux環境默認是該配置),出錯信息如下:

Error in NonGUIDriver java.lang.IllegalArgumentException: Report generation requires csv output format, check 'jmeter.save.saveservice.output_format' property
An error occurred: Error in NonGUIDriver Report generation requires csv output format, check 'jmeter.save.saveservice.output_format' property
所以以上保存錯誤信息的方法不可行。

通過以上設置生成的jtl文件,在windows查看會出現亂碼,需要修改本機windows機器Jmeter配置:修改jmeter.properties 中的sampleresult.default.encoding=UTF-8

5、分布式保存錯誤響應結果

使用BeanShell Assertion元件進行斷言操作。注意:不可寫太多日志內容,以免影響性能,及轉換成html時出現內存報錯。

例:


String response = "";

String Str = "JMeter2";

String response = "${title}";

//response = prev.getResponseDataAsString();//獲取當前請求響應結果

if(response == "")

{

 Failure = true;

 FailureMessage = "系統無響應,獲取不到響應數據";

 log.info(FailurMessage);

//}else if(response.contains(Str)==false){

}else if(response.equals(Str)==false){

 Failure = true;

 String msg = "\n系統返回響應結果與預期結果不一致!請排查是性能問題,還是程序代碼問題";

 FailureMessage = msg + "\n" + "期望結果:\n" + Str + "\n" + "響應內容:\n" + "${title}" + "\n";

 log.info(FailureMessage); 

}

分布式時,.log日志不存在控制機,而是執行機jmeter-server.log(默認在用戶目錄下如root目錄)中,但是分布式的jtl文件轉成html報告是可以看到報錯日志。
執行機中日志顯示如下所示:

控制機.jtl文件轉換成html時響應結果顯示Unicode編碼,可通過網站http://tool.chinaz.com/tools/unicode.aspx 進行轉碼:


附錄

1、windows版本jmeter內存修改

1)修改jmeter.bat文件,搜索HEAP

2)驗證內存修改是否生效

運行文件 D:\Program Files\Java\jdk1.8.0_101\bin\jvisualvm.exe,查看本地Jmeter的信息,如下所示:

2、jmeter單機執行命令參考

jmeter -n -t FDBL-v4.0_220308.jmx -l thread1_1user_$(date '+%Y%m%d%H%M%S').jtl -e -o thread1_1user_$(date '+%Y%m%d%H%M%S')


免責聲明!

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



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