avatarJen-Hsuan Hsieh (Sean)

总结

使用 JMeter 和 Grafana 评估 Web 性能和实时监控。

摘要

本文介绍了如何使用 JMeter 和 Grafana 来评估 Web 性能和实时监控。首先介绍了性能测试的目的和指标,然后介绍了如何使用 JMeter 来录制和回放测试脚本。接着介绍了如何使用 JMeter 的 CSV 数据集和模拟用户数和用户请求数的技巧。最后介绍了如何使用 JMeter 的分布式测试和 InfluxDB 和 Grafana 来可视化测试结果。

要点

  • 性能测试的目的是获取系统在稳定状态下的各项表现,包括系统在不同数量的用户连接下 server 消化 requests 的速度,系统可以应付多少同时连接数,系统当下的响应时间有多久。
  • JMeter 是一套用 Java 开发的开源软件,可以用来测量性能和进行负载测试,在使用上有 GUI 界面且不需要撰写任何程序码,是对测试人员十分友善的一套工具。
  • 使用 JMeter 的 CSV 数据集可以读取数组帳號密碼而且不希望写在 Test case 中。
  • 模拟用户数可以在 Thread Group 的 Numbers of Threads 中填入数字即可。
  • 模拟用户的 Request 数可以右键 Thread Group->Add->Logic Controller->Loop Controller,在 Loop Count 中填入数字即可。
  • JMeter 的分布式测试可以解决机器的性能不足,无法提供足够大的压力测试服务的问题。
  • 使用 InfluxDB 和 Grafana 可以将 JMeter 的测试结果可视化,从 Grafana 中可以看到几乎是实时的测试结果。

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

Copy right@A Layman

Introduction

最近開始學習Performance test ,分享筆記與個人經驗 ,有謬誤之處請不吝給予指教 ,謝謝!

在網站上線前 ,有幾個問題是團隊需要考慮的: 1.系統在不同數量的使用者連線下 ,server消化requests的速度有多快? 2.系統可以應付多少同時連線數? 3.系統當下的回應時間有多久?

Performance indicator

要分析問題前得先了解:

  1. Throughput: 即吞吐量 ,可以分為QPS及TPS 。 — QPS: Query Per Second ,系統每秒接到的請求數 ,計算方式也可以用總請求數除以總時間 (併發數 * 用戶Request數 / 總時間) 。 — TPS: Transaction Per Second ,系統處理能力 ,系統每秒回應數量 。
  2. Concurrent user: 即併發數 ,也就是系統在同一時間連結的用戶數量 ,可以視為系統負載的程度 。
  3. Response time: 即響應時間 ,實際上系統所需要的響應時間可分為許多段 ,可參考下圖: - 網絡傳輸時間: N1 + N2 + N3 + N4 - 應用服務器處理時間:A1+A3 - 數據庫服務器處理時間: A2 - 響應時間: N1 + N2 + N3 + N4 + A1 + A2+ A3
Copy right@A Layman

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)也隨之降低。
Copy right@A Layman

Performance test的目的則是取得系統在穩定狀態下的各項表現(即一開始的三個問題)。

Design a performance test system

JMeter是一套用Java的opensource software ,可以用來測量performance及進行load test ,在使用上有GUI介面且不需要撰寫任何程式碼 ,是對測試人員十分友善的一套工具。

以下將以JMeter為基底 ,將log儲存到InfuxDB用Grafana做視覺化分析。

JMeter installation

  1. 安裝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)
  2. 安裝JMeter (5.1)。
  3. 安裝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。

Copy right@A Layman

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

Copy right@A Layman

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

Copy right@A Layman

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

Copy right@A Layman

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

Copy right@A Layman

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

Copy right@A Layman

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

Copy right@A Layman

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

Copy right@A Layman

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, 之後在這個程式裡就可以繼續使用 。

Copy right@A Layman

2.模擬用戶數(Concurrent users)

在Thread Group的Numbers of Threads中填入數字即可。

Copy right@A Layman

上圖填入的是JMeter的變數用法,如${__P(users,3)}的意思是變數名稱為users,允許由外部(命令列)傳入,若無傳入則使用預設值3,格式為jmeter -n -t {test plan名} -G{變數名}=數量。

