お疲れ様です!IT業界で働くアライグマです!
結論から言うと、パフォーマンスチューニングの本質は「推測するな、計測せよ」という原則を、いかに日常業務の中で習慣化できるかにかかっています。
先日、さくらインターネット株式会社の藤原俊一郎氏(ISUCON複数回優勝)による講演「パフォーマンスチューニングのために普段からできること」が話題になりました。ISUCON(Iikanjini Speed Up Contest)は、与えられたWebアプリケーションを限られた時間内で高速化する競技で、参加者には本番さながらのトラブルシューティング力が求められます。
今回は、この講演内容を起点に、普段の開発や運用で実践できるパフォーマンスチューニングの思考法を整理します。
なぜ「突然遅くなる」のか?問題の構造を理解する
「昨日まで普通に動いていたのに、今日急に遅くなった」——この状況に心当たりがないエンジニアはいないでしょう。しかし、システムが「突然」遅くなることは、実はほとんどありません。
パフォーマンス劣化の3つのパターン
藤原氏の講演や多くのプロジェクト事例を踏まえると、パフォーマンス問題は以下の3つに分類できます。
- 蓄積型:データ量の増加、ログの肥大化、インデックスの断片化など、徐々に進行していたものが閾値を超えた
- 変更起因型:デプロイ、設定変更、依存サービスのアップデートなど、何かが変わったタイミングで発生
- 外部要因型:トラフィック急増、外部APIの遅延、ハードウェア障害など、システム外の変化
問題を切り分けるためには、「何がいつ変わったか」を追跡できる仕組みが必要です。詳しくはGitHub ActionsのCI/CDセキュリティガイドの記事でも触れましたが、デプロイ履歴とメトリクスを紐づけておくことが、原因特定の第一歩になります。
IT女子 アラ美計測の基本:何を・どこで・どう測るか
パフォーマンスチューニングの第一歩は、正しく計測することです。しかし「何を測るか」を間違えると、改善の方向性もずれてしまいます。
計測すべき4つのレイヤー
- アプリケーション層:リクエスト/レスポンス時間、エラー率、スループット
- データベース層:クエリ実行時間、スロークエリ数、コネクション数
- インフラ層:CPU使用率、メモリ使用率、ディスクI/O、ネットワーク帯域
- 外部依存層:外部API応答時間、キャッシュヒット率
計測ツールの選定
# Linuxでの基本的なパフォーマンス計測コマンド
# CPU・メモリの状況確認
vmstat 1 5
# ディスクI/Oの確認
iostat -x 1 5
# ネットワーク接続状況
ss -s
# プロセスごとのリソース消費
top -bn1 | head -20
問題を特定したら、PostGISの空間インデックスとANALYZEの記事で紹介したように、ボトルネックの箇所に応じた最適化手法を適用します。



推測の技術:計測結果から仮説を立てる
計測データが揃ったら、次は「なぜ遅いのか」を推測するフェーズです。ここで重要なのは、思い込みで改善を始めないことです。
ボトルネック特定のフレームワーク


ISUCON優勝者たちが実践している思考法を整理すると、以下のようなフレームワークが見えてきます。
- リソース競合の確認:CPU・メモリ・ディスク・ネットワークのいずれかが飽和していないか
- 待機時間の分解:処理時間のうち、実際の計算とI/O待機の割合はどうなっているか
- N+1問題の検出:1リクエストあたりのDBクエリ数が異常に多くないか
- キャッシュ効率の確認:同じデータを何度も取得していないか
「推測」と「当てずっぽう」の違い
推測には根拠が必要です。「多分ここが遅いと思う」ではなく、「この処理のp95が3秒を超えているので、ここを改善すれば全体の30%は短縮できるはず」という形で、期待される改善効果を事前に見積もることが重要です。
Athenaのスキャン量削減でもこの考え方が応用できます。詳しくはPythonデータ処理によるAWSコスト削減術の記事をご参照ください。



