kawabatas技術ブログ

試してみたことを書いていきます

GKE+Locustで10万RPSの負荷をかけてみた

GKE を使って Locust で 10万RPS の負荷をかけれました。

その時の k8s の node や pod 数について書きます。

Locust の使い方等については述べません。

なお、GKE で Locust を使うのは下記リポジトリに従えば簡単にできます。

github.com

1インスタンスあたり Locust プロセスは何個起動できるか

docs.locust.io

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 highCPU 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

f:id:kawabatas:20200920163514p:plain f:id:kawabatas:20200920163519p:plain f:id:kawabatas:20200920163556p:plain

spawn rate を大きくすると、負荷がうまくかからない様子。

おわりに

issue に 180万RPS の負荷をかけた際の記述を見つけましたが、この時の spawn rate は 100 なのだろうか...

180万RPS に達するまで数時間かかる...