CloudforecastのCPU使用率は、マルチコアの場合は全コアの累積値をもとにした値
以下のコードがcloudforecastがSNMPからデータを取得してくる場所
https://github.com/kazeburo/cloudforecast/blob/master/lib/CloudForecast/Data/Basic.pm#L42
# データを取得してくるところ # initで定義した順番で、配列のリファレンスで返す fetcher { my $c = shift; #$c->hostname $c->address $c->detail $c->component(SNMP)->.. #$c->args->[0]... #$c->ledge_(get|add|set|delete).. #cpu my @map = map { [ $_, 0 ] } qw/versionTag ssCpuRawUser ssCpuRawNice ssCpuRawSystem ssCpuRawIdle ssCpuRawWait ssCpuRawKernel ssCpuRawInterrupt ssCpuRawSoftIRQ/;
みたいな感じでSNMPのssCpuRawUserというOIDの値を使っている。
ssCpuRawUserの値の意味はnet-snmpのサイトによれば
The number of 'ticks' (typically 1/100s) spent processing user-level code. On a multi-processor system, the 'ssCpuRaw*' counters are cumulative over all CPUs, so their sum will typically be N*100 (for N processors).
http://www.net-snmp.org/docs/mibs/ucdavis.html
とのことで、つまるところssCpuRaw系の値はマルチコアシステムにおいてはすべてのCPUのticksの累加値であるということがわかる。そして、それらの合計値はプロセッサー * 100である。と書いてある。どういうことやねん。
ちょっとよくわからない部分はあるが、まぁいずれにせよ、すべてのプロセッサの累計値を元に算出していることはわかったので個別のCPUの負荷だけ高いサービスではこの値はかなり低く見積もられてしまうということに注意する必要があるということか。たとえば1CPUしか使わないデーモンとか(例1:srcds, 例2: srcds, 例3: srcds)
なお、マルチコア環境で個別のCPU使用率をとるには
$ mpstat -A 20時27分22秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 20時27分22秒 all 4.03 0.00 0.66 0.01 0.00 0.01 0.00 0.00 95.29 20時27分22秒 0 6.11 0.00 0.86 0.01 0.00 0.00 0.00 0.00 93.01 20時27分22秒 1 2.27 0.00 0.44 0.00 0.00 0.00 0.00 0.00 97.29 20時27分22秒 2 5.85 0.00 0.87 0.04 0.00 0.00 0.00 0.00 93.24 20時27分22秒 3 1.89 0.00 0.44 0.00 0.00 0.04 0.00 0.00 97.63
でできた。
こっから個人的な話として、いまivyのcore i3 3240(2core, 4thread)を使ったサーバーなのだが、なぜか4つのprocessorとして認識されている。/proc/cpuinfoも。まぁハードウエア詳しくないのでそういうもんなんだと思う。
$ cat /proc/cpuinfo | grep processor processor : 0 processor : 1 processor : 2 processor : 3
/proc/statからも4つに見えてる
$ cat /proc/stat cpu 7132225 314 1160782 168743583 21558 21 19737 0 0 cpu0 2702868 82 381992 41122255 5130 0 151 0 0 cpu1 1006212 47 197009 43139420 224 0 16 0 0 cpu2 2587344 153 385581 41245047 15596 0 526 0 0 cpu3 835799 30 196199 43236859 606 21 19042 0 0
ガチのリアルコア数ってどうやってとんねんと思ったら
$ cat /proc/cpuinfo | grep "cpu cores" cpu cores : 2 cpu cores : 2 cpu cores : 2 cpu cores : 2
cpuinfoにcpu coresって記述があるらしい。
物理CPU数も同様に
$ cat /proc/cpuinfo | grep "physical id" physical id : 0 physical id : 0 physical id : 0 physical id : 0
IDが0番のすべて同一の物理CPUであるということがわかった。