- システムや業務プロセスの中で全体の処理能力・スループットを制限している最も遅い・詰まっている箇所のこと。瓶の首(ボトルネック)が水の流れを制限することに由来する
- ボトルネック以外の箇所をいくら改善しても全体の速度はボトルネックの速度以上には上がらないため「どこがボトルネックか」を特定してそこに集中投資することが改善の最も効率的なアプローチだ
- エリヤフ・ゴールドラットが提唱した「TOC(制約理論:Theory of Constraints)」はボトルネックを特定して集中的に改善するマネジメント理論で、製造業からソフトウェア開発(DevOps)まで幅広く応用されている
【深掘り】これだけ知ってればOK!
システムのボトルネックを特定する方法を理解しよう。APMツール(Application Performance Monitoring):New Relic・Datadog・Dynatraceなどでトレースを収集してどの処理に時間がかかっているかを可視化する。DBのスロークエリログ:MySQLやPostgreSQLのスロークエリログを有効にして実行時間の長いクエリを特定する。プロファイリング:Pythonならcprofile・JavaならJProfilerなど言語ごとのプロファイリングツールでCPU使用率の高い処理を特定する。
TOC(制約理論)のボトルネック改善の5ステップを理解しよう。①制約(ボトルネック)の特定→②制約を最大限に活用する(今の能力の最大活用)→③制約以外の全てを制約に従わせる(ボトルネックに合わせた前後工程の調整)→④制約を強化する(能力増強・改善)→⑤最初に戻る(新しいボトルネックを特定)。この繰り返しが継続的な改善のサイクルだ。
Webシステムでよくあるボトルネックのパターンとその解消方法を整理しよう。DBのN+1問題(ループの中でDBクエリを発行してリクエスト数が爆発する)→JOINやEager Loadingで解消。同期処理のブロッキング(重い処理を同期で行うことで後続のリクエストが詰まる)→非同期化・キューイングで解消。コネクションプールの枯渇(DBコネクションが足りなくなる)→コネクションプールのサイズ調整・コネクションの適切な解放で解消。
よくある誤解
ボトルネック以外の箇所も全部改善すれば速くなると思っている
ボトルネック以外の箇所をいくら改善しても全体のスループットはボトルネックの能力以上には向上しない。限られた開発・運用リソースをボトルネックに集中投下することが最大の改善効果をもたらす。
CPUが高負荷だからCPUがボトルネックだと思っている
高負荷の原因が別のボトルネック(DBのスロークエリで処理が詰まってCPUが待機している・同期処理でリクエストが積み上がっているなど)によってCPUが見かけ上高負荷になっているケースがある。まずAPMやプロファイリングで根本原因を特定することが重要だ。
会話での使われ方

このAPIのレスポンスが遅いです。まずNew RelicのAPMでトレースを確認してどの処理がボトルネックか特定してから改善しましょう。
シニアエンジニアがパフォーマンス改善の手順として計測による特定を優先するよう指示している場面。




DBのスロークエリログを見たら1つのクエリが全体のレスポンスタイムの80%を占めていました。ここがボトルネックです。インデックスを追加しましょう。
バックエンドエンジニアがDBのボトルネック特定と改善策を報告している場面。




この業務フロー、法務確認のステップで常に2週間滞留しています。ここがボトルネックなので承認プロセスを並行化する設計を検討してください。
プロジェクトマネージャーが業務プロセスのボトルネックを特定してプロセス改善を依頼している場面。
【まとめ】3つのポイント
- 全体のスループットを制限している最も遅い箇所を特定することが改善の出発点:ボトルネック以外をいくら改善しても全体速度はボトルネックの速度以上に向上しないため計測でボトルネックを特定してそこに改善リソースを集中投下することが最も効率的だ
- APMツール・スロークエリログ・プロファイリングで計測してから改善する:「計測なき最適化は悪」という原則の通りまず計測でボトルネックを特定してからインデックス追加・非同期化・キューイングなど適切な改善手段を選択することが重要だ
- TOCの5ステップでボトルネックを継続的に特定・改善するサイクルを回す:制約の特定→最大活用→従属させる→強化→新しい制約の特定という5ステップのサイクルを繰り返すことでシステムと業務プロセスの継続的な改善が実現できる
よくある質問
-
QWebシステムでよくあるボトルネックはどこですか?
-
A
DBのスロークエリ・N+1問題・外部API呼び出しの待ち時間・同期処理のブロッキング・コネクションプールの枯渇が代表的です。まずAPMツールでトレースを確認することをお勧めします。
-
QN+1問題とは何ですか?
-
A
ループの中でDBクエリを繰り返し発行することでクエリ数がデータ件数に比例して増える問題です。例えば100件の記事を表示するときに各記事の著者情報を別々のクエリで取得すると101回のクエリが発生します。JOINやEager Loadingで解消します。
-
QTOC(制約理論)とはどういうものですか?
-
A
エリヤフ・ゴールドラットが提唱したマネジメント理論で「全体の制約(ボトルネック)を特定して集中的に改善することでシステム全体のパフォーマンスを向上させる」という考え方です。著書「ザ・ゴール」で広く知られています。
-
Q業務プロセスのボトルネック特定にはどんな方法がありますか?
-
A
バリューストリームマッピング(VSM)・プロセスマイニング・工程間の仕掛品(WIP)の量の可視化が代表的な手法です。最も仕掛品が溜まっている工程がボトルネックである可能性が高いです。
【出典】参考URL
https://newrelic.com/jp/platform :New Relic APMの公式サイト
https://dev.mysql.com/doc/refman/8.0/ja/slow-query-log.html :MySQLのスロークエリログの公式ドキュメント
https://e-words.jp/w/%E3%83%9C%E3%83%88%E3%83%AB%E3%83%8D%E3%83%83%E3%82%AF.html :IT用語辞典「ボトルネック」


コメント