什么是性能壓測?
-
也是最近剛剛接觸到,就是被測試的系統,在一定的訪問壓力下,看程序運行是否穩定/服務器運行是否穩定,通常情況,是模擬多個請求同時 請求服務器,也就是在某個時間內,比如說1秒內,調用接口達到200次,結果就是接口調用成功率、最大請求花費時間、最小請求花費時間還有一些性能參數,做性能壓測目前來講大多數來說都是借助 工具軟件來完成的,真正去寫一套腳本來完成性能壓測的步驟已經很少很少了,所以我們接下來講的就是比較常用的工具-Jme
前期准備!!!
- 首先,你要去官方那里下載Jmeter的壓縮包,官方地址是http://jmeter.apache.org/,另外,你的系統要配置好java環境,我寫這篇博客的時候,用的版本是3.0,下載完了之后,進入里面的bin目錄下, 找到jmeter.bat這個批處理文件,然后雙擊,進入jMeter的工作界面,這里面有很多功能,這我們先別去理會這一些,按照我們下面的步驟一點一點來做就可以一個基本的壓力測試了.
Jmeter性能參數配置
- 線程數:一個用戶占一個線程,200個線程就是模擬200個用戶;
-
Ramp-Up Period(in seconds):設置線程需要多長時間全部啟動。如果線程數為200 ,准備時長為10 ,那么需要1秒鍾啟動20個線程。也就是每秒鍾啟動20個線程;
-
循環次數:每個線程發送請求的次數。如果線程數為200,循環次數為10,那么每個線程發送10次請求。總Samples為200*10=2000。如果勾選了“永遠”,那么所有線程會一直發送請求,直到選擇停止運行腳本。
-
注意,如果要真正模擬多個用戶並發的話,比如說你要模擬100個用戶並發,那么你的線程數一定得是100,不能是25個線程,每個線程 內包含4個請求,舉個栗子,假如有4個接口,要模擬2000個用戶並發,每個接口500個用戶,那么你的解決方案是:建立4個線程組,每個線程組的線程數是500,同時並發運行4個線程組(這一點你不用做,jmeter的機制 就是線程組都是並發運行的,不用擔心這個)
Summary Report參數解釋
- Samples:發送了多少個請求;
- Average:平均請求時間;
- Min:最小請求時間;
- Max:最大請求時間;
- Error:請求失敗率;
- Troughput:Throughput,即每秒鍾服務器處理的Samples,單位是tps(transaction per second),也有說成是rps(request per second);
- KB/sec:服務器每秒接收的數據量;
- 90% Line:90%請求響應時間不會超過XX秒;
- Median:中位數,50%響應時間小於XX秒;
調度器的使用?
答:
-
Jmeter的線程組設置里有一個調配器設置,用於設置該線程組下腳本執行的開始時間、結束時間、持續時間及啟動延遲時間.
-
啟動時間:測試計划什么時候啟動,啟動延遲會覆蓋它。當啟動時間已過,手動運行腳本時也當前時間也會覆蓋它(但啟動時間頁面顯示不會變);
-
結束時間:測試計划什么時候結束,持續時間會覆蓋它;
-
持續時間(秒):測試計划持續多長時間,會覆蓋結束時間;
-
啟動延遲(秒):測試計划延遲多長時間啟動,會覆蓋啟動時間.
影響性能壓測的參數有哪些?
答:
-
(1).系統服務器所在機器的環境,包含硬件配置內存大小和系統,首先內存大小是這樣,比如我們的內存條大小是4G,那么服務器分給用戶可支配的大小可能只有3G,剩余的1G用於 系統自身調用,其次,取決於我們當前服務器所在的系統,實際上對應的就是不同的系統默認設置的線程棧所占用的內存大小不同,我們通常所說的線程對應的我們的物理資源就是 線程棧所占用的內存,不同的系統這個值是不同的,可以在裝完系統后進行更改,假如我們用戶所支配的內存大小是3G,windows一個線程棧是1M,那么當前服務器最多也就支持 3*1024個線程並發,超過這個數目,就需要等待前面的線程完畢之后才能執行,也就是所說的等待狀態.
-
(2).web 服務器的配置,我們目前的接口基本上 都是部署在tomcat上,tomcat自身會有一個關於進程的配置,包括最大進程連接數、請求超時時間等.
如何添加關於服務器的CPU、內存等的測試查詢?
答:
-
1.下載Jmeter Plugins manager插件,下載地址 http://jmeter-plugins.org/downloads/all/ ;
-
2.解壓文件,並將jmeter-plugins-tst-2.0.jar放在jmeter-3.0\lib\ext路徑下;
-
3.重啟Jmeter,並點擊上方菜單選項->Plugins Manager;
-
4.點擊Avalible Plugins並找到Perfmon插件、點擊右下角的Apply Changes and Restart Jmeter;
-
5.重啟后點擊測試計划->添加->監聽器->jp@gc - PerfMon Metrics Collector;
-
6.下載Jmeter ServerAgent插件,下載地址 http://jmeter-plugins.org/downloads/file/ServerAgent-2.2.1.zip;
-
7.解壓文件,並將文件放到服務器所在的機器上,目前這款插件支持windows、linux環境;
-
8.啟動ServerAgent,windows用bat啟動,linux用sh啟動,默認占用端口4444;
-
9.在Jmeter的打開界面的jp@gc - PerfMon Metrics Collector插件中配置Host/IP為服務器的IP,然后添加測試的內容,有CPU、內存、網絡等;
-
10.在UI方式執行測試計划,就會有結果,但目前還未找到命令行生成的測試查詢包含這個插件
如何通過命令行的方式執行測試計划並生成html測試查詢?
答:
- 執行命令:jmeter -n -t “test JMX file” -l “test log file” -e -o “Path to output folder”
- 參數解釋:
test JMX file-測試計划所在的文件 支持格式為.jmx文件格式;
test log file-默認生成的測試查詢文件 支持格式為.jtl或者csv文件格式,默認是.jtl;
Path to output folder-html測試查詢存放的路徑,是個文件夾; - Jmeter配置:在jmeter.properties或者user.properties確認如下配置項;
- jmeter.save.saveservice.bytes = true
- jmeter.save.saveservice.label = true
- jmeter.save.saveservice.latency = true
- jmeter.save.saveservice.response_code = true
- jmeter.save.saveservice.response_message = true
- jmeter.save.saveservice.successful = true
- jmeter.save.saveservice.thread_counts = true
- jmeter.save.saveservice.thread_name = true
- jmeter.save.saveservice.time = true
- jmeter.save.saveservice.timestamp_format = ms
- jmeter.save.saveservice.timestamp_format = yyyy/MM/dd HH
ss
Http請求中的Cookie設置
答:Cookie的設置中,也就是HTTP信息頭管理器中,如果要設置多個key和多個value, 只需要建立一行,名稱是Cookie,值是key1=value1;key2=value2;key3=value3的格式
GUI和Shell壓測方式的差異
1.GUI頁面更適合單次調試或者少並發的情況下,否則大並發下易造成聚合報告、查看結果樹等加載緩慢,圖形卡死;
2.Shell頁面實時統計(每30s刷新一次)請求總數、平均響應時間、最小請求時間、最大請求時間以及並發量;
3.Shell頁面壓測過程中,會實時在指定日志文件中記錄每個線程每個請求的執行過程,展示項可在jmeter.properties文件中的jmeter.save.saveservice選項下個性化設置;
4.Shell頁面壓測結束后,會產出更加詳細數據以及可視化的html格式的測試報告,更加便於查看和統計(如若壓測過程中手動停止壓測,如ctrl+c,則不會產生報告);
BeanShell和自定義函數實現MD5算法的差異
BeanShell作為前置處理器中的一種,會在線程發送請求前完成所需操作,如本次壓測過程中,由於業務需求,需要進行簽名操作,它是腳本語言,動態加載執行,所以效率不高,不太適合放在循環內部,易造成多線程同時調用BeanShell,阻塞在發送在http請求前,實際上客戶端並沒有在單位時間內發送預期請求數到達服務器端,從而看到服務器的吞吐量和預期並發量相差很多。
Websocket相關壓測
答:Jmeter本身不支持websocket協議的,所以需要安裝第三方的插件還有6個依賴包。鏈接: http://pan.baidu.com/s/1kV8QmN1 密碼: hx2v 安裝方式很簡單,解壓完成以后直接放到jmeter的\lib\ext\目錄下,然后重啟Jmeter就OK了,以下為各項參數含義
WebServer:
(1)Server Name or IP:WebSocket發送的目標服務器的地址或者名稱;
(2)Port Number:WebSocker服務器監聽的端口號。(一般是HTTP 80端口,可以通過WireShark數據包得到);
Timeout:
(1)Connection – 發送一個連接請求后,Jmeter等待連接完成的最長時間,單位是毫秒;
(2)Response - 對響應消息的最大等待時間;
WebSocket Request:
(1)Implementation – 只支持RFC6455(v13) ,WebSocket協議標准的最新版;
(2)Protocol – 有ws與wss之分, ws前綴是WebSocket連接的辨別標識,wss前綴是WebSocket安全連接的辨別標識。根據自己的實際情況填寫;
(3)Streaming Connection – 選擇這個TCP session要不要保持,如果勾上標識連接會一直存在,如果沒有勾上,那么得到第一次響應后該鏈接就會被關閉;
(4)Request data:填入將要發送的請求,要跟開發溝通好,這個是什么格式的消息;
WebSocket Response:
(1)Response Pattern – 采樣器將等待含有該標識的消息並繼續通信(或者直到timeout,該連接關閉);
(2)Close Connection Pattern – 如果服務器返回的消息含有這樣的字符,就結束會話;
(3)Message Backlog – 定義服務器返回消息保留的最大長度;
Jmeter上完成Websocket的壓測主要流程會涉及到以下三個請求
第一步是http get請求,如http://192.168.6.233:8445/socket.io/?token=test&clientId=GYjJPnSWXYtxb&EIO=3&transport=polling&t=test,得到的response會含有一個字典包含一個字段叫做['sid'],把對應的value值拿到 (可以采用后置處理器中的正則表達式提取器),這一步實現就是向服務器第一次握手,服務器返回唯一的一個會話id;
第二步是http get請求,如http://192.168.6.233:8445/socket.io/?token=test&clientId=GYjJPnSWXYtxb&EIO=3&transport=polling&t=test&sid=value,就是在第一步請求后拼接上sid=value,value等於第一步拿到的值,這一步實現的是向服務器傳輸一條數據,然后服務器返回響應數據,第二次握手;
第三步是websocket請求,如ws://192.168.6.233:8445/socket.io/?token=test&clientId=GYjJPnSWXYtxb&EIO=3&transport=websocket&t=test&sid=value,就是在第二步請求上將transport=polling改為transport=websocket,這一步實現的是和服務器正式確認連接;
結語:
跟大家推薦一個學習資料分享群:747981058,里面大牛已經為我們整理好了許多的學習資料,有自動化,接口,性能等等的學習資料!人生是一個逆水行舟的過程,不進則退,咱們一起加油吧!