2015年1月8日木曜日

SNMP 64ビットのカウンタ

SNMP を使用したトラフィック量測定方法

インタフェースが受信した累積のバイト数 (インバウンド オクテット) を ifInOctets で取得できる。
インタフェースが送信した累積のバイト数 (アウトバウンド オクテット) を ifOutOctets で取得できる。

1. インバウンド オクテット (ifInOctets) または アウトバウンド オクテット (ifOutOctets) を一定の時間間隔 (例: 5分間隔) で取得する。

2. 測定値の差を時間で割る

例:
最初のインバウンド オクテットを ifInOctets1
5分後のインバウンド オクテットを ifInOctets2
とする

( ifInOctets2 - ifInOctets1 ) [バイト] ÷ 5[分]


単位を bps にするには、

( ifInOctets2 - ifInOctets1 ) × 8 ÷ 300 [bps]


32ビットカウンタについて

ifInOctets と ifOutOctets は、32ビットのカウンタなので、0 ~ (2の32乗-1) の整数が表現できる。
累積値が (2の32乗-1) を超えたら、0に一旦戻りカウントアップを続ける。


先ほど示したトラフィック量の計算式 ( ifInOctets2 - ifInOctets1 ) [バイト] ÷ 5[分]
が負になった場合、32ビットのカウンタが最大値を超えたと考えて計算することになる。

つまり、

(2の32乗 + ifInOctets2 - ifInOctets1 ) [バイト] ÷ 5[分]

と計算する。
計測間隔の間に2回以上32ビットのカウンタが最大値を超えると、正しく計算できない。
ここで、正しい値を求めるための計測間隔を求めてみる。

100Mbpsのインタフェースの場合、

2の32乗 [バイト] ÷ 100 [Mbps]
= { 2の(2 + 10 + 10 + 10)乗 × 8 } [ビット] ÷ { 100 × 10の6乗 } [ビット/秒]
= { 2の2乗 × 2の10乗 × 2の10乗 × 2の10乗 × 8 } [ビット] ÷ { 100 × 10の6乗 } [ビット/秒]

※ 概算で2の10乗 = 1024 ≒ 10の3乗 を使う。

≒ { 32 × 10の9乗 } [ビット] ÷ { 10の8乗 } [ビット/秒]
= 320 [秒]
≒ 5.3 [分]

よって、100Mbpsのインタフェースなら 5分間隔で取得すれば理論上計算できる。

1Gbpsのインタフェースの場合、間隔は10分の1になるので、30秒間隔で取得すれば理論上計算できる。

2の32乗 [バイト] ÷ 1 [Gbps]
≒ 32 [秒]

1Gbpsのインタフェースで、64ビットカウンタの ifHCInOctets や ifHCOutOctets が使える場合、こちらを使用すれば、取得間隔を延ばすことができます。
ただし、SNMPv2C または SNMPv3 を使用する必要があります。SNMPv1 では 64 ビットのカウンタがサポートされていません。

因みに、Zabbix 2.2 で Template SNMP Device のローレベルディスカバリを使って登録した場合、32ビットカウンタを使用し、1分間隔の計測となるので、1Gbps のインタフェースの計測を正しく行うには不十分である。


 参考

0 件のコメント: