背景
- 数万qps程度のGETリクエストの負荷テストを行いたい
- GKE(autopilot) と locustで作成してみる
locustとは
負荷テストツール。Pythonでシナリオ定義できる。また、分散環境構築対応しており、GKEとの相性良い。
Getting Started
-
locust
ってコマンド打つだけでサーバー起動し、実行用のUIにアクセスできる- そこからoption設定入力して実行可能
- コマンドだけでも実行可能
locust -H https://onesdata-prod.appspot.com --headless --users 10 --spawn-rate 1
シナリオサンプル(paramに現在時刻を入れたGETリクエスト)
locustfile.py
from locust import HttpUser, task
import time
class RequestUser(HttpUser):
@task
def request(self):
self.client.get(f"/path?timestamp={int(time.time())}&name=munaita")
- GET投げるだけならこれでok
- Pythonなのでなんでもできそう
GKE + locust
- 数万qpsというシナリオを実行するためには単体のマシンでは無理(ローカル実行で300qps程度)
- 分散環境で実行する
- GKE(autopilot)で管理が楽
- GCPの公式ドキュメントに GKE + locustのチュートリアルがあるのでこれに沿って作業する
作業メモ
- 基本上記のチュートリアルで動くが、一部クラスタの作成箇所はautopilot用に変更する必要あり
export REGION=asia-northeast1
export PROJECT=$(gcloud config get-value project)
export CLUSTER=your-cluster-name
export TARGET=${PROJECT}.appspot.com
export SCOPE="https://www.googleapis.com/auth/cloud-platform"
# クラスタ(autopilot)の作成
gcloud container clusters create-auto $CLUSTER --region $REGION --scopes=logging-write,storage-ro
# クラスタの接続
gcloud container clusters get-credentials $CLUSTER --region $REGION --project $PROJECT
注意
- このチュートリアルのコードは古いのですでにlocustの最新チュートリアルコードが動かなかったりする
- requirements.txtを最新に更新すると便利
- バージョンの更新に伴い、locustコマンドの
--slave
オプションが--worker
に変更されているのでrun.shを変更する必要がある
- 35,000qpsを実現するための構成
- ワーカーレプリカ: 1000 add_user: 10
- 1ユーザー10回リクエストするシナリオ