Cactiがサーバーのトラフィックを取得し、監視するまで

Cactiがサーバーのインターフェイスを取得し、監視できるまでを追っていく。


[取得する値(どのSNMPを指定するか)を決定する]
Collection Methods > SNMP - Interface Statistics
ここから「In/Out Bits」または「In/Out Bits (64-bit Counters)」で、
「Data Source」で選択する。

Data Source: traffic_in ifHCInOctets
Data Source: traffic_out ifHCOutOctets





※参考 それぞれsnmpで以下のようにBytesで取得している。

$ snmpget -c community -v 2c サーバー ifHCInOctets.インターフェイス番号
IF-MIB::ifHCInOctets.インターフェイス番号 = Counter64: 6229064680749
$
$ snmpget -c community -v 2c サーバー ifHCOutOctets.インターフェイス番号
IF-MIB::ifHCOutOctets.インターフェイス番号 = Counter64: 5741880888851
$

※なおこの数値は、ifconfigのRX bytesおよびTX bytesでも確認できる。

$ ifconfig bond0
bond0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::xxxx/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:18959784934 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17914116716 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6229446332254 (5.6 TiB)  TX bytes:5742265734034 (5.2 TiB)
$

※インターフェイス番号は「ifDescr」で確認できる。以下の例では、bond0は5番。

$ snmpwalk -v 2c -c community サーバー ifDescr
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1
IF-MIB::ifDescr.4 = STRING: sit0
IF-MIB::ifDescr.5 = STRING: bond0
$


[取得した値をどう扱うか設定する]
Console -> Graph Templates -> 「Interface - Traffic (bits/sec)」を選択する

Item # 1~Item # 8は共通設定とし、以下設定内容。

CDEF Function 元データを操作する。
・「None」 元データをいじらない。
・「Turn Bytes into Bits」 元データを8倍する。ifHCInOctetsなどならここでbit換算される。
GPRINT Type → Normal
・「Exact Numbers」 元データを単位換算せずにそのまま表示。
・「Normal」元データを読みやすく単位換算して表示する。
※なおGPRINTはグラフの表示のみに影響し、監視は元データ(ifHCInOctetsなど)をそのまま利用する。





[グラフ作成]
Management > Devices > 追加するサーバーを選択
SNMP Version → 「Version 2」を選択
Associated Data Queries → 「SNMP - Interface Statistics」を選択

上部の「Create Graphs for this Host」を選択

「Data Query [SNMP - Interface Statistics]」から「Select a graph type」を選択する
OSが64bitの場合 Select a graph type:「In/Out Bits(64-bit Counters)」を選択
OSが32bitの場合 Select a graph type:「In/Out Bits」を選択

取得するデバイスを選択して、「Create」を押す。



[監視テンプレートを作成する]

> Threshold Template > 「add」をクリック。
Data Template:「Interface Traffic」を選択。
Data Source:「traffic_in」を選択し、のちほど「traffic_out」の分も作成する。

Template Name:適当な名前を入力する(! Traffic in 200Mb/s など)
High Threshold:閾値を入力する。この閾値は「Data Source」の実数に対して閾値を設定するので、ifHCInOctets/ifHCOutOctetsであればバイト単位なので、以下のようにByte換算した数値を指定する。
100Mb/sの閾値 12500000
200Mb/sの閾値 25000000
...
600Mb/sの閾値 75000000
...
1Gb/sの閾値 125000000

Data Type:「Exact Value」を選択する
Alert Emails:閾値を超えたときのメールアドレスを入力する。
最後に「Save」をクリックする。



[監視を設定する]

グラフリストから対象のサーバーを表示し、「Create Threshold」ボタンを押す。



テンプレートを選択する。サンプル画像は200Mb/sの制限を選んだ。


設定後は、「Thold」タブで、現在の値と閾値などが一覧できるので、微調整およびメンテナンス時には一時的に無効にするなどをする。





[未検証:取得するインターフェイスの決定方法]

取得するインターフェイスは、「Data Template」の「Index Type」で決まっている・・・気がするがまだmanしてない。変更方法は以下の通り。

