モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

MRTGなどでSNMPからCPU使用率を得る

MRTGでCPUのロードアベレージではなくCPU使用率を表示したい場合、ネットを検索するとSNMP

  • ssCpuRawUser.0(.1.3.6.1.4.1.2021.11.50.0) → ユーザCPU使用率
  • ssCpuRawSystem.0(.1.3.6.1.4.1.2021.11.52.0) → システムCPU使用率

で取れるという話が出てきます。


これをsnmpwalkで確認すると

$ snmpwalk -c example -v 2c localhost .1.3.6.1.4.1.2021.11.50.0
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 1043492

となにやらよくわからん数字が出てきてほんとにいいのか…?という気になります。


で、この話を調べていくと最初に詳細書かれた方のエントリがあるのですが、すでにサイトがなくなっていて参照できなくなっていました。

なのでWaybackMachineで探して読んでみました。


Net-SNMP & MRTGでCPU使用率 - 空振り日誌
https://web.archive.org/web/20070312134025/http://www.strikeout.jp:80/karaburi/2004/08/netsnmp_mrtgcpu_1.html

Net-SNMPのUCD-SNMP-MIB::ssCpuUserなどでCPU使用率[%]を取得したいけどDeprecatedになってるし、そもそも正しい値じゃなさそうだ。じゃあどうしたらいいのだろう。

CPU使用率[%]を単位時間あたりに消費されたCPU時間の割合と考える。その上でNet-SNMPMRTGでCPU使用率を取得するには、

  • UCD-SNMP-MIBのssCpuRaw〜がCPU時間の累積を表しているので、これを利用する
  • ssCpuRaw〜のカウンタ値の単位はtickらしい。Linuxでは1tick=10msらしい†1
  • MRTGのサンプリング時間は300秒(5分)†2で 300 * 1000[ms]だ
  • なので300,000ms間でCPU時間が何ms消費されたか分かればCPU使用率が出せる

以上を踏まえて、MRTGのデフォルト計算式は以下になるので

(今回の値 - 前回の値) / サンプリング時間

これをssCpuRawUserを例にして当てはめると

(今回のssCpuRawUserの値 - 前回のssCpuRawUserの値)[tick] / サンプリング時間[s]
= CPUタイム[tick] / サンプリング時間[s]

となる。これを以下のように計算する。

= CPUタイムT[tick] / サンプリング時間S[s] … (1)
= T*10[ms] / S*1000[ms] … 単位をmsにあわせる
= T / 100S … 約分する。ここまでCPU消費時間の割合が出る
= T / 100S * 100 … 百分率(%)で表したいので100をかける
= T / S … (2)
= CPU使用率[%]

結果的に(1)と(2)は同じ式になり、MRTGのデフォルト計算でCPU使用率が求められる。MRTGの設定としてはOptionsにguageも absoluteも指定しなければよい。ただ、これは1tick=10msだというのが前提なので、Kernelの設定なんかでこれが変更できたりする場合は適用できない。

前提条件がちょっと怪しいけど、vmstatを5分間隔で実行しときの結果とCPU使用率がほぼ同じになるので、これで良しとしている。


ということで、そのままMRTGに渡してやれば使えるようになってるとのことでした。
なので下記のように設定すれば良いようです。


mrtg.cfg 一部抜粋

Target[cpu_use]: .1.3.6.1.4.1.2021.11.50.0&.1.3.6.1.4.1.2021.11.52.0:example@localhost
MaxBytes[cpu_use]: 100
Options[cpu_use]: growright, noinfo, nopercent


(参考)

MRTGによるサーバ監視(SuSE編)
http://www.aconus.com/~oyaji/suse/mrtg_suse.htm