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で取得している。
※なおこの数値は、ifconfigのRX bytesおよびTX bytesでも確認できる。
※インターフェイス番号は「ifDescr」で確認できる。以下の例では、bond0は5番。
[取得した値をどう扱うか設定する]
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換算した数値を指定する。
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」が選択される。
デバイスの一覧で選べるのは以下の通り。
それぞれの実行例は以下の通り。
トラブルシュート
■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|」を利用する。これは
[対策1 サーバー側で対処する]
bondの速度を10Mbpsから正しい値(1Gbpsなど)に修正する。
※こちらを参考に・・・
→参考 http://d.hatena.ne.jp/hogem/20111126/1322318205
snmpd.conf に以下のように書くといいとのことで、CentOS6.3でやってみたらうまくいって、
グラフも正常になりますた。
1 問題のbondインターフェイス番号を取得する
snmpwalk -c community -v 2c サーバー ifDescr
2 現在の値を取得する
$ snmpwalk -c community -v 2c サーバー ifSpeed
3 snmpd.confを正しい値に修正する
snmpd.conf
4 snmpをリロードする
5 現在の値を取得し、設定が正しく反映されたことを確認する。
6 Cacti側でグラフを作成しなおすか、rrdtoolを修正する。
グラフの再作成は、既存のグラフ削除後、
Data Query [SNMP - Interface Statistics]を読み込み直すと、
速度も最新になるので、その状態で作成(bit数に注意)。
[取得する値(どの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$
3 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
終わり