jmeter -n -t example.jmx -Gusers=10

3.模擬用戶的Request數

右鍵Thread Group->Add->Logic Controller->Loop Controller,在Loop Count中填入數字即可。

Copy right@A Layman

上圖填入的一樣是變數用法,如${__P(loops,100)}的意思是變數名稱為loops,允許由外部(命令列)傳入,若無傳入則使用預設值100。

jmeter -n -t example.jmx -Gloops=10

JMeter distributed testing

如果機器的性能不足,JMeter就無法提供夠大的壓力測試service,對此問題JMeter提供了master-slave架構,透過連結多台low-end的機器產生足夠的壓力對server進行測試,其架構很簡單如下:

Copy right@A Layman

這個架構是透過RMI (Remote Method Invocation)所完成,RMI可以讓RMI client的JVM調用RMI master JVM中的方法。

Slave的設定

只是單純的load generator,只單純接收來自Master的Test plan,因此Slave端不需要放置任何*.jmx檔案打開terminal後輸入:

jmeter-server.bat

可以看到以下畫面:

Copy right@A Layman

Master的設定

由於distributed testing下連結的slave數量越多, master會越吃力,因此建議使用console mode, 打開terminal後輸入已下指令:

jmeter -n -t test.jmx -R {IP1},{IP2}
  • R後面指定slave的IP,這時可以看到master已成功連結到slaves,訊息如下:
Copy right@A Layman

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

Copy right@A Layman

Visualization the test results

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

InfluxDB

Source: https://www.influxdata.com/

InfluxDB是一套Open source的時序型資料庫,由Go寫成並廣泛應用於監控的應用場景中。

  • 執行InfluxDB:
influxd -config influxdb.conf

Chronograf

Source: https://www.influxdata.com/time-series-platform/chronograf/

Chronograf是influxDB的後台管理工具

  • 安裝Chronograf
  • 執行 Chronograf.exe
  • 開啟瀏覽器, 訪問 http://localhost:8888
  • 選擇Configuration->Connections - connection string: http://localhost:8086 - Name: influx - UserName: Admin - Telegraf Database: jmeter
Copy right@A Layman
  • 選擇InfluxDB Admin -> Database-> Create Database-> 填入jmeter

Grafana

Source:https://grafana.com/

Grafana是一套open source的時序型Dashboard,常用於監控的應用場景中,角色為視覺化及分析。

grafana-server.exe
Copy right@A Layman
  • 選擇Create → New Dashboard → Graph → Edit → Metrics - Data Source: Default - 常用的measurement
Copy right@A Layman

JMeter configuration

  • 加入新的Backend listener: - graphiteHost: 填入InfluxDB所在的位置 - graphitePort: 2003 - rootMetricsPrefix: jmeter
Copy right@A Layman

Take a look for the simple test result

下面的Dashboard為一次測試結果,配置為2個slave,每個slave開100個thread,每個thread發出200個request。

上方的圖為Response time,下放的圖為started thread/ended thread,可以看的出來從測試開始到一半的時間,server的CPU可能是因為thread數量多而疲於切換而無法來得及處理requests, 從中間開始漸漸有thread被消耗,到最後成功消耗完所有threads的Requests。

Copy right@A Layman

Summary

這算是我第一次寫關於Performance test的文章,這篇的目的是將前段時間學習過的東西蒐集起來。

謝謝你耐心地讀到Summary,我是Sean HS, 是位軟體工程師。 這片文章是我在研究過程時的筆記,若有錯誤之處,期待您的見解,與您交流討論。

Related topics

[Software as a Service] Modern APM & Logging Services

Software Testing

[Golang] Build A Simple Web Service

[React.js] Build A React App

[DevOps] Ansible Provisioning for Windows:

References

  1. HTTP(S) Test Script Recorder
  2. JMeter基础之一 一个简单的性能测试
  3. 性能测试工具 关于 jmeter 性能测试的 局限性
  4. InfluxDB
  5. Grafana
  6. Chorograf
Jmeter
Influxdb
Grafana
Software Testing
Performance Test
Recommended from ReadMedium