CPU使用率を毎回同じにする。


13

次のコマンドを実行してCPU使用率を取得すると、nice + user cpu usageが表示されます。

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

出力:

14.5

ここで問題になっているのは、出力がtopコマンドに依存しているため、topコマンドとして即座に変更されないことです。だから私はすぐに正しいCPUを取得していません。同じ出力を提供し、変化しません。

出力でリアルタイムCPUを取得したい。コマンドを改善するのを手伝ってください。


1
そして質問は?
デニスカースメーカー

を先頭に追加したコマンドを実行してみてくださいtime。私のシステムでは0.165秒しかかかりません。
廃止

編集したコマンドを教えてください。
ケタンパテル

試してみてください:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid

異なるシステムでテストした後、出力に違いはありません
ケタンパテル

回答:


13

あなたは正しい、top最初の反復で誤ったCPU使用率を与えるように見えます。この問題は次のように回避できます。

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

これにはもちろん2倍の時間がかかりますが、とにかく動作します。

それでも高速に動作するようにしたい場合は、-dオプションを使用できます。たとえば、測定の合計期間が1秒の場合、その半分を使用します。

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

serverfault.com/a/436499/134517の場合 も、ほぼ1秒ではなく約1秒かかるため、2倍以上の時間がかかります。
altendky

altendkyによるコメントに加えて、問題がそもそもそこにある理由の説明については、terdonによる回答も参照してください。
ルスラン

6

技術的には、最初のtopものは常に同じ値を出力するとは限りません。最後のブート以降の平均CPU負荷を出力するだけです。ので、top用途のデルタ/proc/stat不正確な(しかしWAD)結果をもたらす、ゼロに対して比較しながらCPU負荷を算出する統計は、最初の値が算出されます。

を使用したくない場合はtop、直接解析できます/proc/stat

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

また、この方法でより速く、より正確になります。

以下でテストできますstress

stress -c 1 -q &

そして、やります

killall stress

後。


いいね あなたのコマンドは「CPU」と呼ばれるファイルに配置されている場合と、その後、watchその上で実行することができます:watch -n1 "bash ./cpu"
ブレント・ファウスト

解析するawkスクリプト /proc/statはかなりクールですが、topの最初のイテレーションと同じ欠点があるように見えます。つまり、現在のブート負荷ではなく、最後のブート以降の平均CPU負荷を出力します。
ピロキシー

5

@Ruslanの答えを拡張してtop、ユーザー、システムプロセス、niceプロセス間でCPU使用率を分割するために、3つの合計が必要です。そこで、我々は実行することができますtopb私たちは、その出力を解析することを可能にするATCHモード。ただし、ここで説明したようにでに、最初の反復でtop -bはブート以降のパーセンテージが返さ-n 2れるため、現在のパーセンテージを取得するには少なくとも2回の反復()が必要です。速度を上げるために、d反復間の遅延を次のように設定できます0.01

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'

4

ps出力に基づいてこれを使用するかもしれません:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

0

watchコマンドまたはシェルのforループを使用して、

すなわち watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"


同じことが時計で起こる
ケタンパテル

0

なぜCPU使用量を気にしますか?負荷平均ははるかに良い指標であります:

cat /proc/loadavg

CPUの使用率が本当に必要な場合/proc/statは、おそらく解析が最適です。


1
負荷平均は、基本的にCPU使用率の時間積分です(時間で除算されます)。完全に異なるユースケースがある場合、積分特性は微分特性よりも(すべての)はるかに優れた指標であると言うのはなぜですか?また、/proc/statCPU使用率をそのままではなく、読み取りと読み取りの間に時間を空けて2回読み取り、CPU使用率を取得するための計算を行う必要があります。これはまさにそれですtop
ルスラン

私は数学ができないので、積分と差分の違いを本当に理解していないことを認めなければなりません:/「負荷平均は基本的にCPU使用率の時間積分です」-それは本当ですか?D状態でハングするプロセスを知ると、負荷は増加しますが、CPU使用率は増加しません。「なぜ...」-OPは彼が本当に達成したいことを言っていないので、正直に言うと、彼はシステム負荷を測定したいと思い、CPU使用率がこのための最良の指標になると思いました、だから私は彼に負荷平均を指示しました。
マーティン・フォン・ウィッティヒ

リンクから:「システムは、負荷平均を指数的に減衰/加重された移動数の移動平均として計算します。」「システム負荷は計算作業の量の尺度です」。D状態は計算作業を行っていません。取っているのは、CPU時間を使用するプロセスです。したがって、平均負荷は基本的に、CPUが一定時間(たとえば、数分から数十分)アイドル状態であった時間の割合です。CPU使用率は、ミリ秒単位の時間スケールでCPUがアイドル状態になっていない時間の割合です。つまり、CPUを読み取るたびに更新され、現在の状態が反映されます。
ルスラン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.