web-dev-qa-db-ja.com

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

問題は、/ proc/statを1回読み取るだけで、どういうわけかCPU使用率を計算できるでしょうか。

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

IOWait(私はアイドルでカウントされることをどこかで読んでいました)以外の列を要約することを考えています、そしてそれは私に100%を与え、各個々の列は(column/100_percent)* 100によってパーセンテージに変換できます。

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

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

12
Istvan

あなたは正しい方向に進んでいます。topはこの目的でこのファイルを使用します。しかし、それを何度も読む必要があります。

使用率は、時間の経過に伴う使用量の測定です。ホストの稼働時間(秒)がわかっていれば、一度読み取ってそれで除算できますが、マシンが起動してからのホストのユーティリティレートがわかります。

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

11
Matthew Ife

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

これが私自身の作業例です: enter image description here

再考->あなたはそれを行うことができます、それは基本的な数学だけでは難しくありません、そして私のグラフはその実例ですデータを収集するために私はスナップショットをします/ proc/statをramdiskにローカライズされた一時ファイルに追加し、そのファイルを解析して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

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

_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 )/100_を生成し、次にこのラインフィードをbcに送ります。 _-7.84000000000000000000_のようなものになり、それを100-$(value)にラップして、再びbcにフィードします

そこで:_sleep #_-1秒の遅延。この値を変更した場合、中間結果は秒数に分割されます。 _$5_-_man proc_および http://www.linuxhowtos.org/System/procstat.htm に基づく5番目のフィールド

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

4
Putnik

または、ポイントawkが2桁で十分であれば、awkを使用すると、はるかに簡単で読みやすくなります。

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
0
slaxor