当前位置:网站首页>【性能測試】一文讀懂Jmeter

【性能測試】一文讀懂Jmeter

2022-07-04 07:43:00 李易安QSR

官網下載鏈接:https://jmeter.apache.org/download_jmeter.cgi

一、常用壓力測試工具對比

  • LoadRunner
    性能穩定,壓測結果及細粒度大,可以自定義脚本進行壓測,但是太過於重大,功能比較繁多。
  • apache ab
    模擬多線程並發請求,ab命令對發出負載的計算機要求很低,既不會占用很多CPU,也不會占用太多內存,但卻會給目標服務器造成巨大的負載,簡單的DDOS攻擊等
  • webbench
    webbench首先fork出多個子進程,每個子進程都循環做web訪問測試。子進程把訪問的結果通過pipe告訴父進程,父進程做最終的統計結果。

二、Jmeter安裝和目錄講解

需要JDK環境:8以上,JDK安裝教程

官網下載,解壓
在這裏插入圖片描述
bin目錄:可執行文件,包含配置

  • Jmeter.bat文件:windows啟動文件
  • Jmeter:mac或linux啟動文件
  • Jmeter-server:mac或linux分布式壓測使用的啟動文件
  • jmeter.properties:核心配置文件
  • shutdown:關閉程序
  • report-template:聚合報告的生成模板

docs目錄:文檔目錄,存放它的使用文檔
extras目錄:插件目錄,做二次開發的目錄
lib目錄:核心工具類junit和一些核心包ext
licenses目錄:
printable_docs目錄:

  • 如何調整Jmeter的語言版本
    Options - Choose Language - English/Chinese(Simplify)
    也可以直接修改bin目錄下 的jmeter.properties配置文件中
# language = en 
language=zh

類似的,還可以修改一些主題等等

三、Jmeter核心組件

1、測試計劃

在這裏插入圖片描述

2、線程組

測試計劃中Add - threads -> 線程組(控制總體並發)
在這裏插入圖片描述

Number of Threads:線程數 ,虛擬用戶數。一個虛擬用戶占用一個線程
Ramp-up period(秒):全部進程啟動的時長。100個線程20s,錶示20s內100個線程都會慢慢被啟動,每秒啟動5個
Loop Count:循環次數。每個線程發送的次數。如設置為5,100個線程

3、采樣器

線程組 - 添加 - Sampler(采樣器) - Http/…
web服務器:默認協議是http,默認端口是80,目標服務器名稱或ip地址
路徑:服務器URL
Use multipart/form-data for HTTP POST:當發送POST請求時,使用use multipart/form-data方法發送,默認不選中

4、添加結果樹

線程組 - 添加 - 監聽器 - 查看結果樹

5、斷言

右鍵request - add - 斷言 - 選擇對應需要的斷言(響應斷言…)

6、聚合報告

線程組 - 添加 - 監聽器 - 聚合報告
在這裏插入圖片描述

四、Jmeter自定義變量和可變參數

測試計劃 - 添加 - 配置元件 - 用戶自定義變量
在這裏插入圖片描述
可以添加配置一些ip地址或者其他信息
在這裏插入圖片描述
取值的地方使用${變量名}即可

測試計劃級別的用戶變量
在這裏插入圖片描述

CSV可變參數壓測

在這裏插入圖片描述
配置信息說明
在這裏插入圖片描述
這邊csv或者txt文件都可以的
在這裏插入圖片描述
如果有兩列,卻只有一個參數使用,會默認獲取第一列有效數據
在這裏插入圖片描述

五、Jmeter數據庫壓測實操

1、添加線程組

在這裏插入圖片描述

2、創建JDBC請求

在這裏插入圖片描述

3、為此次請求添加一個配置元件

配置相關數據庫信息等
在這裏插入圖片描述
需要先將第4步的jar添加全局,才可以填寫所有的信息在這裏插入圖片描述

4、添加全局數據庫連接jar

在這裏插入圖片描述

5、編寫指定的JDBC 語句

在這裏插入圖片描述
添加結果樹查看執行結果

JDBC請求中的一些參數說明

Max Number of connections:最大連接數
MAX wait:最大等待時間
Auto Commit:是否自動提交事務

