/ proc / statを一度に読み取ることで、CPU使用率を計算する方法はありますか?


12

質問は、/ proc / statを1回読み取るだけで、CPU使用率を何らかの方法で計算できますか?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

IOWait(アイドル状態でカウントされることをどこかで読んでいた)以外の列を要約することを考えています。

  • user:ユーザーモードで実行される通常のプロセス
  • nice:ユーザーモードで実行されるnicedプロセス
  • システム:カーネルモードで実行中のプロセス
  • アイドル:親指をいじる
  • iowait:I / Oの完了を待機
  • irq:割り込みの処理
  • softirq:softirqのサービス
  • 盗む:不本意な待機
  • ゲスト:通常のゲストを実行しています
  • guest_nice:素敵なゲストを実行する

これは実行可能なアプローチですか、それとも完全に軌道に乗っていませんか?

回答:


11

あなたは正しい軌道に乗っており、topこの目的のためにこのファイルを使用しています。しかし、それを複数回読む必要があります。

使用率は、時間の経過とともに使用される尺度です。ホストの稼働時間を秒単位で知っていれば一度読んでからそれで割ることができますが、それはマシンがブートされてからのホストのユーティリティレートを与えます。

5秒を超えるレートが必要な場合は、ファイルを1回読み取り、5秒間スリープし、再度読み取り、計算の差を取得して5で除算します。


6

あなたのアプローチは正しいです。/ proc / statを生データとして使用し、rrdtoolなどにフィードできます。私はこのようなことを自分でやったので、それが100%可能であることを知っています。システム全体の負荷または各コアを個別に適切にグラフ化できます。

これが私自身の実際の例です: ここに画像の説明を入力してください

安心--あなたはそれを行うことができます、それは基本的な数学だけでは難しくありません、私のグラフはその実例です。データを収集するには、ramdiskにローカライズされた一時ファイルに/ proc / statのスナップショットを作成し、そのファイルを解析して1分ごとにデータを収集します。

データの解析方法(bashスクリプトのフラグメント):

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

rrdデータベースにデータを取得した後グラフを作成でき、空が限界です:) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


データをどのように解析しますか?
ewwhite 14年

@ewwhite->回答を編集して、データの解析方法を示しました。
バートウォミーザルゼッキ14年

美しいグラフ!:あなたの不足している列の注釈についてaskubuntu.com/a/120961/451886。VMで実行されている場合は、おそらく「スチール」カウンターです。
rkagerer

rrdtoolとramdiskの+1!
shadi

4

ワンライナーが必要な場合は、次のようになります。

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

結果: 97.17000000000000000000

使い方:

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

( 1055057784 - 1055058055 )/100bcにこのラインフィードを生成します。のようなものがあり-7.84000000000000000000、それをラップして100-$(value)再びbcにフィードするだけです

そこで: sleep #-1秒の遅延。この値を変更した場合、中間結果は秒数に分割されます。 $5-第五分野によれば、man prochttp://www.linuxhowtos.org/System/procstat.htm

これがうまくいかない場合はお知らせください。


0

または、ポイントawkが2桁だけで十分であれば、もっと簡単で読みやすくなります。

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.