Console -> Data Templates から「Interface - Traffic」を選択。
Index Typeは空になっているが、デバイスに設定後は、「ifDescr」が選択される。
デバイスの一覧で選べるのは以下の通り。

ifAlias
ifDescr
ifHighSpeed
ifHwAddr
infIndex
ifIP
ifName
ifOperStatus
ifSpeed
ifType

それぞれの実行例は以下の通り。

$ snmpwalk -c community -v 2c サーバー ifAlias
IF-MIB::ifAlias.1 = STRING:
IF-MIB::ifAlias.2 = STRING:
IF-MIB::ifAlias.3 = STRING:
IF-MIB::ifAlias.4 = STRING:
IF-MIB::ifAlias.5 = STRING:
$
$ snmpwalk -c community -v 2c サーバー ifDescr
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1
IF-MIB::ifDescr.4 = STRING: sit0
IF-MIB::ifDescr.5 = STRING: bond0
$
$ snmpwalk -c community -v 2c サーバー ifHighSpeed
IF-MIB::ifHighSpeed.1 = Gauge32: 10
IF-MIB::ifHighSpeed.2 = Gauge32: 1000
IF-MIB::ifHighSpeed.3 = Gauge32: 1000
IF-MIB::ifHighSpeed.4 = Gauge32: 0
IF-MIB::ifHighSpeed.5 = Gauge32: 10
$
$ snmpwalk -c community -v 2c サーバー ifHwAddr
ifHwAddr: Unknown Object Identifier (Sub-id not found: (top) -> ifHwAddr)
$
$ snmpwalk -c community -v 2c サーバー infIndex
infIndex: Unknown Object Identifier (Sub-id not found: (top) -> infIndex)
$
$ snmpwalk -c community -v 2c サーバー ifIP
ifIP: Unknown Object Identifier (Sub-id not found: (top) -> ifIP)
$
$ snmpwalk -c community -v 2c サーバー ifName
$
IF-MIB::ifName.1 = STRING: lo
IF-MIB::ifName.2 = STRING: eth0
IF-MIB::ifName.3 = STRING: eth1
IF-MIB::ifName.4 = STRING: sit0
IF-MIB::ifName.5 = STRING: bond0
$
$ snmpwalk -c community -v 2c サーバー ifOperStatus
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.3 = INTEGER: up(1)
IF-MIB::ifOperStatus.4 = INTEGER: down(2)
IF-MIB::ifOperStatus.5 = INTEGER: up(1)
$
$ snmpwalk -c community -v 2c サーバー ifSpeed
IF-MIB::ifSpeed.1 = Gauge32: 10000000
IF-MIB::ifSpeed.2 = Gauge32: 1000000000
IF-MIB::ifSpeed.3 = Gauge32: 1000000000
IF-MIB::ifSpeed.4 = Gauge32: 0
IF-MIB::ifSpeed.5 = Gauge32: 10000000
$
$ snmpwalk -c community -v 2c サーバー ifType
IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)
IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.3 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.4 = INTEGER: tunnel(131)
IF-MIB::ifType.5 = INTEGER: ethernetCsmacd(6)
$

トラブルシュート

■bondが本当は何Mb/sでも、上限が10Mb/sとか79Mb/sになってしまう
  bondで本当は数百Mb/s出ているのに、グラフでは数Mb/sになってしまう
   ※Thresholdsで指定した値と、グラフの数値が一致しない場合や、
     物理インターフェイスとbondで差異がある場合には、だいたいこの問題が絡んでいる。

[原因]
原因の1つとして、bond0のifSpeed値と、
Data Sources > Interface - Traffic > 「Data Source Item Fields」
の値が不一致を起こしている。

[理由]
「Data Source Item Fields」はグラフの上限値を定めているが、その元データは「|query_ifSpeed|」を利用する。これは
$ snmpwalk -c community -v 2c サーバー ifSpeed
の結果を利用しており、ここでbond0が10Mb/sと返すと、グラフの上限が10Mb/sになってしまう(場合により79Mb/sで折り返すこともあったが、こちらの理由は今のところ不明)。


