私は、クラウドでUbuntu Precise Pangolin LTS 64ビットを実行しているいくつかの4コアサーバーで非常に多くの処理を実行しています(仮想化環境であると思います)。
CPU使用率を監視するために、「top -b -n 1」(つまり、topの1回の実行、最初の「フレーム」のみ)を使用し、それを他のデータとマージして小さなレポートを作成する.shを作成しました。 。
ただし、4つのコアすべてが100%ビジーであると確信していても、topは常にCPUラインで64%がアイドル状態であると報告しました。
実際、topをインタラクティブに実行すると、最初のフレームで64%のアイドル時間が報告されますが、更新するとすぐに正しい(ほぼ0%のアイドル)データが報告されます。
vmstatも、cpu列で、常に最初の行で64%のアイドル時間を報告し、次に(おそらく)実際のデータの報告を開始します。
それはなぜです? top/vmstatまたはカーネルのバグですか?それとも、CPU%の測定方法の既知の副作用ですか?なぜ常に64%なのですか?
代わりに、CPU負荷は常に正しいです(約4)。
これは、最初の実行でtop、vmstat、iostatがすべて、システムの最後の再起動時刻以降にデータを収集するためです。
そして、連続する反復は、指定したサンプリング期間で実行されます。したがって、topの最初の実行では、%idle時間が表示されます。これは、再起動からtopを実行するまで、%アイドル状態であったためです。ただし、次の反復では、ビジーであるため、%idleは表示されません。
最初の反復を除外し、必要な間隔でサンプリングしてみてください。
これを行うには、「Cpu(s)」で始まる行をgrep
pingし、結果をtail
にパイプします。
top -b -n2 -d 0.1 |grep "Cpu(s)"|tail -n +1
tail -n +1
最初の行(悪い結果)を破棄し、2番目の行のみを通過させます。 -d 0.1
は、top
の最初の反復と2番目の反復の間の10分の1秒の遅延を意味します。 -b -n2
は、バッチモードで2回実行することを意味します。これの最終出力は、レポートで使用できる「良好な」結果を含む1行です。
「CPU」行以外の行が必要な場合は、すすぎ、それぞれについて繰り返します。