背景
最近初めてWebアプリケーションの負荷試験(性能試験)を担当しました。
社内に知見が少ないため、自分の進め方が適切だったのか確認したく質問させてください。
今回、負荷時にレイテンシーが悪化する問題があり、最終的には以下が原因でした。
- マイクロサービス間通信でN+1が発生
- gRPCクライアントをリクエストごとに生成しておりオーバーヘッドが発生
- DBはボトルネックではなかった
このようなケースにおいて、
「どのような手順でボトルネックを特定するのが一般的か」を知りたいです。
技術スタック
- インフラ
- Amazon EKS
- Aurora MySQL
- Grafana
- アプリ
- gRPCサーバ(Node.js)
- Next.js(AppRouter)
- Prisma
- 負荷試験ツール
- k6
自分の進め方
以下の手順で進めました。
1. テストシナリオ作成
- シナリオ洗い出し
- p(95), p(99)の閾値設定
2. テストコード・環境準備
- k6でテストコード作成
- 負荷試験専用環境を用意
3. テスト実施
- APIサーバに対して負荷をかけて計測
4. ボトルネック特定
以下の順で切り分けました。
- GrafanaでPodのCPU/メモリ/スケーリング状況を確認
- Aurora(Database Insight)でスロークエリやコネクション確認
- 問題が見つからなかったため、アプリに計測ログを仕込んで分解
- 外部API(gRPC)通信時間
- DBアクセス時間
- Prismaコネクション数
聞きたいこと
- このようなボトルネック特定の進め方は一般的でしょうか?
- 特に「ログを仕込んで分解する」以外に、より効率的な方法(APM / トレーシング / プロファイリング等)があれば知りたいです
- また、今回のような問題(N+1やgRPCクライアント生成)について、
設計・実装・レビュー段階で防ぐためのプラクティスがあれば教えていただきたいです
実務での進め方やこうすると楽になるといった知見があればぜひ教えてください。
あなたの回答
tips
プレビュー