gRPC なエンドポイントのパフォーマンスをみたり、負荷試験をしたいなあという話をしたら ghz というツールがあるよと教えてもらったので、これを使ってみる。
ghz · Simple gRPC benchmarking and load testing tool
公式にはリリースページからインストールしてくれやと書かれている。 が go get でとれるのでこれでいいのでは… latest を使うことになるのでリリースされてるものと微妙に差異があるかも。
go get github.com/bojand/ghz/cmd/ghz/
ab ライクに使えるので、ヘルプを見たらまあ問題なく使えるはず。 Usage · ghz
Kubernetes 上で動くアプリケーションに対して実施するとこんな感じ。 ポートフォワードしてから、
kubectl port-forward svc/foo 5000
※Service に向けてポートフォワードしてますが kubectl コマンド実行時に宛先 Pod を解決してしまうので、ロードバランスしないです。
別ターミナルで、こういう具合 proto の指定がないときは Server Reflection して勝手にやってくれる、超便利。
そっちの話題はここにある。 grpc/server-reflection.md at master · grpc/grpc · GitHub
$ ghz \
--call foo.bar.Service.RPC \
-d "$(jo foo='bar')" \
-m "{\"Authorization\":\"BEARER $TOKEN\"}" \
-q 4 \
-c 2 \
-n 10 \
--insecure \
localhost:5000
Summary:
Count: 10
Total: 1.37 s
Slowest: 243.03 ms
Fastest: 111.49 ms
Average: 149.98 ms
Requests/sec: 7.29
Response time histogram:
111.491 [1] |∎∎∎∎∎∎∎∎
124.645 [5] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
137.799 [0] |
150.953 [2] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
164.107 [0] |
177.261 [0] |
190.415 [0] |
203.569 [0] |
216.723 [0] |
229.877 [0] |
243.031 [2] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
Latency distribution:
10% in 118.75 ms
25% in 119.66 ms
50% in 123.21 ms
75% in 243.01 ms
90% in 243.03 ms
0% in 0 ns
0% in 0 ns
Status code distribution:
[OK] 10 responses
リクエストパラメータつくるのに jo を使っている。 GitHub - jpmens/jo: JSON output from a shell
上記の例だと 最大 4 req/sec になるように、 2 並列でリクエストし、 10 リクエスト送ったら終わる、というオプションになっている。 なので、レスポンスタイム次第ではあるが、サクッとレスポンスがあれば 1 秒ちょっとで完了する。
レスポンスタイムの分布であったり、パーセンタイルもでたり、サクッと負荷かけて様子を見るのに便利そう。
もちろん、オプションの指定が必要だけど 1 リクエストだけ送ることもできるので、普段使いにもいいんじゃなかろうか。
また Go のパッケージとしても使えるっぽい。 Package · ghz ちょっと用途が思い浮かんでないけど、例えば、複数の RPC があって、順番にテストしたいんだよね〜〜〜みたいなときとか CI 的に負荷をかけたいんだよね〜〜とか、(シェルスクリプトでさくっと ghz ラッパーでもいいのでは感)