TL

飽和とサチュレーション信号の検知

平均利用率では掴めない過負荷の予兆を、待ち行列の原理から見抜く。run queue長・実行待ち・スワップ・TCP backlogを先行指標として読む方法を解説します。

応用飽和オブザーバビリティ待ち行列理論性能SRE最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.利用率(平均)は飽和の手前で頭打ちになり、性能崩壊を予告しない。飽和(待ち行列の伸び)こそが先行指標になる。
  • 2.load averageは実行可能タスク数の指数移動平均で、CPU飽和とI/O待ちが混ざる。run queue長やPSIで分離して読むべき。
  • 3.スワップ発生・TCP accept backlog溢れ・実行待ち時間は、利用率が100%に達する前に劣化を予告するサチュレーション信号。

利用率だけでは飽和は見えない

性能監視で最もよく使われる指標は 利用率(utilization) です。CPU使用率、ディスクビジー率、コネクションプール占有率——いずれも「資源が稼働していた時間の割合」を平均したものです。しかし利用率には致命的な弱点があります。利用率は飽和の手前で頭打ちになり、その先の劣化を予告しない のです。

利用率の定義上の上限は100%です。一度100%に張り付くと、それ以上の情報を返しません。ところが現実の応答時間は、利用率が100%に届く前から急峻に悪化し、100%に達した後もさらに悪化し続けます。この「利用率では見えない領域」を直接捉えるのが 飽和(saturation) ——待ち行列に積まれた仕事の量です。

Brendan Gregg が提唱した USE法(Utilization / Saturation / Errors)が利用率と飽和を別軸として並べるのは、この両者が測っているものが本質的に違うからです。利用率は「どれだけ忙しいか」、飽和は「どれだけ捌ききれず溜まっているか」を表します。

飽和は「待ち行列の長さ」

飽和とは、資源に対して仕事が供給過剰になり、処理待ちの列(キュー)が形成されている状態を指します。CPUなら実行待ちプロセス、ディスクならI/O要求の滞留、ネットワークなら受信待ちコネクションです。列が伸びていること自体が、需要が供給能力を超え始めた証拠になります。

なぜ利用率が遅行指標になるのか

利用率が劣化を予告できない理由は、待ち行列理論の応答時間式から原理的に導けます。到着がランダム(ポアソン的)な単一サーバーの待ち行列(M/M/1)では、利用率を ρ とすると平均応答時間は次のように振る舞います。

平均応答時間 ∝ 1 / (1 - ρ)

ρ が 0.5 のとき分母は 0.5、ρ が 0.9 のとき分母は 0.1、ρ が 0.99 のとき分母は 0.01。つまり利用率が 0.9 から 0.99 へ「わずか9ポイント」上がるだけで、応答時間は約10倍に膨らみます。利用率の目盛りはほぼ平坦に見えるのに、その裏で待ち行列と応答時間は爆発しているのです。詳しくは/devops/queueing-theory-tail-latency/を参照してください。

ここに 平均 の罠が重なります。利用率を1分平均で取ると、その1分の中に「100%で詰まった瞬間」と「暇な瞬間」が混在しても、平均は中庸な値に丸められます。バースト的な飽和は平均化で消えますが、待ち行列はその瞬間に伸び、ユーザーは待たされています。飽和は瞬間値(あるいはキュー長そのもの)で見ないと意味がない のは、このためです。

load average の誤解

Linuxの load average は飽和指標として広く使われますが、最も誤解の多い数字でもあります。これは「CPU使用率」ではありません。load average は 実行可能(runnable)状態または割り込み不可能(uninterruptible, D state)状態のタスク数 を、1/5/15分の指数移動平均で表したものです。

ここに2つの落とし穴があります。

  1. コア数で正規化されていない。load average が 4.0 でも、4コアなら飽和ぎりぎり、16コアなら余裕です。load average ÷ コア数 で評価する必要があります。
  2. CPU飽和とI/O待ちが混ざる。Linuxでは、ディスクI/O待ちで D state に入ったプロセスも load average に算入されます。そのため、CPUは暇でもストレージが詰まれば load average は跳ね上がります。「load が高い=CPU不足」と即断すると誤診します。
load average は指数移動平均で遅れる

1分 load average ですら、過去の値を引きずる指数平滑化(時定数60秒)です。急増したスパイクは値に反映されるまで数十秒の遅れがあり、収まった後もしばらく高止まりします。リアルタイムの飽和検知には、平滑化前の run queue 長そのもの/proc/schedstatvmstatr 列)を見るべきです。

vmstat 1 の出力では、先頭の r 列が「実行待ちのプロセス数(run queue 長)」、b 列が「割り込み不可能スリープ中のプロセス数」です。r がコア数を継続的に超えているなら、それはCPUが飽和し、実行待ちの列が伸びている直接の証拠です。load average のように平滑化されていないぶん、先行指標として鋭く反応します。

