# CPU 利用率
## 定義
CPU 利用率(%CPU)とは、対象プロセスまたはシステム全体が CPU コアをアイドル状態以外で占有していた時間の割合を示すメトリクスである。`top(1)` や `ps(1)` などのツールが表示する標準的な指標。ただし、この「非アイドル時間」には**実際の演算(命令の実行)**と**メモリ待機(ストール)**の両方が含まれており、CPU が本当の意味でどれだけ仕事をしているかは示さない。(Source: [[@2017__brendangregg.com__CPU Utilization is Wrong]])
### なぜ誤解を招くか
現代の CPU は DRAM よりも遙かに高速に動作する(CPU-DRAM ギャップ)。このため、%CPU = 100% を示すプロセスであっても、大半の時間がメモリ待機(ストールサイクル)に費やされている場合がある。例として、IPC(サイクルあたり命令数)= 0.78 のシステムは、4-wide プロセッサとしては最高速度の 19.5% しか発揮していない計算になる。
### %CPU が隠す追加要因
| 要因 | 説明 |
|------|------|
| **サーマルスロットリング** | 発熱時にクロックが下がり、同じ %CPU で実効性能が低下する |
| **可変クロック** | Turboboost / SpeedStep / P-state により「1 サイクル」の実時間が変動する |
| **スピンロック** | ビジーウェイトが %CPU を消費するが論理的な仕事ゼロ |
| **分単位平均** | バースト性(例: 1 分中 1 秒 100%)が平均に埋没する |
## 横断的知見
- **%CPU の誤謬は CPU-DRAM ギャップとともに拡大する**: Gregg(2017) が指摘したとおり、CPU の演算速度向上に DRAM 帯域が追いついていないため、ワークロードのメモリバウンド傾向が増し、%CPU の代理指標としての精度は下がり続けている。(Source: [[@2017__brendangregg.com__CPU Utilization is Wrong]])
- **正しい代替は IPC(Instructions Per Cycle)**: %CPU だけでなく IPC を監視することで、メモリバウンドか命令バウンドかを区別できる。[[ハードウェアカウンタ]]の `cycles` と `instructions` から計算可能で、Linux `perf stat` が直接報告する。(Source: [[@2017__brendangregg.com__CPU Utilization is Wrong]])
## 未解決の問い
- クラウド・コンテナ環境では CPU ピニングや cgroup の影響で %CPU の計算がさらに複雑になるが、IPC ベースの監視はどう実現するか。
- Turboboost / SpeedStep により可変クロック下での IPC 解釈はどう補正すべきか。
- GPU の SM 利用率は %CPU と同じ誤謬を抱えるか。GPU 版 IPC にあたるメトリクスは何か([[GPU観測性]])。
## 関連
- ソース: [[@2017__brendangregg.com__CPU Utilization is Wrong]]
- 概念: [[Instructions Per Cycle]] / [[ハードウェアカウンタ]] / [[メモリバウンド]] / [[継続的プロファイリング]]
- エンティティ: [[Brendan Gregg]]
- 混同注意: [[IPCメトリクス]] は「プロセス間通信メトリクス(Inter-Process Communication Metrics)」であり、本ページの IPC とは別概念
## 出典
- [[@2017__brendangregg.com__CPU Utilization is Wrong]](%CPU の非アイドル時間定義・IPC による正当化・CPU-DRAM ギャップ)