iT邦幫忙

2021 iThome 鐵人賽

DAY 14
1
DevOps

這個 site 就是遜啦 - SRE 30 天登大人之旅系列 第 14

Day 14:Load testing

雖然在昨天有說到今天希望可以改善 dashboard,然而我在做到一半的時候突然驚覺...現在根本就沒有多少資料可以給我畫圖表。但是在這種情況下,如果我每次都要手動去發一些請求的話未免也太花費人力了,既然都打算要發一堆請求了,那麼今天就來談談 load testing 吧。

為何需要做 load testing

記得在 Day 6 的時候我有提過,做監控的其中一個目的是要做容量規劃,這樣我們好進行成本的控管,然而我們不能指望透過真實使用者的流量來進行規劃,因為假設當我們今天上了一個新的版本,可是卻沒有辦法承受現有的流量的時候,那麼就有可能造成服務的不穩定。

綜上所述,我們應該要在新的版本被部署下去之前,先模擬出預期的流量,來判斷在這種程度的流量下,服務到底有沒有辦法達到我們預期的效能。當然這些測試也最好整合到我們的 CI 流程裡面,省去手動測試的麻煩。

使用 Drill 執行 load testing

那麼,今天我打算嘗試的工具是 Drill,他可以透過類似 Ansible 的語法去定義 load testing 的內容。而且有另外一點,他是用 Rust 寫的,不知為何我對 Rust 有莫名的好感,所以才想試試看 Drill 這個工具。順帶一提,有另外一款也是用 Rust 開發的 load testing 工具 goose,甚至可以用 Rust 定義測試內容,希望哪天也能嘗試看看。

建立 Docker image

那麼首先第一步,當然是先建一個 Docker image 啦,因為 Drill 現在並沒有官方維護的 image,所以這邊就借一下艦長大大之前在某篇介紹 Drill 的文章裡面所使用的 Dockerfile 吧(我有稍微修改一下)。

FROM rust:1.53
RUN apt-get update && \
    apt-get install -y curl libssl-dev pkg-config && \
    rm -rf /var/lib/apt/lists/*
RUN cargo install drill
ENTRYPOINT drill

然後下 docker build -t drill . 之後,就有個 Drill 的 Docker image 可以用了。

benchmark 設定

接下來就要處理設定測試內容了,首先先簡單的發幾次 request 給首頁吧。下面的設定意思是說,對於 http://caddy:8080/ 這個 URL 去發 12 請求,並行數量為 4。

base: "http://caddy:8080"
iterations: 12
concurrency: 4

plan:
  - name: Test URL | Home
    request:
      url: /

然後透過以下指令執行,因為我是在 WSL 上面跑沒有辦法掛 host network,所以就跟 NOJ 放同個 bridge network 底下。

docker run --rm \
  -v $PWD:/drill \
  -w /drill \
  --network normal-oj_default \
  drill -s --benchmark benchmark.yml

執行結果,看起來一切正常。

接下來就要撰寫比較複雜的設定了,目前希望可以做到的操作是要模擬一下同學瀏覽題目的流程,最後的成果會類似這樣。

base: "http://caddy:8080"
iterations: 5000
concurrency: 50

plan:
  - name: View homepage
    request:
      url: /
  - name: Login
    request:
      url: /api/auth/session
      method: POST
      headers:
        Content-Type: application/json
      body: '{"username": "first_admin", "password": "firstpasswordforadmin"}'
  - name: Get course
    request:
      url: /course
  - name: View "Public"
    request:
      url: /course/Public
  - name: View problems
    request:
      url: /course/Public/problems
  - name: View problem 1
    request:
      url: /problem/1

執行之後看看統計數據。

再回到 Grafana 的 dashboard,可以看到有比較多數據可以繪製圖表了。

小結

今天簡單嘗試了一下 Drill,感覺挺不錯的,記得之前看過有人抱怨他能夠產生的壓力其實比起其他工具來說低了不少,但我目前沒有感受到明顯的差別,甚至覺得他還挺快的。另外他現在也支援了越來越豐富的功能,對於不需要複雜邏輯的測試,我想應該算是綽綽有餘,而且寫起來很快,透過 yml 檔就能快速定義,推薦有需要的大家也能試試。

另外上面的設定我想其實並不適合應用在實際的測試中,因為這邊並沒有好好定義預期的回應時間等指標,所以也就無從判斷測試是成功還是失敗。


上一篇
Day 13:架設 Grafana (1)
下一篇
Day 15:目前 NOJ 的部署流程
系列文
這個 site 就是遜啦 - SRE 30 天登大人之旅30

尚未有邦友留言

立即登入留言