Software testing — use JMeter + Grafana to evaluate the Web performance and perform live monitoring

Introduction
最近開始學習Performance test ,分享筆記與個人經驗 ,有謬誤之處請不吝給予指教 ,謝謝!
在網站上線前 ,有幾個問題是團隊需要考慮的: 1.系統在不同數量的使用者連線下 ,server消化requests的速度有多快? 2.系統可以應付多少同時連線數? 3.系統當下的回應時間有多久?
Performance indicator
要分析問題前得先了解:
- Throughput: 即吞吐量 ,可以分為QPS及TPS 。 — QPS: Query Per Second ,系統每秒接到的請求數 ,計算方式也可以用總請求數除以總時間 (併發數 * 用戶Request數 / 總時間) 。 — TPS: Transaction Per Second ,系統處理能力 ,系統每秒回應數量 。
- Concurrent user: 即併發數 ,也就是系統在同一時間連結的用戶數量 ,可以視為系統負載的程度 。
- Response time: 即響應時間 ,實際上系統所需要的響應時間可分為許多段 ,可參考下圖: - 網絡傳輸時間: N1 + N2 + N3 + N4 - 應用服務器處理時間:A1+A3 - 數據庫服務器處理時間: A2 - 響應時間: N1 + N2 + N3 + N4 + A1 + A2+ A3

How do indicators affect to each other?
以上指標簡單來說可以這樣理解:
Request對CPU消耗越高 ,Response越慢 ,Throughput 越低 。 但其實指標彼此間也並非是線性的關係 ,改變Concurrent Use大小對CPU ,Throughput ,以及Response time的關係如下 ,可分為幾個階段:
- Light load階段: 在此Concurrent user還不多 , CPU工作還未飽和. 在此階段當用戶上升 , CPU loading及Throughput也會隨之上升。
- Heavy load ~ Buckle zone 階段: 當Concurrent user增加到一個程度後, Request數量很高, 會導致線程頻繁切換,用於處理請求的時間反而變少,因此處理的請求數 (Throughput)也隨之降低。

Performance test的目的則是取得系統在穩定狀態下的各項表現(即一開始的三個問題)。
Design a performance test system
JMeter是一套用Java的opensource software ,可以用來測量performance及進行load test ,在使用上有GUI介面且不需要撰寫任何程式碼 ,是對測試人員十分友善的一套工具。
以下將以JMeter為基底 ,將log儲存到InfuxDB用Grafana做視覺化分析。
JMeter installation
- 安裝JDK (1.0.2)。 - 輸入java -version檢查是否安裝成功 - 設定環境變數 JAVA_HOME(e.g., C:\Program Files\Java\jdk10.0.2)及 PATH(e.g., C:\Program Files\Java\jdk10.0.2\bin)
- 安裝JMeter (5.1)。
- 安裝plugin-manager。
Create a simple test script with HTTP(S) recorder
我們可以先用HTTP(S) recorder錄製腳本, 修改後再回放,其原理是以JMeter作為瀏覽器的Proxy,以捕捉瀏覽器的請求及server的response,其步驟如下
1.啟動bin底下的jmeter.bat,右鍵Test Plan: Add->Threads (Users)->Thread Group。

2.右鍵Thread Group: Add->Logic Controller->Recording Controller。

3.右鍵Test Plan: Add->Non-test Elements->HTTP(S) Test Script Recorder。

4.JMeter proxy預設的port為8888,按下start後JMeter會幫我們產生出ApacheJMeterTemporaryRootCA.crt,ApacheJMeterTemporaryRootCA.usr。

5.接著設定瀏覽器(以Firefox為例),先設定Proxy, port同樣設為8888,勾選所有的通訊協定都使用proxy。

6.設定瀏覽器的憑證,匯入JMeter所產生ApacheJMeterTemporaryRootCA.crt。

7.在瀏覽器上輸入你想測試的網址,可以看到Firefox顯示正確的網頁,然後在JMeter上看到透過Firefox訪問的頁面都會記錄在JMeter中。

8.如果停止錄製,則瀏覽器將無法提供服務,記得測試完要將proxy取消

The skills you have to know
1. CSV data set
在某些使用場景下 ,我們可能會用數組帳號密碼而且不希望寫在Test case中 , JMeter提供讀取CSV的方式 。
右鍵Thread Group->Add->Config Element->CSV data set Config ,用法是在File name中指定檔案的位置 ,如${__P(csv, ./test.txt)}的意思是變數名稱為csv ,允許由外部(命令列)傳入 ,若無傳入則使用預設值./test.txt, 格式為jmeter -n -t {test plan名} -G{變數名}=檔案位置 。
jmeter -n -t example.jmx -Gcsv="./test.txt"將值讀進來後儲存到Variable names, 之後在這個程式裡就可以繼續使用 。

2.模擬用戶數(Concurrent users)
在Thread Group的Numbers of Threads中填入數字即可。

上圖填入的是JMeter的變數用法,如${__P(users,3)}的意思是變數名稱為users,允許由外部(命令列)傳入,若無傳入則使用預設值3,格式為jmeter -n -t {test plan名} -G{變數名}=數量。
jmeter -n -t example.jmx -Gusers=103.模擬用戶的Request數
右鍵Thread Group->Add->Logic Controller->Loop Controller,在Loop Count中填入數字即可。

上圖填入的一樣是變數用法,如${__P(loops,100)}的意思是變數名稱為loops,允許由外部(命令列)傳入,若無傳入則使用預設值100。
jmeter -n -t example.jmx -Gloops=10JMeter distributed testing
如果機器的性能不足,JMeter就無法提供夠大的壓力測試service,對此問題JMeter提供了master-slave架構,透過連結多台low-end的機器產生足夠的壓力對server進行測試,其架構很簡單如下:

這個架構是透過RMI (Remote Method Invocation)所完成,RMI可以讓RMI client的JVM調用RMI master JVM中的方法。
Slave的設定
只是單純的load generator,只單純接收來自Master的Test plan,因此Slave端不需要放置任何*.jmx檔案打開terminal後輸入:
jmeter-server.bat可以看到以下畫面:

Master的設定
由於distributed testing下連結的slave數量越多, master會越吃力,因此建議使用console mode, 打開terminal後輸入已下指令:
jmeter -n -t test.jmx -R {IP1},{IP2}- R後面指定slave的IP,這時可以看到master已成功連結到slaves,訊息如下:

而slaves的畫面會有被連結的訊息,此時便已開始進行測試:

Visualization the test results
JMeter可以儲存每回測試的結果,但時間久了之後檔案數量將會很龐大,解決方式是將JMeter的測試結果儲存到InfluxDB中,並且用Grafana做視覺化,從Grafana中可以看到幾乎是及時的測試結果。
InfluxDB

InfluxDB是一套Open source的時序型資料庫,由Go寫成並廣泛應用於監控的應用場景中。
- 下載InfluxDB
- 修改InfluxDB.config:










