【負荷テスト】負荷テストツールk6を試す!!
※ 個人ブログを閉鎖するので個人ブログに書いていたものを転載
前回の記事で比較した負荷テストツールで良さそうだった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お試しは終了です!
今まで負荷テストあまり興味なかったですが、これだけシンプルに実行できると面白いですね!
- 今回使用したファイルはこちらのPRで追加しています。(誤って一部ファイルの改行コードがCRLFになっていました・・・コピペする際はお気を付けを)
参考
- k6の使い方 シンプル&軽快な負荷試験ツールを試す
Discussion