実装後の効果検証(ケーススタディ)
ここでは、あるECサイトプロジェクトで実際に行ったパフォーマンスチューニングの事例を紹介します。
状況(Before)
- システム構成:ECサイトの商品一覧API(Laravel + MySQL 8.0 + Redis)
- 問題:月末のセール時にレスポンスタイムが平均200msから3秒以上に悪化
- データ規模:商品数約50万件、同時接続数ピーク時2,000セッション
- 当初の仮説:「DBのクエリが遅いのでインデックスを追加すれば解決するはず」
行動(Action)
- 計測フェーズ:まずNew RelicでトランザクションごとのbreakdownToを確認。DBクエリは全体の20%程度で、残り80%がアプリケーション内の処理時間だった
- 仮説の修正:Laravelのデバッグバーを有効化し、1リクエストあたりのクエリ数を確認。商品一覧取得時に平均180件のクエリが発行されていた(典型的なN+1問題)
- 改善施策:Eloquentの
with()によるEager Loadingを導入し、クエリ数を3件に削減。さらに、商品カテゴリ情報をRedisにキャッシュして、DBアクセス自体を削減 - 負荷テスト:本番相当のデータを用意し、k6で同時接続2,000セッションのシナリオを実行して改善を確認
結果(After)
- レスポンスタイム:p95が3.2秒 → 180ms(約94%改善)
- DBクエリ数:1リクエストあたり180件 → 3件
- CPU使用率:ピーク時90%超 → 40%前後で安定
- 得られた教訓:最初の「インデックス追加」という仮説は完全に外れていた。計測なしに改善を始めていたら、無駄な時間を費やしていた
この事例のように、アプリケーション設計時の依存性の整理は、パフォーマンス問題の根本原因を解消するうえでも有効です。FastAPIで構築するモジュラーモノリスの記事でも、この点について詳しく解説しています。



普段からできるパフォーマンス意識の習慣化
ISUCONのような競技で培われるスキルは、実は日常の開発でも活かせます。ここでは、普段から実践できる習慣をまとめます。
日常的に取り入れるべき3つの習慣
- 週次でのベースライン確認:主要エンドポイントのp50/p95/p99を定点観測し、トレンドを把握する
- コードレビューでのクエリ数チェック:PRレビュー時に「このエンドポイントでクエリは何件発行される?」を確認する習慣をつける
- 障害対応後の振り返り:パフォーマンス障害が発生したら、「なぜ事前に気づけなかったか」を記録・共有する
チームで取り組むパフォーマンス文化
個人の努力だけでなく、チーム全体でパフォーマンスを意識する文化を作ることも重要です。定期的な「パフォーマンス共有会」や、スロークエリを自動検知してSlackに通知する仕組みなど、可視化と共有の仕組みを整えましょう。チームでの取り組み方についてはエンジニアが社内で評価されるためのアピール戦略と1on1活用術も参考になります。
本記事で解説したようなAI技術を、基礎から体系的に身につけたい方は、以下のスクールも検討してみてください。
| 比較項目 | DMM 生成AI CAMP | Aidemy Premium |
|---|---|---|
| 目的・ゴール | ビジネス活用・効率化非エンジニア向け | エンジニア転身・E資格Python/AI開発 |
| 難易度 | プロンプト作成中心 | コード記述あり |
| 補助金・給付金 | リスキリング補助金対象 | 教育訓練給付金対象 |
| おすすめ度 | 今の仕事に活かすなら | AIエンジニアになるなら |
| 公式サイト | 詳細を見る | − |



まとめ
パフォーマンスチューニングの本質は、「推測するな、計測せよ」という原則を日常に落とし込むことです。
- 計測が先、改善は後:仮説を立てる前に、まずデータを取る習慣をつける
- ボトルネックを正しく特定する:「なんとなく遅そう」ではなく、数値で問題箇所を絞り込む
- 改善効果を事前に見積もる:「この施策で何%改善できるか」を予測してから実装する
- 振り返りを記録する:仮説が外れた理由を言語化し、次の推測精度を高める
ISUCON優勝者たちが競技で磨いた思考法は、本番障害への対応力を高める最良のトレーニングです。まずは、自分のプロジェクトで「週次ベースライン計測」から始めてみてください。













