インタフェースが受信した累積のバイト数 (インバウンド オクテット) を 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 のインタフェースの計測を正しく行うには不十分である。
参考
- SNMP を使用した帯域幅使用率の計算方法 - Cisco Systems
- SNMP カウンタ:FAQ - Cisco Systems
- http://xoops.fens.net/modules/hinemosu/details.php?bid=239
- https://www.zabbix.com/forum/showthread.php?t=47317&page=2
0 件のコメント:
コメントを投稿