負荷テストツールLocustとVegetaの検証
負荷テストツールの検証経緯
運用するに当たりシステムとしての可用性やスケーラビリティ(システムの規模の変化に柔軟に対応できる度合いのこと)や性能を事前に確認し、想定する負荷に耐える性能を持ったシステムを構築する必要があります。そのため、オープンソースとして提供されている負荷テストツールから求める負荷テストができるかや、使いやすさ・運用面も含めて選択する必要があります。
負荷テストツールの選定
数あるツールの中から開発が今も行われているかといった開発状況や、ツールのソースが管理されているGithubのスター数、同業者のブログからの情報からLocustとVegetaという負荷テストツールを比較することにしました。ちなみにLocustはイナゴ、Vegetaはドラゴンボールのベジータという意味です。Vegetaで負荷を掛けるコマンドは”vegeta attack”でとてもユーモアがあります。
Locust
LocustはGKEにデプロイして、用意されているウェブインターフェースからテストを行いました。以下、手順になります。
環境変数の設定
REGION=asia-northeast1
ZONE=${REGION}-a
PROJECT=$(gcloud config get-value project)
CLUSTER=gke-load-test
TARGET=${PROJECT}.appspot.com
SCOPE="https://www.googleapis.com/auth/cloud-platform"
環境の設定
git clone https://github.com/GoogleCloudPlatform/distributed-load-testing-using-kubernetes
GKEクラスタの作成
gcloud container clusters create $CLUSTER \
--zone $ZONE \
--scopes $SCOPE \
--enable-autoscaling --min-nodes "3" --max-nodes "10" \
--scopes=logging-write,storage-ro \
--addons HorizontalPodAutoscaling,HttpLoadBalancing
GKEクラスタへの接続
gcloud container clusters get-credentials $CLUSTER \
--zone $ZONE \
--project $PROJECT
Dockerイメージのビルド
gcloud builds submit \
--tag gcr.io/$PROJECT/locust-tasks:latest docker-image
サンプルアプリケーションのデプロイ
gcloud app deploy sample-webapp/app.yaml \
--project=$PROJECT
ターゲットホスト、プロジェクトIDの指定
sed -i -e "s/\[TARGET_HOST\]/$TARGET/g" kubernetes-config/locust-master-controller.yaml
sed -i -e "s/\[TARGET_HOST\]/$TARGET/g" kubernetes-config/locust-worker-controller.yaml
sed -i -e "s/\[PROJECT_ID\]/$PROJECT/g" kubernetes-config/locust-master-controller.yaml
sed -i -e "s/\[PROJECT_ID\]/$PROJECT/g" kubernetes-config/locust-worker-controller.yaml
Locustのマスターノードとワーカーノードのデプロイ
kubectl apply -f kubernetes-config/locust-master-controller.yaml
kubectl apply -f kubernetes-config/locust-master-service.yaml
kubectl apply -f kubernetes-config/locust-worker-controller.yaml
LocustのDeploymentの確認
kubectl get pods -o wide
サービスの確認
kubectl get services
負荷テストは、Locustマスターのウェブインターフェースを使用して、テスト対象システムに対してタスクを実行できます。
システムの外部IPアドレスの取得
echo $EXTERNAL_IP
取得した外部IPアドレスを使用してアクセスすると下図のようなブラウザが開きます。
http://[EXTERNAL_IP]:8089
[Number of users to simulate] には合計で「10」、[Hatch rate] には 1 秒あたり「5」ユーザーを生成するものとして指定します。
[Start swarming] をクリックしてシミュレーションを開始します。
リクエストによりスワーミングが開始されると、下図に示すように [Statistics] でリクエスト数や 1 秒あたりのリクエスト数などのシミュレーション指標の集計が始まります。
[Stop] をクリックしてテストを終了します。
補足
ターゲットホストを変える場合は、環境変数TARGETに指定する。
テストシナリオの変更は、distributed-load-testing-using-kubernetesフォルダ>docker-imageフォルダlocust-tasksフォルダ>tasks.pyで行う。
Vegeta
Vegetaはローカルのk8sで、kubectlコマンドでテストを実行しました。
使用例
kubectl run vegeta --rm --attach --restart=Never --image="peterevans/vegeta" -- sh -c \
"echo 'GET https://www.example.com' | vegeta attack -rate=10 -duration=30s | tee results.bin | vegeta report"
出力
Requests [total, rate, throughput] 300, 10.03, 9.99
Duration [total, attack, wait] 30.024s, 29.9s, 124.173ms
Latencies [min, mean, 50, 90, 95, 99, max] 112.752ms, 161.476ms, 125.074ms, 266.267ms, 372.563ms, 529.983ms, 612.86ms
Bytes In [total, mean] 376800, 1256.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:300
Error Set:
pod "vegeta" deleted
vegeta plotをすると下図のようなアウトプットが作成される。
補足
テストシナリオとターゲットの変更は、使用例のechoコマンドで、どのようなメソッドで、ターゲットとする URL に対してアクセスするか?指定する。
Discussion