真のサチュレーション信号

利用率が100%に達する に劣化を予告する、層ごとの代表的な飽和信号を整理します。

資源層サチュレーション信号何を意味するか
CPUrun queue 長 / PSI cpu someコア数を超える実行待ちタスクが滞留
メモリスワップイン・アウト / PSI memory物理メモリ不足で退避が発生(性能崖の直前)
ディスクI/O待ちキュー長 / await / PSI ioストレージ供給能力を要求が超過
ネットワークTCP accept backlog 溢れ / 再送コネクション受理が処理を追い越し滞留
スレッドプールキュー滞留数 / アクティブ比ワーカが枯渇しタスクが待たされている

メモリのスワップ は特に重要な先行指標です。利用率(メモリ使用量)が物理容量に近づくと、カーネルはページを退避し始めます。スワップイン/アウトが恒常的に発生し出した瞬間が「性能の崖」の入り口です。ディスク速度はメモリより桁違いに遅いため、スワップが回り出すとレイテンシは段違いに悪化します。メモリ使用率が高いことより、スワップ活動が始まったことのほうが、はるかに鋭い警告 です。

TCP の accept backlog はネットワーク層の飽和信号です。サーバーが accept() で接続を引き取る速度より、新規接続(SYN-ACK完了済み)の到着が速いと、完了済みコネクションのキューが溢れます。Linuxでは nstatTcpExtListenOverflows / TcpExtListenDrops の増加として観測でき、これはアプリケーションが受理処理を追い越されている——まさに飽和——を示します。利用率(CPU/メモリ)が無風でも、ここだけ溢れることは珍しくありません。バックプレッシャと過負荷の連鎖については/devops/congestion-collapse-backpressure/が詳しいです。

PSI:飽和を直接測るカーネル指標

Linux 4.20以降の PSI(Pressure Stall Information) は、飽和を間接推定ではなく直接測るために設計された指標です。/proc/pressure/cpumemoryio を読むと、some(少なくとも1つのタスクが資源待ちで停止した時間割合)と full(全タスクが同時に待たされた時間割合)が得られます。

これが飽和指標として優れている点は、「資源を待たされて実際に進捗が止まった時間」を測っている ことです。利用率は「資源が動いていた割合」ですが、PSIは「仕事が止められていた割合」——需要側から見た不足量を直接定量化します。memory full が増えていれば、利用率の見た目によらず確実にメモリ飽和が起きています。

先行指標として監視する

飽和監視の価値は 先行性(leading indicator) にあります。利用率やエラー率は結果が出てから動く遅行指標ですが、待ち行列の伸びは、応答時間が悪化し切る前に立ち上がります。アラート設計でこれを使う際は、症状(ユーザー影響)ベースのページングと組み合わせるのが定石です(/devops/alerting-theory/)。

  • 瞬間値・分位点で見る。平均利用率ではなく、キュー長そのものや PSI、run queue の高分位点を監視する。平均は飽和を平滑化で隠す。
  • 資源層ごとに分離する。load average のような混合指標に頼らず、CPU・メモリ・I/O・ネットワークの飽和を別々に観測し、どの層が詰まっているか特定できるようにする。
  • 崖の前で動く。スワップ開始・backlog 溢れ・キュー滞留の立ち上がりを閾値にすれば、利用率100%という遅い合図を待たずに、過負荷制御(/devops/adaptive-load-shedding/)を発動できる。

まとめ

  • 利用率は飽和の手前で頭打ちになり劣化を予告しない。応答時間は 1/(1-ρ) で爆発するため、利用率が平坦に見える領域で待ち行列は伸びている。
  • load average は CPU使用率ではなく、実行可能+I/O待ちタスク数の指数移動平均。コア数で正規化し、平滑化前の run queue 長で補う。
  • 真の先行指標は待ち行列の伸び——run queue 長・スワップ活動・TCP backlog 溢れ・PSI。利用率100%を待たず、崖の前で検知して手を打つ。

DevOps/インフラ Article

飽和とサチュレーション信号の検知を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

飽和

比較で見る軸

難易度: advanced / カテゴリ: DevOps/インフラ / タグ数: 5

導入後に効く点

load averageは実行可能タスク数の指数移動平均で、CPU飽和とI/O待ちが混ざる。run queue長やPSIで分離して読むべき。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
DevOps/インフラ
タグ数
5

判断チェックリスト

  • 自社の用途が「飽和 / オブザーバビリティ」に近いか確認する。
  • 強みである「利用率(平均)は飽和の手前で頭打ちになり、性能崩壊を予告しない。飽和(待ち行列の伸び)こそが先行指標になる。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

飽和オブザーバビリティ待ち行列理論性能SRE飽和オブザーバビリティ待ち行列理論