性能測驗概要
性能測驗是軟體測驗中的一種,它可以衡量系統的穩定性、擴展性、可靠性、速度和資源使用,它可以發現性能瓶頸,確保能滿足業務需求,很多系統都需要做性能測驗,如Web應用、資料庫和作業系統等,
性能測驗種類非常多,有些概念也很相近:
- Load Testing
- Baseline Testing
- Smoke Testing
- Stress Testing
- Soak Testing
- Endurance Testing
- Capacity Testing
- Longevity Testing
- Peak Testing
- Spike Testing
- Volume Testing
- Capacity Tests
- Reliability Testing
- Scalability Testing
性能測驗的工具
同樣,性能測驗的工具也非常多:
- Apache JMeter
- HP LoadRunner
- Gatling
- Blazemeter
- k6
- NeoLoad
- TestComplete
- Silk Performer
- Rational Performance Tester
- Apica LoadView
- AppDynamics
- Dynatrace
- New Relic
很難說哪個工具是最好的,這取決于你的需求和預算,如果你想要開源易用的,那JMeter是一個不錯的選擇,如果你想要一個商用的工具,不妨試試LoadRunner和NeoLoad,重要的一點是,沒有任何一款工具可以應對所有性能測驗,很多時候我們需要組合使用,
JMeter的分布式測驗
我將在本文詳細介紹JMeter的分布式測驗,我們經常會通過它來做性能測驗,
在分布式測驗角色中,我們需要一個控制節點Controller,還有多個作業節點Workers,如果你想你的請求增加,那可以通過不斷增加作業節點來實作,Controller控制Workers,但它不跑具體的測驗案例,Workers是連接目標系統來做具體測驗的,
整個系統架構大概如下:

Worker可以在不同的服務器上,所以叫分布式,也因此可以利用多臺電腦的資源來模擬足夠的請求,
詳細步驟
我將一步步介紹如何使用JMeter分布式測驗來做性能測驗,大致架構如下:

Controller我放在Mac上跑,Workers我是通過兩臺Ubuntu服務器來跑,要注意它們的IP是在同一內網上的,目標系統為了省事,我直接請求 Bing, stackoverflow, QQ,
Step 1: 安裝JDK
Apache JMeter是用Java寫的,運行它需要Java運行環境,在Ubuntu安裝如下:
sudo apt install openjdk-11-jdk
Stpe 2: 下載Apache JMeter
去官網的 download page 下載最新的JMeter包apache-jmeter-5.5.zip,然后解壓:
unzip apache-jmeter-5.5.zip
所有節點都需要下載安裝,
Controller的位置如下:
/Users/larry/Software/apache-jmeter-5.5
Workers的位置如下:
home/larry/software/apache-jmeter-5.5
你不必位置和我一樣,我列出來是為了與后面的命令對應上,
Step 3: 準備測驗的JMX檔案
JMeter把所有的測驗資訊都存放在jmx檔案中,打開工具寫測驗案例如下:

然后定義整個測驗怎么跑,這里定義的是使用8個執行緒,60秒的熱身和120秒的持續時長:

檔案我放在這:
$ ls /Users/larry/Software/apache-jmeter-5.5/projects/pkslow
performance-test.jmx
我的案例只是Controller需要這個jmx檔案,Worker是不需要的,它們可以通過RMI來互動,
Step 4: 啟動Workers
要先啟動Workers,以服務器模式來啟動,啟動后不會執行什么測驗,它會等待與它連接的Controller和指令:
- Worker 1:
$ /home/larry/software/apache-jmeter-5.5/bin/jmeter-server -Dserver.rmi.ssl.disable=true -Djava.rmi.server.hostname=192.168.50.171
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.50.171:41709](local),objID:[-2af2edf6:1882245cfde:-7fff, 1980465993472976097]]]
- Worker 2:
$ /home/larry/software/apache-jmeter-5.5/bin/jmeter-server -Dserver.rmi.ssl.disable=true -Djava.rmi.server.hostname=192.168.50.60
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.50.60:45337](local),objID:[18489452:1882246a88b:-7fff, 4749047852254882466]]]
“注意: 可能會遇到java.rmi.RemoteException,如果你沒指定引數:
java.rmi.server.hostname.
$ ./software/apache-jmeter-5.5/bin/jmeter-server -Dserver.rmi.ssl.disable=true
May 15, 2023 5:43:16 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[127.0.1.1:33021](local),objID:[-7155c199:1881ecaf233:-7fff, -6972385484103483700]]]
Server failed to start: java.rmi.RemoteException: Cannot start. ubuntu is a loopback address.
An error occurred: Cannot start. ubuntu is a loopback address.
Step 5: 啟動Controller
所有Workers就位后,就等主帥一聲令下,啟動時要指定jmx檔案,報告生成的位置,還有Worker的IP,如下:
$ cd /Users/larry/Software/apache-jmeter-5.5/
$ ./bin/jmeter -n -t projects/pkslow/performance-test.jmx -l projects/pkslow/performance-test.csv -e -o projects/pkslow/Reports -Dserver.rmi.ssl.disable=true -R 192.168.50.171,192.168.50.60
Creating summariser <summary>
Created the tree successfully using projects/pkslow/performance-test.jmx
Configuring remote engine: 192.168.50.171
Configuring remote engine: 192.168.50.60
Starting distributed test with remote engines: [192.168.50.171, 192.168.50.60] @ May 16, 2023 10:37:31 PM CST (1684247851079)
Remote engines have been started:[192.168.50.171, 192.168.50.60]
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 1 in 00:00:02 = 0.7/s Avg: 1260 Min: 1260 Max: 1260 Err: 0 (0.00%) Active: 2 Started: 2 Finished: 0
summary + 111 in 00:02:31 = 0.7/s Avg: 4433 Min: 41 Max: 50474 Err: 4 (3.60%) Active: 15 Started: 16 Finished: 1
summary = 112 in 00:02:33 = 0.7/s Avg: 4405 Min: 41 Max: 50474 Err: 4 (3.57%)
summary + 64 in 00:00:19 = 3.3/s Avg: 25706 Min: 62 Max: 66745 Err: 31 (48.44%) Active: 0 Started: 16 Finished: 16
summary = 176 in 00:02:52 = 1.0/s Avg: 12151 Min: 41 Max: 66745 Err: 35 (19.89%)
Tidying up remote @ May 16, 2023 10:40:24 PM CST (1684248024629)
... end of run
更多資訊可以查看 jmeter.log:
$ tail -f jmeter.log
2023-05-16 22:40:29,956 INFO o.a.j.r.d.JsonExporter: Found data for consumer statisticsSummary in context
2023-05-16 22:40:29,957 INFO o.a.j.r.d.JsonExporter: Creating statistics for overall
2023-05-16 22:40:29,957 INFO o.a.j.r.d.JsonExporter: Creating statistics for other transactions
2023-05-16 22:40:29,957 INFO o.a.j.r.d.JsonExporter: Checking output folder
2023-05-16 22:40:29,958 INFO o.a.j.r.d.JsonExporter: Writing statistics JSON to /Users/larry/Software/apache-jmeter-5.5/projects/pkslow/Reports/statistics.json
2023-05-16 22:40:30,006 INFO o.a.j.r.d.ReportGenerator: Exporting data using exporter:'html' of className:'org.apache.jmeter.report.dashboard.HtmlTemplateExporter'
2023-05-16 22:40:30,007 INFO o.a.j.r.d.HtmlTemplateExporter: Will generate dashboard in folder: /Users/larry/Software/apache-jmeter-5.5/projects/pkslow/Reports
2023-05-16 22:40:30,142 INFO o.a.j.r.d.HtmlTemplateExporter: Report will be generated in: /Users/larry/Software/apache-jmeter-5.5/projects/pkslow/Reports, creating folder structure
2023-05-16 22:40:30,145 INFO o.a.j.r.d.TemplateVisitor: Copying folder from '/Users/larry/Software/apache-jmeter-5.5/bin/report-template' to '/Users/larry/Software/apache-jmeter-5.5/projects/pkslow/Reports', got message: /Users/larry/Software/apache-jmeter-5.5/projects/pkslow/Reports, found non empty folder with following content [/Users/larry/Software/apache-jmeter-5.5/projects/pkslow/Reports/statistics.json], will be ignored
2023-05-16 22:40:30,472 INFO o.a.j.JMeter: Dashboard generated
Worker收到指令也會開始作業并列印一些簡單的日志:
$ /home/larry/software/apache-jmeter-5.5/bin/jmeter-server -Dserver.rmi.ssl.disable=true -Djava.rmi.server.hostname=192.168.50.171
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.50.171:44621](local),objID:[4d13369d:18824fd059a:-7fff, 2287886479123818682]]]
Starting the test on host 192.168.50.171 @ 2023 May 16 22:37:31 HKT (1684247851980)
Warning: Nashorn engine is planned to be removed from a future JDK release
Finished the test on host 192.168.50.171 @ 2023 May 16 22:40:24 HKT (1684248024679)
Step 6: 結果和報告
整個測驗跑完后,可以找到對應的結果:
$ ls -l /Users/larry/Software/apache-jmeter-5.5/projects/pkslow/
total 72
drwxr-xr-x 6 larry staff 192 May 16 22:40 Reports
-rw-r--r-- 1 larry staff 23472 May 16 22:40 performance-test.csv
-rw-r--r-- 1 larry staff 10593 May 16 09:50 performance-test.jmx
在Reports目錄下直接打開 index.html:


