🙆

負荷テストツールLocustとVegetaの検証

2021/10/08に公開

負荷テストツールの検証経緯

運用するに当たりシステムとしての可用性やスケーラビリティ(システムの規模の変化に柔軟に対応できる度合いのこと)や性能を事前に確認し、想定する負荷に耐える性能を持ったシステムを構築する必要があります。そのため、オープンソースとして提供されている負荷テストツールから求める負荷テストができるかや、使いやすさ・運用面も含めて選択する必要があります。

負荷テストツールの選定

数あるツールの中から開発が今も行われているかといった開発状況や、ツールのソースが管理されている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