GKE+Locustで10万RPSの負荷をかけてみた
GKE を使って Locust で 10万RPS の負荷をかけれました。
その時の k8s の node や pod 数について書きます。
Locust の使い方等については述べません。
なお、GKE で Locust を使うのは下記リポジトリに従えば簡単にできます。
1インスタンスあたり Locust プロセスは何個起動できるか
A common set up is to run a single master on one machine, and then run one worker instance per processor core on the worker machines.
Locust master 専用に 1インスタンス、worker 1つに 1コア(つまり 1インスタンスあたり vCPU 数分立ち上げ可能)が推奨されています。
k8s では node に pod を 1つも立ち上げていない状態ても kube-proxy 等は立ち上がっており CPU/メモリー を使用しているので、例えば 4vCPU のインスタンスであれば 3 worker pods 立ち上げるくらいが良いのかと個人的には思いました。
※コンテナのリソース要求(resources.requests.cpu)の設定で、1インスタンスあたりの pod 数を制御しました。
1Podあたり何RPS捌けるか
これは各々の負荷検証の対象によって様々だと思います。
今回 10万RPS の負荷をかけた対象では、1 Pod あたり 1500rps を超えてくると CPU usage was too high
や CPU usage above 90%
のログが出力されました。
よって 1 Pod あたり 1000rps くらいになるように合計の pod 数を調整しました。
Locust の spawn rate は 100 以下が望ましいようですが、少々超過しても正常に動作しました。
Node数の計算
例えば 3万 RPS の負荷をかけたいとき、
# およそ必要な Worker Pod 数 3万rps / 1000rps = 30 # 必要な Node 数(マシンタイプ 4vCPU) 30 / (4コア-1コア) = 10 10(worker用) + 1(master用) = 11
実際の値
マシンタイプ CPU 最適化マシンが良さそうです。
GCP だと e2-highcpu n2-highcpu n2d-highcpu(東京リージョンサポート外) あたり。
machine-type | nodes num | LOCUST_USERS | LOCUST_SPAWN_RATE | RPS |
---|---|---|---|---|
n2-highcpu-4 | 35(14+1) | 100000 | 100 | 99000 |
n2-highcpu-4 | 35(14+1) | 100000 | 250 | 99000 |
n2-highcpu-4 | 35(14+1) | 100000 | 500 | 99000 |
n2-highcpu-4 | 35(14+1) | 100000 | 1000 | 55000 |
spawn rate を大きくすると、負荷がうまくかからない様子。
おわりに
issue に 180万RPS の負荷をかけた際の記述を見つけましたが、この時の spawn rate は 100 なのだろうか...
180万RPS に達するまで数時間かかる...