top
topについては、2017年にNetflixのパフォーマンスエンジニア(Brendan Gregg)がBusyの値にWaiting("stalled")が含まれると指摘して、以降パフォーマンスカウンタを見るのが一般的です。 VMwareでも、パフォーマンスカウンタを仮想マシンから見られるオプションが入ってるでしょ。
CPU使用率は、非常に誤解を招く指標になりつつあります。
最近の負荷の多くを占める、メインメモリを待っているサイクルを含んだ値になっているためです。
CPUストールのサイクルが他のことに使われないなら、それは「待つために使用中」(矛盾して聞こえますね)なのでしょうか?
場合によっては答えはYesで、OSレベルでの指標としてはCPU使用率は技術的に正しいと言えますが、しかしとても誤解を誘うものでもあります。
ハイパースレッド(Hyper-Threading)ではこれらのストールサイクルは別のスレッドで使用できるので、CPU使用率は実は使用可能なサイクルを含んでしまう可能性があるのです。これはよくありません。 サイクル毎の命令数(IPC)のような他の指標を使うことで、%CPUが実際何を意味しているかを知ることができます。IPCが1.0より小さければメモリーバウンド、IPCが1.0より大きければ命令バウンドである可能性が高いことを示します。
"stalled"(訳注 : 以下ストールと言う)とは、プロセッサーが命令の実行を進めていないことを意味していて、これは通常メモリーのI/Oを待っているために発生します。上に描いた(BusyとStalledの)比率は、私が本番環境でよく見るものです。ほとんどストールしていても、それを知らない可能性が高いのです。 私たちがCPU使用率と呼んでいる指標は、実際は「アイドルでない時間」、つまりCPUがアイドルスレッドを実行していない時間です。 top(1)で%CPUが高い時には、ヒートシンクとファンの下にあるあのCPUパッケージ、つまりプロセッサーがボトルネックになっていることを考えるでしょう。しかし実はボトルネックはDRAMのバンクなのです。
CPUが本当は何をしているかを伝えるには、Linux perfなどを使って読み出せるハードウェアカウンターであるPerformance Monitoring Counters (PMC)を使います。例えば、システム全体を10秒間監視してみましょう。 top(1)に対しては、Linuxではtiptop(1)があり、プロセス毎のIPCを表示してくれます。 @takehora: CPUとメモリの間のI/Oのボトルネックを解消すべく生まれてきたのが、AppleのM1を始めとするCPU群なわけですよ。パフォーマンス界隈では、メモリのボトルネック解消が焦点になってるんです。