1.常用壓力測試工具對比
a. loadrunner
性能穩定、壓測結果及細粒大,可以自定義腳本進行壓測,但是太過於重大、功能比較繁多(國企或專業的測試團隊)
b. apache ab(單接口壓測最方便,傳統互聯網公司)
模擬多線程並發請求,ab命令對發出負載計算機要求很低,既不會占用太多的內存,但是卻會給目標服務器造成巨大的負載,簡單DDOS攻擊等
c. webbench
webbench首先fork出多個子進程,每個子進程都循環做web訪問測試,子進程把訪問的結果pipe告訴父進程,父進程做最終的統計結果.
2.Jmeter基本介紹和使用場景
a.Ability to load and performance test many different applications/server/protocol types:
Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)
SOAP / REST Webservices
FTP
Database via JDBC
LDAP
Message-oriented middleware (MOM) via JMS
Mail - SMTP(S), POP3(S) and IMAP(S)
Native commands or shell scripts
TCP
Java Objects
b.使用場景及優點
功能測試
壓力測試
分布式壓力測試
純java開發
上手容易、高性能
提供測試數據分析
各種報表數據圖形展示
3. 本地快速安裝jmeter4.x
簡介: GUI圖形界面的安裝
a.安裝x-windows
yum groupinstall 'X Window System' -y yum groupinstall "GNOME Desktop" -y //要開啟3D systemctl set-default multi-user.target //設置成命令模式 systemctl set-default graphical.target //設置成圖形模式 startx
CentOS 7 切換圖形界面和文本界面
https://www.ifshow.com/centos-7-switching-graphical-and-text-interface/
b. 需要安裝jdk8,9 或10(不建議單獨安裝jre)
[root@node2 ~]# cat /etc/profile.d/jdk.sh export JAVA_HOME=/home/jdk1.8.0_152 export PATH=$JAVA_HOME/bin:$PATH
c.安裝jmeter
[root@node2 ~]# wget http://mirrors.hust.edu.cn/apache//jmeter/binaries/apache-jmeter-4.0.tgz [root@node2 ~]# tar xf apache-jmeter-4.0.tgz [root@node2 ~]# cd apache-jmeter-4.0/bin [root@node2 bin]# ./jmeter
d. 設置Jmeter環境變量
[root@node2 ~]# cat /etc/profile.d/jmeter.sh export JMETER=/root/apache-jmeter-4.0 export CLASSPATH=$JMETER/lib/ext/ApacheJMeter_core.jar:$JMETER/lib/jorphan.jar:$CLASSPATH export PATH=$JMETER/bin/:$PATH [root@node2 ~]# source /etc/profile.d/jmeter.sh [root@node2 ~]# jmeter -v Linux下運行Java項目時,出現No X11 DISPLAY variable was set, but this program performed an operation which requires it.的問題解決 在~/.bashrc環境變量文件最下方加入: export DISPLAY=:0.0 然后,刷新環境變量以使其生效: source ~/.bashrc
4. jmeter目錄文件
[root@node2 apache-jmeter-4.0]# ll bin 執行文件、包含配置 windows: jmeter.bat linux: jmeter jmeter-server:分布式壓測啟動文件 jmeter.properties: 核心配置文件 extras 插件拓展 lib 核心依賴包 junit 單元測試包
5.Jmeter語言版本中英文切換
a. 控制台修改 menu --> options --> choose language(臨時悠)
b. 配置文件修改(永久)
bin目錄 --> jmeter.properties(默認是#language=en,修改為language=zh)
6.使用SpringBoot 2.0快速編寫API測試接口
描述:使用java的框架springBoot快速編寫幾個API接口測試
http://spring.io/guides/gs/spring-boot/
接口列表:
a. 模擬GET請求,用戶列表接口
b. 模擬POST請求,用戶登錄接口
http://localhost:8080/users
7.創建Jmeter測試計划,快速壓測一個接口
a.創建一個測試計划
teat plan --> add --> threads(users) --> setup Thread Group
Name: 10 threads
Number os threads: 10 線程數
ramp-up period(in seconds): 10 (10秒)
loop count: 1 循環次數
線程數: 虛擬用戶數, 一個虛擬用戶占用一個進程或線程(模擬多少個用戶請求)
准備時長(Ramp-Up Period(in seconds))
全部線程啟動時長,比如100個線程,20秒,則表示20秒內100個線程都要啟動完成,每秒啟動5個線程
循環次數:每個線程發送的次數,假如值為5,100個線程,則會發送500次,可以勾選永遠循環
右上角的00:00:00 是壓測的執行時間(壓測計划所消耗的時間)
右上角的嘆號是日志
0/0 是並發的一個數量
b.創建一個請求
10 threads --> add --> sampler --> HTTP Request
protocol: 默認是http(可寫https)
server Name or ip: 127.0.0.1
method: get #可以使用Post,path:/login, 輸入賬號密碼parameters: name,password , include equals
port: 8080
path: /users
名稱:采樣器名稱
注釋:對這個采樣器的描述
web服務器:
默認協議是http
默認端口是80
服務器名稱或Ip: 請求的目標服務器名稱或IP地址
路徑:服務器URL
Use multipart/from-data for HTTP POST: 當發送POST請求時,使用use multipart/from-data方法發送,默認不選中
follow redirects: 有些返回302重定向
use keepalive: 保持連接
c.創建一個查看結果樹(發送請求對應的結果)
10 threads --> add --> listener --> view results tree
summary
分析:可以同時調用登錄和用戶信息接口,實現接口的聯動性
8.Jmeter的斷言基本使用
jmeter中有個元件叫做斷言(Assertion),它的作用和loadrunner中的檢查點類似;
用於檢查測試中得到的響應數據等是否符合預期,用以保證性能測試過程中的數據交互與預期一致。
使用斷言的目的:在request的返回層面增加一層判斷機制;因為request成功了,並不代表結果一定正確。
http requests --> add --> assertions --> response assertion
name: include 200
apply to : main sample only(一個接口觸發一個請求,如果一個接口聯動其他選main sample and sub-samples)
field test(要測試的響應字段,發一個請求過去,會有請求頭,相關的響應信息)
text response(響應文本): 返回的信息
response code: http代碼,如200
document: 如一些pdf,這個斷言比較消耗性能
Pattern Matching Rules(匹配規則)
contains: 包含的范圍,如包含jack這個字段
matches: 匹配不區分大小寫
equals: 區分大小寫
substring: 子字符串
Pattern to test: 如add --> 200 匹配200
custom failuer message: 失敗返回的信息
查看結果樹中: text可以雙擊對應的報錯,可以通過響應代碼、響應信息等等共同來判斷
每個sample下面可以加單獨樹,然后同時加多個斷言,最外層可以加結果樹進行匯總
9.Jmeter實戰之壓測結果聚合報告分析
描述:聚合報告是辱沒結果時,會有響應時間,請求大小,吞吐量等
http request --> add --> listener --> aggregate report
label: sample的名稱
samples: 總共發送的請求數,如10個用戶循環10次,也就是100
average: 平均響應時間,單位是毫秒
median: 平均時間中位數(大多數用戶的一個響應時間),有時隨着負載升得越來越高,它的中位數會變
90%line: 90%用戶的響應時間不會越過這個值如54毫秒
95%line: 95%用戶的響應時間不會越過這個值如368毫秒
99%line: 99%用戶的響應時間不會越過這個值如504毫秒
min: 最小響應時間如3毫秒
max: 最大響應時間如438毫秒
error%:
throughput: 每秒請求數,類似於qps,qps不能長時,基本上是瓶頸,並長上升時,會下降
received KB/s: 接收的字節數
sent KB/s: 發送的字節數
10.Jmeter壓測腳本JMX講解
測試計划 <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"> </TestPlan> 線程組 <SetupThreadGroup guiclass="SetupThreadGroupGui" testclass="SetupThreadGroup" testname="user_api" enabled="true"> </SetupThreadGroup> 測試名稱 testname="user_api" 循環次數 <stringProp name="LoopController.loops">2</stringProp> 並發數(模擬用戶數) <stringProp name="ThreadGroup.num_threads">30</stringProp> 並發時間 <stringProp name="ThreadGroup.ramp_time">5</stringProp> http request <stringProp name="HTTPSampler.domain">172.16.100.8</stringProp> <stringProp name="HTTPSampler.port">80</stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path"></stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> 響應斷言 <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> <stringProp name="49586">200</stringProp> <stringProp name="Assertion.custom_message"></stringProp> #失敗后的信息 <intProp name="Assertion.test_type">1</intProp> #test_type對應類型,如包含、匹配等 結果樹 <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> 聚合報告 <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="User Aggregate Report" enabled="true">
11.Jmeter用戶自定義變量實戰
使用原因:很多變量在全局中都有使用,或者測試數據更改,可以在一處定義,四處使用,如服務器
a. 線程組 --> add --> config element(配置條件) --> user definde variable(用戶定義的變量)
b. 引用方式$(XXX),在接口中變量使用,在path中也可以使用
c. 原始查看結果和非原生查看(基礎按鈕)
注意:只執行某一個時,threads組 --> 右擊start(導航的三角是執行所有的)
12. Jmeter實戰之CSV可變參數壓測
描述:壓力測試時,不會單用戶去測試,參數要不段的變化,如果緩存命中就沒意義,CSV就是解決這個問題,可以通過讀取文本中很多用戶數據
a. 線程組 --> add --> config elemnet(配置原件) --> CSV data set config(CSV數據文件設置)
[root@node1 ~]# cat user_info.txt #csv一般以空格 user11|pwd11 user22|pwd22 user33|pwd33 選項 filename: csv文件 file encoding: 是否編碼 variable names: 變量名稱,是引用時${}的名稱 sharing mode: all threads(變量是否在所有場景中引用) delimiter: 使用的分隔符,如使用txt時可以使用" | “分隔
b.CSV文件多參數使用
13. 壓測實戰之JDBC request壓測Mysql
a.添加線程組:test plan --> add --> threads(user) --> threads group(setup and teardown作為前置后后置處理)
b. thread group --> add --> sampler --> jdbc request
c. jar 包添加 mysql-connector-java-5.1.30.jar (可以在test plan最下處加add directory or jar to classpath)
d.JDBC connection Configuration配置
JDBC request --> add --> config element --> JDBC connection configuration
注:variable name bound to pool要與jdbc request中的一致
核心配置
Max number of connection:最大連接數(mysql一般是3000-4000)
MAX wait : 最大等待時間
Auto Commit: 是否自動提交事務
DataBase URL: 數據庫連接地址 jdbc:mysql://172.16.100.8:3306/blog
JDBC Driver Class: 數據庫驅動,選擇對應的mysql
username: 數據庫用戶名
password: 數據庫密碼
14.實戰之request壓測Mysql, select語句
a. debug sampler使用(調試采樣器)
thread group --> add --> sampler --> debug sampler (variable names sql and result variables names)
在view result tree中的debug sampler中的respone data中的name_#是對應以下handle results
b.參數(sql結尾不要加';')
- variable name of pool declared in JDBC connection configuration(和配置文件同名)
- Query Type 查詢類型
- parameter values 參數值
- parameter types 參數類型
- variable names sql 執行結果變量名 #這兩個參數主要用於debug sampler
- result variable names 所有結果當做一個對象存儲
- query timeouts 查詢超時時間
- handle results 處理結果集
Query type
select statement 查詢語句
update statement 更新語句
callable statement 存儲過程
prepared select statement 預編譯的查詢語句,查詢時可能有?,防止sql注入
prepared update statement
commit 事務提交
rollback
autocommit(false)
debug sampler
15. 分布式壓測介紹
- 普通壓測試: 單台機可以對目標機器產生壓力比較小,並發數特別高時,受限因素包括CPU、網絡、IO等
- 分布式壓測試: 利用多台機器向目標機器產生壓力,模擬幾萬用戶並發訪問
注:在網站安全,API接口要做一個DDOS的流量閥值的限制,每個Ip限制訪問次數
原理
- 總控制機器的節點master(修改remote_host配置),其他產生壓力的機器叫"肉雞" server(機器要在同一個網段,且安裝相應的Jdk,使用RMI通訊)
[root@node2 ~]# grep remote_hosts apache-jmeter-4.0/bin/jmeter.properties remote_hosts=172.16.100.100:1109,172.16.100.101:1109,172.16.100.102:1109
- master會把壓測腳本送到server上面
- 執行時,其他節點server上只需要把jmeter-server打開,不用啟動jmeter
- 結束后,server會把壓測數據回傳給master,然后master匯總輸出報告
配置准備
三個角色:master slave target(master控制slave向target進行壓測,slave再收集信息返回給master)
壓力測試注意事項
- 系統上的防火牆被關閉或正確的端口被打開
- 所有的客戶端都在同一個子網上
- 如果使用192.x.x.x或10.x.x.x IP地址,則服務器位於同一子網中,如果服務器不使用192.xx或10.xx的IP地址,則不會有任何問題
- 確保jmeter可以訪問服務
- 確保所有系統上使用相同版本的Jmeter和java,混合版本將無法正常工作
- 您已經為RMI設置SSL或將其禁用
阿里雲jmeter壓測常見問題處理
a.there is insufficient memory for th java runtime environment to continue(當啟動jmeter-server時,內存不足)
分析:內存低,減小應用啟動的JVM內存 vim jmeter "${HEAP:="-Xms124m -Xmx124m -XX:MAXMetaspaceSize=256m"}" #把1g修改成124m,第一個是初始的堆內存,第二個是最大的堆內存,第三個是原數據最大的保存區域
b. rmi_keystore.jks(no such file or directory) 是jmeter遠程調用時需要一個rmi的密鑰
解決:禁用SSL,在jmeter.property中server.rmi.ssl.diable 改為 true,表示禁用
c. server failed to start: java rmi.remoteexception: cannot start. unable to get local host ip address
vim /etc/hosts ip 機器名
d.master機器啟動后會拷貝jmx文件到slave機器, 所以不要在每台slave上傳一wwvjmx,只需要在master上有一份即可,
如果使用csv進行參數化,則需要把參數文件在每台slave上拷貝一份且路徑需要設置成一樣的 總樣本數 = 線程數 * 循環次數 * 執行機總數
e.連接失敗原因排查
- jmeter-server是否啟動
- 是否聯網
- ping 服務器IP是否暢通
- telnet Ip port
- 檢查服務器的防火牆是否關閉
- 雲上的策略是否正常
f.could not find apachejmeter_core.jar
解決:在agent機器上安裝jdk,並設置環境變量
g.bad call to remote host
解決:檢查控制機器上的Jmeter-server有沒啟動,或者remte_hosts是否配置正確
分布式壓力測試操作
a.在master上添加slave節點,修改jmeter.properties(修改完后重新啟動)
[root@node2 ~]# vim apache-jmeter-4.0/bin/jmeter.properties remote_hosts=192.168.201.123:8899,192.168.201.125:8899 server_port=8899 erver.rmi.ssl.disable=true #禁用ssl
b.配置slaves
vim apache-jmeter-4.0/bin/jmeter.properties remote_hosts=127.0.0.1 server_port=8899 erver.rmi.ssl.disable=true
c.先啟動slaves(關閉防火牆或開通相關端口)
./jmeter-server (成功后顯示:created remote object)
d. 在master遠程執行測試
- 制作測試計划 - run --> remote start/remote stop
e. 使用命令行遠程壓力測試(-r遠程)
jmeter -n -t linus_users_api.jmx -r -l result.jtl -e -o /usr/local/software/jmeter/temp/ResultReport
16. springboot打包,並使用Jar包方式部署
描述:使用圖形界面比較消耗性能
打包:mvn package && java -jar target/gs-spring-boot-0.1.0.jar & (G:\jmeter\資料\阿里雲部署jar包) nohup java -jar gs-spring-boot-0.1.0.jar & 訪問:http://192.168.201.8:8080/users
17.Jmeter非GUI界面
參數: https://jmeter.apache.org/usermanual/get-started.html
-h 幫助 -n 非GUI模式(GUI模式下比較消耗性能) -t 指定要運行的jmeter測試腳本文件 -l 記錄結果文件,每次運行之前(要確保之前沒有運行過,即xxx.jtl不存在,不然報錯) -r jmeter.properties文件中指定所有遠程服務器 -e 在腳本運行結束后生成html報告 -o 用於存放html報告的目錄(目錄要為空,不然報錯) jmeter -n -t linus_users_api.jmx -l result.jtl -e -o /usr/local/software/jmeter/temp/ResultReport [root@node2 ~]# jmeter -n -t jmx/user_api.jmx -l result.jtl -e -o jmx/report/ Creating summariser <summary> Created the tree successfully using jmx/user_api.jmx Starting the test @ Thu Jun 07 13:40:09 CST 2018 (1528350009144) Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 summary = 12000 in 00:00:17 = 687.2/s Avg: 290 Min: 0 Max: 3435 Err: 0 (0.00%) Tidying up ... @ Thu Jun 07 13:40:27 CST 2018 (1528350027503) ... end of run
壓測實戰之jtl文件生成和查看
threads group --> add --> listener --> summary report
18.Jmeter壓測接口的性能優化
- 使用非GUI模式,jmeter -n -t test.jmx -l result.jtl
- 少使用listener,如果使用-l參數,它們都可以被刪除或禁用
- 在加載測試期間不要使用“查看結果樹”或“查看結果”表監聽器,只能在調試階段使用它們來測試腳本
- 包含控制器在這里沒有幫助,因為它將文件中的所有測試元素添加到測試計划中
- 不要使用功能模式,使用CSV輸出而不是XML
- 只保存你需要的數據,盡可能少地使用斷言
- 如果測試需要大量數據,可以提前准備好測試數據放到數據文件中,以CSV READ方式讀取
- 用內網壓測,減少其他帶寬壓測結果
- 如果壓測大流量,盡量用多幾個節點以非GUI模式向服務器施壓
19.Jmeter壓測生成多維度圖形化HTML測試報告
[root@node2 ~]# jmeter -n -t jmx/user_api.jmx -l result.jtl -e -o jmx/report/ [root@node2 ~]# cd jmx/report/ [root@node2 report]# ll total 28 drwxr-xr-x. 5 root root 40 Jun 7 13:40 content -rw-r--r--. 1 root root 8986 Jun 7 13:40 index.html -rw-r--r--. 1 root root 15437 Jun 7 13:40 README.TXT drwxr-xr-x. 5 root root 89 Jun 7 13:40 sbadmin2-1.0.7
Jmeter圖形化HTML壓測報告dashboard
a. test and report information
- source file: jtl文件名
- start time: 壓測開始時間
- end time: 壓測結束時間
- filter for display: 過濾器
- lable: sampler采樣名稱
b. APDESX(application performance index)
apdex: 應用程序性能指標,范圍在0-1之間,1表示達到所有用戶均滿意
T(Toleration threshold): 可接受閥值
F(Frustration threshold):失敗閥值
c. requests summary
- ok: 成功率
- ko: 失敗率
d. statistics 統計數據(核心數據)
- lable: sampler采樣器名稱
- samples: 請求總數,並發數*循環次數
- KO: 失敗次數
- Error: 失敗率
- Average: 平均響應時間
- Min: 最小響應時間
- Max: 最大響應時間
- 90th pct: 90%的用戶響應時間不會超過這個值(關注這個就可以,因為95%與99%是有極端值的)
如2ms,3ms,4,5,2,6,8,8,3,9,先把整個響應時間排序,90%從小到大,還有10%最大的去掉,如去掉9,然后90%用戶都不會超過8
- 95th pct: 95%的用戶響應時間不會超過這個值
- 99th pct: 99%的用戶響應時間不會超過這個值(存在極端值)
throughtput: request per second吞吐量 qps
received:每秒從服務器接收的數據量
send:每秒發送的數據量
Jmeter圖形化HTML壓測報告Charts
a. over time(隨着時間的變化)
- response time over time: 響應時間變化趨勢(一般開頭都比較高)
- response time percentiles over time(successful response) : 最大、最小
- active threads over time: 並發用戶數趨勢(從0開始增長都設置的並發數)
- bytes throughput over time: 每秒接收和請求字節數變化,藍色表示發送,黃色表示接收(從開始慢慢增長)
- latencies over time: 平均響應延時趨勢
- connect time over time: 連接消耗時間趨勢(如tcp等三次握手時間)
b.thoughput
- hits per second(excluding embedded resources): 每秒點擊次數
- codes per second (excluding embedded resources): 每秒狀態碼數量
- transactions per second : 每秒事務數,tps , 如轉賬會涉及事務
- response time vs request: 響應時間和請求數對比
- latency vs request: 延遲時間和請求數對比
c. response times
- response time percentiles: 響應時間百分比
- response time overview: 響應時間概述
- time vs threads: 活躍線程數和響應時間
- response time distribution: 響應時間分布圖
20.利用JMeter的錄制功能對Web網頁進行壓力測試
- 新生成一個Test Plan,為它新增一個Thread Group。為這個Thread Group
- 新建一個錄制模板
- 配置http test script recorder
- 設置瀏覽器代理