做爲一名後端開發人員,熟練掌握一款性能測試工具很是有必要,這樣有利於在技術選型時作一些參考。
常見的性能測試工具備:ab,JMeter,LoadRunner,他們都有各自的特色和應用場景:html
http://jmeter.apache.org/download_jmeter.cgijava
JMeter是基於Java開發的跨平臺性能測試工具,官方提供了2種壓縮格式的二進制包(zip和tgz),根據實際狀況下載對應文件便可。
安裝也很是簡單,直接將壓縮包解壓到指定目錄便可,以下示例:linux
$ tar xzvf apache-jmeter-5.2.1.tgz -C ~/opt
添加JMeter到環境變量PATH中,以下示例:git
$ export JMETER_HOME=~/opt/apache-jmeter-5.2.1 $ export PATH=$PATH:$JMETER_HOME/bin
配置好JMeter環境變量以後,在命令行終端中執行命令jmeter
便可啓動JMeter圖形化界面。web
使用JMeter分爲3個步驟:shell
所謂測試計劃就是一系列測試配置信息的集合,在JMeter中能夠將這些配置信息保存爲一個腳本文件(後綴名爲「.jmx」)。
測試計劃中涉及許多配置對象,詳見:Elements of a Test Plan,理解這些配置對象是編寫JMeter測試計劃的前提,各個配置對象的名稱及含義解釋以下:apache
通常來說,上述對象之間具有嵌套關係,描述以下:
(1)一個測試腳本中只有一個Test Plan對象,而且做爲其餘對象的根。
(2)在Test Plan下能夠有一個或者多個Thread Group(一般只須要有一個便可),能夠有一個或者多個Listener,如:View Results Tree(以樹型結構展現),還能夠配置Assertion,Timer,Configuration Element,Pre Processor,Post Processor,Test Fragment,Non-Test Element。
(3)在Thread Group下能夠配置Controller,Sampler,Assertion,Timer,Configuration Element,Pre-Processor,Post-Processor,Test Fragment,Listener。
(4)Controller下能夠配置Controller,Sampler,Assertion,Timer,Configuration Element,Pre-Processor,Post-Processor,Listener。
(5)在Sampler下能夠配置Assertion,Timer,Configuration Element,Pre-Processor,Post-Processor,Listener。後端
用一個樹型結構來描述各對象之間的嵌套關係以下:bash
如上所述,只有Test Plan,Thread Group,Controller和Sampler能夠嵌套其餘對象,而Assertion,Timer,Configuration Element,Pre-Processor,Post-Processor,Listener,Test Fragment和Non-Test Element不能再嵌套子對象。
實際上,在JMeter圖形化界面中編輯測試計劃時,指定對象下是否能夠再嵌套子對象在操做菜單中就作了限制。服務器
以下圖所示是一個在實際應用中可能會涉及到的對象嵌套關係配置示例:
而且對象在運行時的執行順序以下:
首先,定時器(Timers),斷言(Assertions),前置和後置處理器(Pre,Post-Processors)只有在應用它們的採樣器存在時纔會運行;
其次,控制器(Controllers)和採樣器(Samplers)按照它們在測試計劃配置樹中出現的順序執行;
最後,其餘對象按照它們出現的範圍和類型順序執行,在一個特定類型的對象範圍內,按照它們在測試計劃配置樹中出現的順序執行;
上述這一堆闡述重點在於理解各個測試對象的做用,以及在什麼位置使用它們,至於對象的執行順序理解便可,不用死記硬背。
關於JMeter中的組件列表,詳見:Introduction 。
JMeter的測試計劃有2種方式生成:
最佳實踐是針對不一樣的場景選擇對應的測試計劃生成方式,好比:對於接口測試使用手動編寫可能更加合適,而對於網頁的測試,使用錄製腳本的方式會更加方便。
在GUI模式下編輯測試計劃時,關鍵在於理解清楚JMeter中涉及的配置對象的做用,在此基礎上就能夠藉助圖形化界面設計測試計劃並將其保存爲一個腳本文件。
具體的測試計劃編寫能夠參考官方的一個Web測試計劃示例:Building a Web Test Plan。
設置「Ramp-up period」參數
在手動編寫測試計劃時,值得注意點的是:線程池參數「Ramp-up period」值必定要設置合理,該參數的設置關係到測試啓動時是否會給服務器帶來很是大的衝擊甚至過載,或者是達不到性能測試的要求。
「Ramp-up period」參數的含義是設置一個時長(單位:秒),使得在Thread Group中設置的線程根據該時長逐步啓動。
舉例說明:
(1)在Thread Group中設置線程數爲10,Ramp-up period參數設置爲100s,JMeter將會在100s內逐步啓動10個線程,也就是說,每一個線程的啓動間隔爲10s(100s/10),可能最後一個線程啓動的時候第一個線程已經結束。
(2)在Thread Group中設置線程數爲100,Ramp-up period參數設置爲10s,每一個線程的啓動間隔爲0.1s(10s/100),可能在測試剛啓動時給服務器產生很大的負載。
綜上所述,Ramp-up period參數值不能設置太大,也不能設置過小,JMeter官方文檔的解釋是:能夠將該參數值與線程數設置爲相同,或者比線程數略大或稍小便可。
根據經驗來說,通常須要將Ramp-up period參數值設置比線程數略小更加合適。
其餘一些關於Ramp-up period參數的設置技巧能夠參考:
除了常見的Web測試,JMeter官方也給出了許多其餘類型的測試計劃示例,詳見:User's Manual 。
錄製測試腳本就是經過工具自動生成測試測試的方式,在JMeter中這種方式更適合於Web頁面測試,可是實踐中發現,自動生成的測試用例也很難直接就能用於性能測試,還須要對測試用例作一些調整。
不管怎樣,有勝於無,經過腳本錄製方式仍是能在必定程度上減小手動編輯測試計劃的工做量。
在JMeter中錄製測試腳本有2種方式:
更多關於錄製JMeter測試腳本的實現能夠參考以下博客:
1.Jmeter學習筆記五錄製腳本
2.JMeter中級篇-1-JMeter自帶的錄製功能舉例
3.利用Jmeter錄製腳本的兩種方法
4.錄製Jmeter腳本的N種方法
5.JMeter中級篇-2-Firefox錄製JMeter腳本的方案
一般來說,使用JMeter進行性能測試不會在GUI模式下進行,GUI圖形化界面一般只用來編寫測試計劃。在GUI模式下調試好測試腳本以後,經過命令行的方式執行測試腳本。
關於JMeter的運行時參數詳見Running JMeter
在命令行執行性能測試的經常使用參數:
-n:非GUI模式
-t:指定測試計劃文件路徑,能夠是相對路徑或者絕對路徑
-l:輸出測試結果文件路徑,能夠是相對路徑或者絕對路徑
-e:輸出測試報告
-o:測試報告保存目錄,能夠是相對路徑或者絕對路徑
示例以下:
$ jmeter -n -t xxx.jmx -l ./yyy.jtl -e -o ./zzz
關於JMeter命令行參數詳見:CLI Mode 。
當在單機環境下使用JMeter沒法模擬足夠的併發量時,可使用分佈式模式進行壓測。
在分佈式模式下,存在一個控制節點Master,多個真正執行測試的從節點Slave,在Master上控制多個Slave進行壓力測試。
具體實現:
jmeter -n -t xxx.jmx -r
關於分佈式模式運行JMeter詳情參考:
JMeter從3.0以後就支持自動生成測試報告,只須要在執行測試時指定參數「-e」和「-o」便可,「-e」參數設置須要自動生成測試報告,「-o」參數指定測試報告目錄(該目錄不能已經存在)。
舉個例子:jmeter -n -t xxx.jmx -l ./yyy.jtl -e -o ./zzz
。
固然,還可使用「-l」參數產生的測試結果文件生成測試報告:jmeter -g ./yyy.jtl -o ./zzz
。
關於JMeter生成測試報告還能夠參考以下文章:
1.JMeter-自動生成測試報告
2.Generating Report Dashboard
性能測試中,咱們最關心的指標是吞吐量和響應時間,在JMeter生成的測試報告中,已經很是人性化地展現了這些指標。
這是由APDEX公司推出的表示應用程序性能滿意度的指標,值範圍爲:0-1,所以,滿意度越接近1說明應用程序的性能越好。
在實際應用中,這個指標僅僅只能做爲應用程序性能的一個很是粗略的判斷依據,由於在性能測試過程當中還要考察響應時間的大小。好比:在一次壓測過程當中全部請求都獲得了響應,此時滿意度可能爲0.99,可是99%的請求響應時間爲1分鐘,這顯然是不可接受的。
在JMeter生成的測試報告中有一個關於響應時間和吞吐量的統計報告,以下圖所示:
首先,須要關注的是99%的請求響應時間(99th pct)統計,會把全部請求的響應時間作統計對比,經過該指標值能夠很是明確地知道接口性能是否達標,若是響應時間不知足要求,則須要考慮是否進行優化。
其次,當響應時間符合預期時還能夠看到接口的吞吐量(Throughput),即:每秒請求數。
在JMeter性能測試報告中,關於響應時間和吞吐量的統計概要也只是一個很是粗略的參考指標,這個統計數據會受到測試用例在啓動和結束時的干擾,更加詳細和準確的統計結果應該查看圖形化的報表,很是直觀。
關於測試結果統計報表的解讀能夠參考:JMeter-自動生成測試報告
JMeter自帶的功能基本能夠完成一些常見的性能測試任務,若是須要實現一些功能更增強大的測試,能夠經過插件的方式進行擴展。
JMeter安裝插件有2種方式:
(1)經過插件管理器下載,實際上JMeter的插件管理器自己也是一個插件,詳見:https://jmeter-plugins.org/install/Install/ 。
(2)手動下載,將插件包下載到$JMETER_HOME/lib/ext目錄,重啓JMeter便可。
1.Concurrency Thread Group
相比起JMeter自帶的Thread Group,該插件能夠模擬更加真實的用戶併發,也能夠很方便地對壓測時間進行設置。
2.HTTP Raw Request
功能比JMeter自帶的Http Request有加強和優化。
3.Raw Data Source
支持從文件中讀取數據,這樣能夠方便造一些壓測須要的數據。
4.Transaction Throughput vs Threads
查看線程數與吞吐量的對比關係,能夠很是直觀地看到系統性能隨着併發數的提升而產生的變化。
更多JMeter插件能夠從JMeter Plugins下載。
除了豐富的插件,更多關於JMeter的最佳實踐能夠參考:Best Practices 。
關於對JMeter的擴展,詳見:How to write a plugin for JMeter 。
Q1: java.net.NoRouteToHostException: Cannot assign requested address
緣由: 因爲linux分配的客戶端鏈接端口用盡,沒法創建socket鏈接所致,雖然socket正常關閉,可是端口不是當即釋放,而是處於 TIME_WAIT 狀態,默認等待60s後釋放。
查看linux支持的客戶端鏈接端口範圍,也就是28232個端口。cat /proc/sys/net/ipv4/ip_local_port_range
,端口範圍:32768 - 61000
。
解決:
1.調低端口釋放後的等待時間,默認爲60s,修改成15~30s。echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
2.修改tcp/ip協議配置,經過配置/proc/sys/net/ipv4/tcp_tw_reuse
,默認爲0,修改成1,釋放TIME_WAIT端口給新鏈接使用:echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
3.修改tcp/ip協議配置,快速回收socket資源,默認爲0,修改成1。echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
即總共須要執行以下命令:
$ echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse $ echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle $ echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
另外,若是非root用戶執行上述命令時可能會遇到權限錯誤:
$ echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse bash: /proc/sys/net/ipv4/tcp_tw_reuse: Permission denied
甚至在命令以前加上sudo
再執行也依然報錯:
$ sudo echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse bash: /proc/sys/net/ipv4/tcp_tw_reuse: Permission denied
此時應該經過另外的方式執行:
$ sudo bash -c 'echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse' $ sudo bash -c 'echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle' $ sudo bash -c 'echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout'
Q2: 使用JMeter發送POST請求時中文參數在服務器端接收到時爲亂碼
解決: 在Jmeter中設置「Content-encoding」爲:utf-8 。
【參考】
http://www.cnblogs.com/fnng/archive/2012/12/22/2829479.html JMeter基礎之一 一個簡單的性能測試
https://www.testwo.com/article/357 使用JMeter進行負載測試——終極指南
http://www.cnblogs.com/qmfsun/p/6381767.html JMeter執行壓測輸出HTML圖形化報表(二)
https://my.oschina.net/ydsakyclguozi/blog/536416 Jmeter中的幾個重要測試指標釋義
https://moonbingbing.gitbooks.io/openresty-best-practices/flame_graph.html 火焰圖
https://my.oschina.net/shichangcheng/blog/1560864 JMeter 進行壓力測試
https://blog.csdn.net/wwq_1111/article/details/59512546 JMeter壓力測試遇到的問題彙總
https://www.infoq.cn/article/k9kx0RxEbhht*iluT9iV 推薦幾款經常使用的性能測試工具
https://www.edureka.co/blog/what-is-software-testing/ 涉及軟件測試的文章博客
http://blog.csdn.net/lzqinfen/article/details/46326281 JMeter報錯the target server failed to respond--JMeter的坑
https://www.jianshu.com/p/130c7fddeddf Jmeter-使用Stepping Thread Group插件來設置負載場景
http://www.cnblogs.com/YatHo/p/6092599.html jmeter壓力測試報告 - DEMO