問題は、/ proc/statを1回読み取るだけで、どういうわけかCPU使用率を計算できるでしょうか。
# head -1 /proc/stat
cpu 67891300 39035 6949171 2849641614 118251644 365498 2341854 0
IOWait(私はアイドルでカウントされることをどこかで読んでいました)以外の列を要約することを考えています、そしてそれは私に100%を与え、各個々の列は(column/100_percent)* 100によってパーセンテージに変換できます。
これは実行可能なアプローチですか、それとも完全に軌道に乗っていませんか?
あなたは正しい方向に進んでいます。top
はこの目的でこのファイルを使用します。しかし、それを何度も読む必要があります。
使用率は、時間の経過に伴う使用量の測定です。ホストの稼働時間(秒)がわかっていれば、一度読み取ってそれで除算できますが、マシンが起動してからのホストのユーティリティレートがわかります。
5秒を超えるレートが必要な場合は、ファイルを1回読み取り、5秒間スリープし、再度読み取り、計算の差を取得して5で除算します。
あなたのアプローチは正しいです。/proc/statを生データとして使用して、たとえばrrdtoolをフィードできます。私はこのようなことを自分でやったので、100%可能だとわかっています。次に、システム全体の負荷または各コアを個別にグラフ化できます。
これが私自身の作業例です:
再考->あなたはそれを行うことができます、それは基本的な数学だけでは難しくありません、そして私のグラフはその実例ですデータを収集するために私はスナップショットをします/ 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番目のフィールド
これでうまくいかない場合はお知らせください。
または、ポイント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