其它提示
改變Worker的埠
Worker的默認埠是1099,但它是可以改變的,有些時候也必須改變,如設定的防火墻,或者需要在同一臺Server啟動多個Worker,具體命令如下:
$ /home/larry/software/apache-jmeter-5.5/bin/jmeter-server -Dserver.rmi.ssl.disable=true -Djava.rmi.server.hostname=192.168.50.60 -Dserver_port=1984
當然,Controller也要同步調整自己的命令:
$ ./bin/jmeter -n -t projects/pkslow/performance-test.jmx -l projects/pkslow/performance-test.csv -e -o projects/pkslow/Reports -Dserver.rmi.ssl.disable=true -R 192.168.50.171:1984,192.168.50.60:1984
使用nohup來跑測驗
性能測驗有時需要跑很長時間,建議使用nohup模式來運行:
$ nohup ./bin/jmeter -n -t projects/pkslow/performance-test.jmx -l projects/pkslow/performance-test.csv -e -o projects/pkslow/Reports -Dserver.rmi.ssl.disable=true -R 192.168.50.171:1984,192.168.50.60:1984 &
[1] 81248
指定結果時添加時間
這樣很清晰知道是什么時候開始跑的,也避免目錄存在報錯,
$ nohup ./bin/jmeter -n -t projects/pkslow/performance-test.jmx -l projects/pkslow/performance-test."$(date +%F.%T)".csv -e -o projects/pkslow/Reports-"$(date +%F.%T)" -Dserver.rmi.ssl.disable=true -R 192.168.50.171:1984,192.168.50.60:1984 &
不過這樣也要注意定期清理不需要的結果,以免占用硬碟空間,
總結
性能測驗是非常重要的,而Apache JMeter開源又好用,可以在專案中使用起來,
最后:這里有我建立的一個專門交流軟體測驗方面問題的學習群,里面也有很多大公司的技術大牛,很多時候,技術大牛的幾句話就會讓我們醍醐灌頂,少浪費時間,如果想要多跟有經驗的人學習,就找我加入我的軟體測驗交流群,以后有作業的內推機會都相互推薦一下,畢竟我們是關系社會,

軟體測驗技術交流群社:786229024 等待你的加入... 大家可以一起探討交流,共同學習軟體測驗技術、面試等軟體測驗方方面面,還會有免費直播課,識訓更多測驗技巧,我們一起進階Python自動化測驗/測驗開發,走向高薪之路,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552939.html
標籤:其他
下一篇:返回列表
