locust を使っているが、パフォーマンスがあまりよくなくてslaveを起動しないといけないのが微妙に思ったので他のツールがないかを調べてみた。 要件としてはパフォーマンスが高くてデプロイが簡単なこと
k6 が良さそうだった。
負荷テストツール K6 について調べてみた | sreake.com | 株式会社スリーシェイク k6使ったら今までで一番負荷テストが捗った - Qiita k6で始める負荷テスト
ローカルで動かす
ローカルに負荷試験対象のサーバーを立てる
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello")
})
log.Fatal(http.ListenAndServe(":3000", nil))
}
go run main.go
Docker上で動かす
k6をbrew等でインストールしてもよいが、dockerで実行してみる。
script.js
を作成
import http from 'k6/http';
export default function () {
http.get('http://host.docker.internal:8080/');
}
イメージをpull
docker pull grafana/k6
実行
docker run --rm -i grafana/k6 run - <k6s_test.js
VU(実行ユーザー数)、duration(実行時間)を指定する場合
docker run --rm -i grafana/k6 run --vus 10 --duration 30s - <k6s_test.js
Kubernetes上で動かす
Running distributed k6 tests on Kubernetes
これの通りにやればできる
git clone https://github.com/grafana/k6-operator && cd k6-operator
kubectl config get-contexts
make deploy
import http from 'k6/http';
import { check } from 'k6';
export const options = {
stages: [
{ target: 200, duration: '30s' },
{ target: 0, duration: '30s' },
],
};
export default function () {
const result = http.get('https://test-api.k6.io/public/crocodiles/');
check(result, {
'http response status code is 200': result.status === 200,
});
}
kubectl create configmap crocodile-stress-test --from-file /path/to/our/test.js
apiVersion: k6.io/v1alpha1
kind: K6
metadata:
name: k6-sample
spec:
parallelism: 4
script:
configMap:
name: crocodile-stress-test
file: test.js
kubectl apply -f /path/to/our/k6/custom-resource.yml
そういえばLocustにもHelm Chartがあった https://github.com/deliveryhero/helm-charts/tree/master/stable/locust
その他
- https://github.com/grafana/k6-jslib-aws でS3の操作ができる
- influxdbにデータを転送してGrafanaで見る