最初の一歩:遅いと言われたら
「なんか遅いんだけど」と言われたときの最初のアクション。これだけ覚えておけば、慌てずに調査を始められます。
最初にやること
┌──────────────────────────────────── ─────────────────────────┐
│ Step 1: 状況を確認する │
├─────────────────────────────────────────────────────────────┤
│ │
│ 聞くこと: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ □ いつから遅い?(急に?徐々に?) │ │
│ │ □ どの操作が遅い?(ログイン?検索?全部?) │ │
│ │ □ どのくらい遅い?(3秒?30秒?タイムアウト?) │ │
│ │ □ 誰が遅い?(全員?特定ユーザー?特定地域?) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ なぜ聞くか: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ・「急に」→ デプロイ、設定変更、外部要因 │ │
│ │ ・「徐々に」→ データ増加、リソース枯渇 │ │
│ │ ・「特定操作」→ その処理に問題 │ │
│ │ ・「全部」→ インフラ、DB、ネットワーク │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────── ──────────────┘
どこを見るか
┌─────────────────────────────────────────────────────────────┐
│ Step 2: メトリクスを確認する │
├─────────────────────────────────────────────────────────────┤
│ │
│ 上から順に確認: │
│ │
│ 1. エラーが出ていないか │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ・エラーログ │ │
│ │ ・5xxエラーの増加 │ │
│ │ → エラーがあればそこから調査 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 2. レイテンシはどこで増えているか │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ・APM/トレースで処理の内訳を確認 │ │
│ │ ・アプリ?DB?外部API? │ │
│ │ → 時間がかかっている箇所を特定 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 3. リソースは足りているか │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ・CPU使用率 │ │
│ │ ・メモリ使用率(スワップ発生してないか) │ │
│ │ ・DB接続プール使用率 │ │
│ │ → 枯渇しているリソースを特定 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
よくある原因と対処
┌─────────────────────────────────────────────────────────────┐
│ パターン別チェックリスト │
├─────────────────────────────────────────────────────────────┤
│ │
│ 「急に遅くなった」場合: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ □ 直近のデプロイはあったか │ │
│ │ □ 設定変更はあったか │ │
│ │ □ 外部サービス(API、DB)に障害は出ていないか │ │
│ │ □ トラフィックが急増していないか │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 「特定の操作だけ遅い」場合: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ □ その処理のクエリは遅くないか(スロークエリログ) │ │
│ │ □ 外部API呼び出しで待っていないか │ │
│ │ □ N+1問題が起きていないか │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 「全体的に遅い」場合: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ □ CPU/メモリは枯渇していないか │ │
│ │ □ DB接続プールは枯渇していないか │ │
│ │ □ GCが頻発していないか(JVMの場合) │ │
│ │ □ ネットワークに問題はないか │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
やってはいけないこと
┌─────────────────────────────────────────────────────────────┐
│ 焦ってやりがちなNG行動 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ❌ 原因を特定せずにサーバーを増やす │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ CPUが20%なのに増やしても意味がない │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ❌ 原因を特定せずにコードを変更する │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 「たぶんここが遅い」で変更すると、別の問題を生む │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ❌ 本番環境で闇雲にデ バッグログを入れる │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ログ出力自体が負荷になり、さらに遅くなることも │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ❌ 再起動して様子を見る(原因不明のまま) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 一時的に直っても、原因が分からないと再発する │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ✅ まず計測 → 原因特定 → 対処 → 効果確認 │
│ │
└─────────────────────────────────────────────────────────────┘
覚えておく数字
┌─────────────────────────────────────────────────────────────┐
│ 目安として知っておくと便利 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ユーザー体感: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 100ms以下: 「速い」と感じる │ │
│ │ 1秒以下: 「普通」と感じる │ │
│ │ 3秒以上: 「遅い」と感じ始める │ │
│ │ 10秒以上: 離脱する │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ リソース使用率の目安: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ CPU 30%以下: 余裕あり │ │
│ │ CPU 30-50%: 通常運用(ここを目指す) │ │
│ │ CPU 50-70%: 注視(ピークに備えて余裕少) │ │
│ │ CPU 70%以上: 危険(スケールアウト検討) │ │
│ │ │ │
│ │ メモリ: 70%超えたら注意、スワップはアウト │ │
│ │ 接続プール: 70%超えたら増やすことを検討 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
次に読むべきドキュメント
| 状況 | 読むべきドキュメント |
|---|---|
| 基礎から学びたい | パフォーマンスの基礎 |
| ボトルネックを探したい | ボトルネックの見つけ方 |
| アプリが遅そう | アプリケーション層 |
| DBが遅そう | データベース層 |