注:這裏的sql語句不要寫;結尾
在這裏插入圖片描述
Variable names:sql執行結果的變量名
Result variable name:此處填寫一個變量,可以將所有的查詢結果封裝為這個對象

線程組 - 添加 - Debug Sampler
執行後就可以看到Debug 采樣器中顯示的結果信息
Handle ResultSet:處理結果集

六、分布式壓測

為什麼要做分布式壓測

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

如何做分布式壓測

簡單原理說明

  1. 總控的機器節點叫做master,其他產生壓力的機器叫“肉雞” server
  2. master會把壓測脚本發送到server上面
  3. 只需要將Jmeter的Jmeter-server打開就可以了,不用啟動Jmeter
  4. 結束後,server會把壓測數據回傳給master,然後master匯總輸出報告
  5. 配置詳情

Jmeter命令行啟動方式,參數詳解

官方教程:https://jmeter.apache.org/usermanual/index.html#get-started

-h 幫助
-n 非GUI模式
-t 指定要運行的Jmeter測試脚本文件
-l 記錄結果的文件,每次運行之前(要確保之前沒有運行過,即xxxx.jtl不存在,不然報錯)
-r Jmeter.properties文件中指定的所有遠程服務器
-e 在脚本運行結束後生成html報告
-o 用於存放html報告的目錄(目錄要唯恐,不然報錯)

jmeter -n -t linux_user_api.jmx result.jtl -e -o /usr/local/software/jmeter/temp/ResultReport

jmeter -n -t linux_user_api.jmx -l result.jtl -e -o /usr/local/software/jmeter/temp/ResultReport

分布式壓測實戰

Jmeter分布式壓測准備工作

壓測注意事項:
the firewalls on the systems are turned off or correct ports are opened.
系統上的防火牆被關閉或正確的端口被打開。

all the clients are on the same subnet.
所有的客戶端都在同一個子網上。

the server is in the same subnet, if 192.x.x.x or 10.x.x.x IP addresses are used. If the server doesn’t use 192.xx or 10.xx IP address, there shouldn’t be any problems.
如果使用192.x.x.x或10.x.x.x IP地址,則服務器比特於同一子網中。 如果服務器不使用192.xx或10.xx IP地址,則不應該有任何問題。

Make sure JMeter can access the server.
確保JMeter可以訪問服務器。

Make sure you use the same version of JMeter and Java on all the systems. Mixing versions will not work correctly.
確保在所有系統上使用相同版本的JMeter和Java。 混合版本將無法正常工作。

You have setup SSL for RMI or disabled it.
您已為RMI設置SSL或將其禁用。

官網地址 http://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html

  • 壓測注意事項:一定要用內網IP,不用用公網IP,用ping去檢查

master:司令
slave:奴隸
target:目標

地址:http://jmeter.apache.org/images/screenshots/distributed-names.svg
地址:http://jmeter.apache.org/images/screenshots/distributed-jmeter.svg

  • 遠程拷貝(內網地址)
scp -r /usr/local/software/jdk-8u141-linux-x64.tar.gz [email protected]:/usr/local/software

scp -r /usr/local/software/jmeter/apache-jmeter-4.0.tgz [email protected]:/usr/local/software/jmeter

啟動 
./jmeter-server   或者 nohup ./jmeter-server &
  • 檢查啟動是否成功
ps -ef|grep jmeter-server
ps aux|grep jmeter-server
  • 關注CPU和內存使用
本地非GUI分布式壓測 -r 
jmeter -n -t /Users/jack/Desktop/remote.jmx -r -l /Users/jack/Desktop/jtl/result.jtl -e -o /Users/jack/Desktop/result

壓測結果
./jmeter -n -t /Users/jack/Desktop/remote.jmx -r -l /Users/jack/Desktop/jtl/result.jtl -e -o /Users/jack/Desktop/result
		
Creating summariser <summary>
Created the tree successfully using /Users/jack/Desktop/remote.jmx
Configuring remote engine: 172.20.10.3:8899
Using local port: 8899
Configuring remote engine: 172.20.10.11:8899
Starting remote engines
Starting the test @ Thu Mar 29 23:21:13 CST 2018 (1522336873931)
Remote engines have been started
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
summary =      4 in 00:00:22 =    0.2/s Avg:  5582 Min:    94 Max: 21006 Err:     1 (25.00%)
Tidying up remote @ Thu Mar 29 23:21:36 CST 2018 (1522336896842)
... end of run
  • 壓測修改master節點信息
