snmpで取得したCPU使用率と、topとかvmstatで見る使用率が違うんで困ってるんですけどー。
と言われたので調べてみた。
エージェントはnet-snmpdの5.1.2
MIBは
.1.3.6.1.4.1.2021.11.11
UCD-SNMP-MIB::ssCpuIdle.0
だ。
結論から言うと、上記のMIBの値は /proc/stat から取得した値を加工して算出しているので、システム起動時からの平均CPUアイドル率だった。よって top の結果と値が違ったと。
取得の処理は net-snmp のソースコードの中の
agent/mibgroup/ucd-snmp/vmstat.c
に書かれていて、抜粋していくと
getstat(&cpu_use, &cpu_nic, &cpu_sys, &cpu_idl,
&pgpgin, &pgpgout, &pswpin, &pswpout, &inter, &ticks, &ctxt,
&cpu_wait, &cpu_irq, &cpu_softirq);
duse = cpu_use + cpu_nic;
dsys = cpu_sys;
didl = cpu_idl;
ddiv = duse + dsys + didl;
case cpuidle:
return (100 * didl / ddiv);
なんとなくgetstatの1-4番目の引数を使ってることがわかった。んで、getstat の定義が
#define STAT_FILE "/proc/stat"
static void
getstat(unsigned long *cuse, unsigned long *cice, unsigned long *csys,
unsigned long *cide, unsigned *pin, unsigned *pout,
unsigned *swpin, unsigned *swpout, unsigned *itot, unsigned *i1,
unsigned *ct, unsigned long *ciow, unsigned long *cirq,
unsigned long *csoft)
{
statfd = open (STAT_FILE, O_RDONLY, 0)
while (read(statfd, buff, bsize) == bsize) {
bsize += 256;
buff = realloc(buff, bsize);
DEBUGMSGTL(("vmstat", "/proc/stat buffer increased to %d\n", bsize));
close(statfd);
statfd = open (STAT_FILE, O_RDONLY, 0);
}
*cuse = (unsigned long)cusell;
*cice = (unsigned long)cicell;
*csys = (unsigned long)csysll;
*cide = (unsigned long)cidell;
sscanf(b, "cpu %llu %llu %llu %llu %llu %llu %llu", &cusell,
&cicell, &csysll, &cidell, &ciowll, &cirqll, &csoftll)
}
こんな感じ。だいぶ省略してるけど。
ようは /proc/stat からcpuの情報を読み込んで、
ssCpuIdle = アイドル時間/(ユーザー時間+ナイス時間+アイドル時間)
って感じで計算してたみたいです。
snmp 経由で(リアルタイムな)CPU負荷の監視をする場合は、
.1.3.6.1.4.1.2021.10
のロードアベレージを使うか、
.1.3.6.1.4.1.2021.10.11の
UCD-SNMP-MIB::ssCpuRawUser.0
UCD-SNMP-MIB::ssCpuRawNice.0
UCD-SNMP-MIB::ssCpuRawSystem.0
UCD-SNMP-MIB::ssCpuRawIdle.0
あたりを定期的に監視して計算するかしないとダメってことですね。
誰か他にいい方法あったら教えてください。