[対策1 サーバー側で対処する]
bondの速度を10Mbpsから正しい値(1Gbpsなど)に修正する。

※こちらを参考に・・・
 →参考 http://d.hatena.ne.jp/hogem/20111126/1322318205

snmpd.conf に以下のように書くといいとのことで、CentOS6.3でやってみたらうまくいって、
グラフも正常になりますた。

1 問題のbondインターフェイス番号を取得する
snmpwalk -c community -v 2c サーバー ifDescr

$ snmpwalk -c community -v 2c サーバー ifDescr
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: em1
IF-MIB::ifDescr.3 = STRING: em2
IF-MIB::ifDescr.4 = STRING: em3
IF-MIB::ifDescr.5 = STRING: em4
IF-MIB::ifDescr.6 = STRING: bond0
$

2 現在の値を取得する
$ snmpwalk -c community -v 2c サーバー ifSpeed

$ snmpwalk -c community -v 2c サーバー ifSpeedIF-MIB::ifSpeed.1 = Gauge32: 10000000IF-MIB::ifSpeed.2 = Gauge32: 1000000000IF-MIB::ifSpeed.3 = Gauge32: 1000000000IF-MIB::ifSpeed.4 = Gauge32: 0IF-MIB::ifSpeed.5 = Gauge32: 0IF-MIB::ifSpeed.6 = Gauge32: 10000000$

snmpd.confを正しい値に修正する

snmpd.conf
interface bond0 6 1000000000
interface bond1 6 1000000000
※6はインターフェイス番号

4 snmpをリロードする

5  現在の値を取得し、設定が正しく反映されたことを確認する。
$ snmpwalk -c community -v 2c サーバー ifSpeed
IF-MIB::ifSpeed.1 = Gauge32: 10000000
IF-MIB::ifSpeed.2 = Gauge32: 1000000000
IF-MIB::ifSpeed.3 = Gauge32: 1000000000
IF-MIB::ifSpeed.4 = Gauge32: 0
IF-MIB::ifSpeed.5 = Gauge32: 0
IF-MIB::ifSpeed.6 = Gauge32: 1000000000
$

6 Cacti側でグラフを作成しなおすか、rrdtoolを修正する。
  グラフの再作成は、既存のグラフ削除後、
Data Query [SNMP - Interface Statistics]を読み込み直すと、
速度も最新になるので、その状態で作成(bit数に注意)。


7 目視確認。10Mb/s以上を出して、上限にかからないことを確認する。
  変更前は、物理側が200Mb/s出ていても60Mb/s程度で止まっている。
  変更後は、物理側が250Mb/s出ていて、bondも同程度のトラフィックが出ている。

変更前(左右のY軸が異なることに注目)


変更後(左右のY軸が同じになっていることに注目)




[対策2 Cacti側でsnmpの修正いらずで対処する・・・案は現状失敗]

そもそも
Data Sources > Interface - Traffic > 「Data Source Item Fields」
Unlimitedにすれば、サーバー側のsnmpの修正はいらないかも?!と思ってやってみたが、この方法ではうまくいかなかった。
下のグラフは、物理インターフェイスは正常で、bond0のグラフのみ削除と再作成を行い、400Mb/s前後のトラフィックを発生させたもの。物理側はきっちり400Mb/sが出ているが、bond0はifSpeedの10Mb/sで止まってしまっている。


きっちりbond用にsnmpd.confの修正をし、GUIならグラフの作り直し、CUIならrrdotoolから修正すること。

ちなみに以下は
Data Sources > Interface - Traffic > 「Data Source Item Fields」
の修正箇所および修正方法。

1 Templates > Data Templates >  Interface - Traffic に移動する
2 「1: traffic_in」タブと「2: traffic_out」タブの以下の項目を変更する

変更前
■ Maximum Value : 100000000

変更後(チェックをはずして「U」と書く。)
□ Maximum Value : U



終わり