jemeter.properties 值是slave機器的ip+端口號,如果有多個,用逗號分隔
remote_hosts=192.168.0.102:8899,192.168.0.101:8899
server.rmi.ssl.disable=true (前面有說到)
  • 啟動slave機器,注意要同個網段,ip地址用內網ip
./jmeter-server
Using local port: 8899
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.0.102:8899](local),objID:[3a585a4d:162724586ab:-7fff, 3963132813614033916]]]

相關資料:
https://www.cnblogs.com/Fine-Chan/p/6233823.html
https://blog.csdn.net/liujingqiu/article/details/52635289
https://www.cnblogs.com/puresoul/p/4844539.html

七、如何提高壓測質量

  • 使用非GUI模式:jmeter -n -t test.jmx -l result.jtl

  • 减少使用Listener,如果使用-l 參數,他們都可以被删除或者禁用

  • 在加載測試期間不要使用“查看結果樹”或者“查看結果”錶監聽器,只能在脚本階段使用它們來調試

  • 包含控制器在這裏沒有幫助,因為他們它是將文件中的所有測試元素添加到測試計劃中

  • 不要使用功能模式,使用csv輸出而不是xml

  • 只保存你需要的數據,盡可能减少使用斷言

  • 如果測試需要大量數據,可以提前將測試數據保存在數據文件中,以csv·Read方式進行讀取

  • 用內網壓測,减少其他帶寬影響壓測效果

  • 如果壓測大流量,盡可能使用多節點以非GUI模式向服務器壓測

官方推薦:https://jmeter.apache.org/usermanual/best-practices.html#lean_mean

八、測試報告詳解

查看其他地方的jtl文件

利用軟件從阿裏雲Centos服務器下載壓測報告,講解Jtl文件,並怎麼查看文件
可以通過打開jmeter,新建線程組->summary report->瀏覽文件 進行查看

簡介:把Jmtere壓測結果轉換為Html
指令

jmeter -n -t /usr/local/software/jmeter/temp/linux_users_api.jmx -l
/usr/local/software/jmeter/temp/jtl/result.jtl -e -o
/usr/local/software/jmeter/temp/result

Jmeter圖形化HTML壓測報告dashboard

壓測報告 html裏面Dashboard的核心指標

	1)Test and Report informations
			Source file:jtl文件名
			Start Time :壓測開始時間
			End Time :壓測結束時間
			Filter for display:過濾器
			Lable:sampler采樣器名稱	

	2)APDEX(Application performance Index)
		apdex:應用程序性能指標,範圍在0~1之間,1錶示達到所有用戶均滿意
		T(Toleration threshold):可接受閥值
		F(Frustration threshold):失敗閥值

	3)Requests Summary
		OK:成功率
		KO:失敗率
		
	4)Statistics 統計數據
		lable:sampler采樣器名稱

		samples:請求總數,並發數*循環次數
		KO:失敗次數
		Error%:失敗率

		Average:平均響應時間
		Min:最小響應時間
		Max:最大響應時間
		90th pct: 90%的用戶響應時間不會超過這個值(關注這個就可以了)
		2ms,3ms,4,5,2,6,8,3,9

		95th pct: 95%的用戶響應時間不會超過這個值
		99th pct: 99%的用戶響應時間不會超過這個值 (存在極端值)
		throughtput:Request per Second吞吐量 qps

		received:每秒從服務器接收的數據量
		send:每秒發送的數據量

Jmeter圖形化HTML壓測報告Charts報錶

1、Over Time(隨著時間的變化)
	Response Times Over Time:響應時間變化趨勢
	Response Time Percentiles Over Time (successful responses):最大,最小,平均,用				 戶響應時間分布
	Active Threads Over Time:並發用戶數趨勢
	Bytes Throughput Over Time:每秒接收和請求字節數變化,藍色錶示發送,黃色錶示接受
	Latencies Over Time:平均響應延時趨勢
	Connect Time Over Time	:連接耗時趨勢

