🙆

【負荷テスト】負荷テストツールk6を試す!!

2023/10/28に公開

※ 個人ブログを閉鎖するので個人ブログに書いていたものを転載

前回の記事で比較した負荷テストツールで良さそうだったk6のお試し記事です。

環境

k6: v0.42

サンプルコードのリポジトリ

今回使用したサンプルは以下のリポジトリのPRで実装しています。(誤って一部ファイルの改行コードがCRLFになっていました・・・コピペする際はお気を付けを)

https://github.com/i-shinya/k6-github-actions-sample/pull/1

k6を試す

いくつかインストールする方法がありますが、brew 使用しているのでbrewでインストールします。

brew install k6

その他のインストール方法は公式を参考にしてください!

https://k6.io/docs/get-started/installation/

テスト用のAPIを用意

API用意するの面倒だったのでnginxをdocker-compose.yamlで用意

version: "3.6"
services:
  nginx:
  image: nginx:latest
  container_name: loadtest_nginx
  ports:
    - "80:80"

起動!!

docker-compose up -d

シナリオファイルを用意

nginxにリクエストを送るテストシナリオを追加(simple-k6-sample.js)

import { check } from "k6"
import http from "k6/http"
 
export const options = {
    // 閾値(設定した条件を満たせないと負荷テストがfailになる)
    thresholds: {
        // リクエストの失敗が1%以内
        http_req_failed: ["rate<0.01"],
        // 90パーセンタイルが500ms以内、95パーセンタイルが1000ms以内のレイテンシ
        http_req_duration: ["p(90)<500", 'p(95) < 1000']
    },
    // テストステージ(順番に実行される)
    stages: [
        // targetは同時実行数、durationは実行時間
        { target: 50, duration: '15s' },
        { target: 100, duration: '15s' }
    ]
}
 
// テストケース
export default function () {
    const res = http.get(
        "http://localhost:80"
    )
    check(res, {
        'is_status_200': (r) => r.status === 200
    })
}

k6を実行する

とりあえずk6を実行してみる。ユーザ数は100で秒間リクエスト100で実行

シナリオファイルに15秒を2回行うように記載しているので合計30秒かかります。

k6 run simple-k6-sample.js -u 100 --rps 100

実行すると以下のような結果が標準出力に表示される。

running (0m31.0s), 000/100 VUs, 3099 complete and 0 interrupted iterations
default ✓ [======================================] 000/100 VUs  30s
 
     ✓ is_status_200
 
     checks.........................: 100.00% ✓ 3099       ✗ 0
     data_received..................: 2.6 MB  85 kB/s
     data_sent......................: 242 kB  7.8 kB/s
     http_req_blocked...............: avg=7.44µs   min=1.77µs   med=2.98µs   max=288.26µs p(90)=5.16µs   p(95)=10.56µs
     http_req_connecting............: avg=2.43µs   min=0s       med=0s       max=115.28µs p(90)=0s       p(95)=0s
   ✓ http_req_duration..............: avg=417.29µs min=272.23µs med=402.62µs max=3.14ms   p(90)=498.7µs  p(95)=540.64µs
       { expected_response:true }...: avg=417.29µs min=272.23µs med=402.62µs max=3.14ms   p(90)=498.7µs  p(95)=540.64µs
   ✓ http_req_failed................: 0.00%   ✓ 0          ✗ 3099
     http_req_receiving.............: avg=48.46µs  min=21.88µs  med=46.96µs  max=434.15µs p(90)=63.63µs  p(95)=69.57µs
     http_req_sending...............: avg=21.14µs  min=6.11µs   med=19.86µs  max=201.26µs p(90)=28.3µs   p(95)=31.85µs
     http_req_tls_handshaking.......: avg=0s       min=0s       med=0s       max=0s       p(90)=0s       p(95)=0s
     http_req_waiting...............: avg=347.68µs min=229.94µs med=335.56µs max=3.04ms   p(90)=416.45µs p(95)=456.79µs
     http_reqs......................: 3099    100.026079/s
     iteration_duration.............: avg=748.13ms min=1.35ms   med=750.16ms max=1s       p(90)=959.53ms p(95)=979.48ms
     iterations.....................: 3099    100.026079/s
     vus............................: 99      min=51       max=99
     vus_max........................: 100     min=100      max=100

とりあえず全てのcheckが通っていて問題ないことは分かるけどグラフとかのが見やすいなぁ

grafanaで結果を可視化する

やっぱり結果は可視化したいのでgrafanaを使用して可視化しようと思います。
k6では出力先に時系列DBのinfluxdbを指定でき、そちらをgrafanaで読み取ります。

docker-composeにinfluxdbとgrafanaを追加する

先ほど追加したdocker-compose.yamlにinfluxdbとgrafanaを追加

version: "3.6"
services:
  nginx:
    image: nginx:latest
    container_name: loadtest_nginx
    ports:
      - "80:80"
 
  grafana:
    image: grafana/grafana
    container_name: loadtest_grafana
    ports:
      - '3000:3000'
    user: 'root'
    depends_on:
      - influxdb
 
  influxdb:
    image: influxdb:1.8 # k6でがv2に対応していないため1.8を指定
    container_name: loadtest_influxdb
    ports:
      - '8086:8086'
    environment:
      - INFLUXDB_DB=loadtest

再起動!!

docker-compose up -d

influxdbを出力先に指定してk6を実行する

先ほどのk6コマンド実行にoutオプションを追加して実行する。

k6 run simple-k6-sample.js -u 100 --rps 100 --out influxdb=http://localhost:8086/loadtest

grafanaで結果を確認する

grafanaを開くとログイン画面が出てくるのでユーザ名とパスワードともにadminを入力、ログインするとパスワード再設定が表示されますが、skipします。

influxdbをデータソースに追加する

以下画像の赤枠部分をクリックしてデータソースを追加する。

influxDBををクリックして追加する。

URLとDatabaseにdocker-composeで設定した値を記載する。

入力したらSave&Testを実行し成功すればOK

grafanaのデータソースにinfluxDBを追加する

次は書き画像のimportからデータソースを追加します。

公式でk6の設定が用意されているのでそちらを利用します。2587を入力しLoadします。

先ほど追加したinfluxDBを指定してimportを押せば完了です。

グラフが表示される

こんな感じで結果を表示してくれます!いい感じですね!

最後に

こんな感じでk6お試しは終了です!
今まで負荷テストあまり興味なかったですが、これだけシンプルに実行できると面白いですね!

参考

Discussion