キモブロ

Please spy check please, Fucking retard

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
202722秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
202722秒  all    4.03    0.00    0.66    0.01    0.00    0.01    0.00    0.00   95.29
2027220    6.11    0.00    0.86    0.01    0.00    0.00    0.00    0.00   93.01
2027221    2.27    0.00    0.44    0.00    0.00    0.00    0.00    0.00   97.29
2027222    5.85    0.00    0.87    0.04    0.00    0.00    0.00    0.00   93.24
2027223    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であるということがわかった。