2、Throughput
	Hits Per Second (excluding embedded resources):每秒點擊次數
	Codes Per Second (excluding embedded resources):每秒狀態碼數量
	Transactions Per Second:即TPS,每秒事務數
	Response Time Vs Request:響應時間和請求數對比
	Latency Vs Request:延遲時間和請求數對比

3、Response Times
		Response Time Percentiles:響應時間百分比
		Response Time Overview:響應時間概述
		Time Vs Threads:活躍線程數和響應時間
		Response Time Distribution:響應時間分布圖

九、相關問題總結

配置元件=》前置處理器=》定時器=》采樣器=》後置處理器=》斷言=》監聽器

問題:

[[email protected] bin]# ./jmeter-server
	Created remote object: UnicastServerRef2 [liveRef: [endpoint:[:39308](local),objID:[24e78a63:16243c70661:-7fff, 7492480871343944173]]]
	Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.; nested exception is:
	java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
	An error occurred: Cannot start. Unable to get local host IP address.; nested exception is:
	java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known

解决:

hostname  命令獲取機器名稱,追加一個映射  iZwz95j86y235aroi85ht0Z
vim /etc/hosts
  		127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  		::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  		120.79.160.143 iZwz95j86y235aroi85ht0Z

windows用戶 修改c:\windows\system32\drivers\etc\hosts文件,增加一條域名 與IP的映射

問題

[[email protected] bin]# ./jmeter-server
	Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:
	java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
	An error occurred: Listen failed on port: 0; nested exception is:
	java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)

解决:

擁有RMI over SSL的有效密鑰庫,或者禁用了SSL。
1、禁用SSL
jmeter.property裏面 server.rmi.ssl.disable 改為 true,錶示禁用

問題:

[[email protected] bin]# ./jmeter
		Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
		#
		# There is insufficient memory for the Java Runtime Environment to continue.
		# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
		# An error report file with more information is saved as:
		# /usr/local/jmeter/apache-jmeter-4.0/bin/hs_err_pid5855.log

解决:

編輯jmeter
搜索 : "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
改變初始堆內存和最大堆內存
  • 僅修改 server_port 即可,下面兩者一樣

server.rmi.localport=8899 錶示slave server啟動顯示的端口
server_port=8899 錶示master機器要遠程連接的端口 即 remote_hosts=xxxx:8899

我們要在多網卡的服務器上開啟RMI服務的話必須指定IP,使他們能够在同一個網段內。

需要以下幾步(假定所有機器都在10.120.11.*網段,agent服務器為linux,controller服務器為windows):

1、 修改agent服務器,指定agent機器的IP
修改jmeter-server文件

# vi jmeter-server

修改RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(需要連接的IP)

2、修改server服務器,指定server機器的IP

修改jmeter.bat文件 

新增set rmi_host=-Djava.rmi.server.hostname=10.120.11.214

修改set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%
  • 確定在controller機器上安裝jdk,版本和jmeter一致,配置環境變量:Java_home等

      在Agent機器上安裝jdk,配置環境變量:Java_home和JMeter_home
      
      安裝目錄不要帶空格,最好都是簡短的英文路徑
    
  • master機器啟動後會拷貝jmx文件到slave機器

      所以不需要在每臺slave機器上也上傳一份jmx,只需要在master機器上上傳一份jmx脚本即可。
      
      如果使用csv進行參數化,則需要把參數文件在每臺slave上拷一份且路徑需要設置成一樣的。
      
      總樣本數 = 線程數 * 循環次數 * 執行機總數
    
  • 連接失敗原因排查

以下步驟進行排查:
1. jmeter-server是否啟動;
2. 是否聯網
3. ping 服務器IP是否暢通.
4. telnet 端口 192.168.3.10 1099
5. 檢查服務器的防火牆是否關閉。
6. 阿裏雲安全策略是否正常

  • “could not find ApacheJmeter_core.jar”

      解决:在Agent機器安裝jdk,並設置環境變量
    
  • ”Bad call to remote host"

      解决:檢查被控制機器上的jmeter-server有沒有啟動,或者remote_hosts的配置是否正確。
    
原网站

版权声明
本文为[李易安QSR]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207040740327055.html