CPUの使用率のグラフからSoftIRQ(Software interrupts)が抜けてしまっていたので追加して、いくつか修正を加えた。
↑午前2時ぐらいからちゃんとでるようになってる。通信が多いサーバではインパクトがある変更かもしれません。
Net-SNMP(UCD-SNMP-MIB)のCPU使用率に関する項目は
- UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 428160510
- UCD-SNMP-MIB::ssCpuRawNice.0 = Counter32: 381268
- UCD-SNMP-MIB::ssCpuRawSystem.0 = Counter32: 95049839
- UCD-SNMP-MIB::ssCpuRawIdle.0 = Counter32: 1753791119
- UCD-SNMP-MIB::ssCpuRawWait.0 = Counter32: 5234407
- UCD-SNMP-MIB::ssCpuRawKernel.0 = Counter32: 94121787
- UCD-SNMP-MIB::ssCpuRawInterrupt.0 = Counter32: 256622
- UCD-SNMP-MIB::ssCpuRawSoftIRQ.0 = Counter32: 671430
これだけあります。Linux では /proc/stat を参照していて、
cpu 428160511 381268 94121788 1753791119 5234407 256622 671430
user nice system idle iowait intr soft
と関連付けられます。
各項目について調べていると、 ssCpuRawSystem が system + iowait + interrupts + softirq の合計値という説明をみますが、これは新しいNet-SNMPでは間違った説明です。Net-SNMP 5.4 からは ssCpuRawSystemが system の数値となり、sCpuRawKernelは常に「0」と表示されます。(Linux 2.6系において)
そこでssCpuRawKernelを捨ててグラフを作ればいいと思ったのですが、残念なことに CentOS5系はまだ Net-SNMP 5.3系。仕方がないのでCloudForecastではNet-SNMPのバージョンを取得し、5.4以上かどうかで処理を分けるようにしました。
グラフ上の項目とMIBは、5.3以下では
- User => ssCpuRawUser
- Nice => ssCpuRawNice
- System => ssCpuRawKernel
- Idle => ssCpuRawIdle
- Wait => ssCpuRawWait
- Intr => ssCpuRawInterrupt
- SoftIRQ => ssCpuRawSoftIRQ
となり、5.4以上では
- User => ssCpuRawUser
- Nice => ssCpuRawNice
- System => ssCpuRawSystem
- Idle => ssCpuRawIdle
- Wait => ssCpuRawWait
- Intr => ssCpuRawInterrupt
- SoftIRQ => ssCpuRawSoftIRQ
となっています。
この実装をするにあたり、CloudForecastのプラグインにあとからRRDの項目を追加する機構をいれました。追加データ1つにつき新しいRRDファイルが一個できます。これまではRRDファイルを一度作ってしまうと項目を足す事ができず、最初の設計で悩むことが多かったのですが、これで監視項目の追加もずいぶん楽になりました。使い方は CloudForecast::Data::Basic を参考にして頂けたらと思います。