Backgroud

最近剛好看到一篇文章在介紹 Locust 。 Locust 是一個壓力測試的工具支援Python,我一開始看到的時候還挺開心的,終於多了一個工具可以讓我很方便地對我寫的API進行壓測(以前都只用網路上既有的服務,自己寫的壓測彈性還是比較大),那這篇文章主要就簡單的介紹一下如何使用 Locust 。

Installation

$ pip3 install locustio

Start

其實使用 Locust 非常簡單只要寫一個 locustfile.py 基本上就可以順利執行了。拿之前 flask-vue-crud 的範例程式當作基底,我們來為這個專案加上 Locust 壓力測試的 code 。

$ cd server
$ mkdir locust
$ cd locust
$ touch locustfile.py

locusfile.py

from locust import HttpLocust, TaskSet, task
from locust.exception import StopLocust
from pprint import pprint
import random
import json


class WebsiteTasks(TaskSet):
    @task(10)
    def index(self):
        self.client.get("/ping")

    @task(3)
    def get_books(self):
        self.client.get("/books")

    @task(1)
    def post_books(self):
        data = {"title": "Python3", "author": "Paul Liang", "read": False}
        self.client.post("/books", data=json.dumps(data))

class WebsiteUser(HttpLocust):
    task_set = WebsiteTasks
    min_wait = 3000
    max_wait = 5000

稍微解釋一下上面這段程式碼,有兩個 Class 分別是 WebsiteTasksWebsiteUser,分別的意義如下。

  • WebsiteTasks: 使用者在網站上可能會產生的動作列表
  • WebsiteUser: 模擬一個使用者,min_wait & max_wait 表示使用者每隔3~5秒(隨機)會執行 WebsiteTasks 任意一個 task。(透過這樣來模擬使用者瀏覽網頁的行為)

回到 WebsiteTasks,每個 function 前面都要透過 task 來裝飾才會被認作是一個 task。至於task 中的數字則代表發生的次數比例(呼叫 index, get_books, post_books 的次數為 10:3:1 這樣)

那接下來我們來啟動 Locust,那記得在啟動 Locust 前請先確保你要測試的服務已經啟動,這邊我們會先開一個 terminal 來啟動flask,接著再開另外一個 terminal 啟動 Locust。

$ cd server
$ python3 run.py
 * Serving Flask app "src" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
$ cd server/locust
# -f 指定檔案位址
# -H host server address
$ locust -f locustfile.py -H http://127.0.0.1:5000
[2019-07-09 19:19:50,370] Taikers-MBP/INFO/locust.main: Starting web monitor at *:8089
[2019-07-09 19:19:50,371] Taikers-MBP/INFO/locust.main: Starting Locust 0.11.0

都確定沒問題後我們可以打開瀏覽器輸入: http://localhost:8089/ 會出現以下畫面:

Screen-Shot-2019-07-09-at-7.21.32-PM

  • Number of user to simulate: 你要模擬在你網站的人數
  • Hatch rate: 幾秒內達到上面的人數

數入完相關需求之後就按 Start

Screen-Shot-2019-07-09-at-7.15.35-PM

透過上圖我們可以看到在執行的結果。比例的部分也跟我們預期的一樣。然後 Locust 也會提供圖形化的報表:

Screen-Shot-2019-07-09-at-7.15.44-PM

No-web

當然Locust也提供純指令的測試方式,指令&結果如下:

# -c: 使用者數量
# -r: HATCH_RATE
# -t: 持續幾秒
# --print-stats: fuction中有print額外的資訊要確認可以透過這個參數
$ locust -f locustfile.py -H http://localhost:5000 --no-web -c 30 -r 10 -t 30s --print-stats
[2019-07-09 19:38:55,152] Taikers-MBP/INFO/locust.main: Run time limit set to 30 seconds
[2019-07-09 19:38:55,153] Taikers-MBP/INFO/locust.main: Starting Locust 0.11.0
[2019-07-09 19:38:55,153] Taikers-MBP/INFO/locust.runners: Hatching and swarming 30 clients at the rate 10 clients/s...
 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              0     0(0.00%)                                       0.00

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /books                                                         8    8(50.00%)      14      12      24  |      12    0.00
 POST /books                                                        1    1(50.00%)      13      13      13  |      13    0.00
 GET /ping                                                         11   11(50.00%)      14      11      28  |      12    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                             20  20(100.00%)                                       0.00

[2019-07-09 19:38:58,253] Taikers-MBP/INFO/locust.runners: All locusts hatched: WebsiteUser: 30
 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /books                                                        10   10(50.00%)      15      12      24  |      14    4.00
 POST /books                                                        1    1(50.00%)      13      13      13  |      13    0.00
 GET /ping                                                         19   19(50.00%)      16      11      33  |      12    5.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                             30  30(100.00%)                                       9.00

....
....
....

Percentage of the requests completed within given times
 Name                                                           # reqs    50%    66%    75%    80%    90%    95%    98%    99%   100%
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /books                                                         33     12     14     15     16     22     24     28     28     28
 POST /books                                                        12     12     12     14     14     21     23     23     23     23
 GET /ping                                                          86     12     13     15     18     22     26     33     33     33
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                             131     12     13     15     17     22     25     29     33     33

Reference