MRTGを用いてリソース監視を行うとき、snmpdサーバーのレスポンスが低いために
MRTGがレコードを取得する前にタイムアウトしてしまい、必要なデータを取得できない場合があります。
snmpwalkコマンドでのエラー
~省略~
Timeout: No Response from snmpdサーバーIP
MRTGクーロン実行時のエラーメール冒頭
SNMP Error:
no response received
~省略~
snmpdは正常に動作しているのですが、問い合わせ結果を待てずにタイムアウトしていることを確認できました。MRTGに設定されているsnmpdサーバーへの問い合わせのタイムアウト値はディフォルトで「2秒」です。レスポンスが低いサーバーをsnmpdサーバーとして構築し利用するには、MRTGに設定されているsnmpdサーバーへの問い合わせのタイムアウト値を伸ばしてあげることで解決できます。
実際にsnmpwalk/mrtgにサーバーレスポンスの遅さが影響を与えているかを確認するために、
snmpwalkコマンドに 「-t」オプションを設けて、タイムアウトを伸ばせばsnmpdサーバーから情報を
正しく取得出来るかどうかを試します。
# snmpwalkのディフォルトはタイムアウトが5秒です。
MRTGディフォルトのタイムアウト値で検証
# snmpwalk -t2 -c public -v1 snmpdサーバーIP .1.3.6.1.4.1.2021.9.1 UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1 UCD-SNMP-MIB::dskPath.1 = STRING: / UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/simfs UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 10000 UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1 UCD-SNMP-MIB::dskTotal.1 = INTEGER: 15728640 UCD-SNMP-MIB::dskAvail.1 = INTEGER: 14994436 UCD-SNMP-MIB::dskUsed.1 = INTEGER: 734204 Timeout: No Response from snmpdサーバーIP #
タイムアウト値を「10秒」に変更し再度検証
# snmpwalk -t10 -c public -v1 サーバーのIP .1.3.6.1.4.1.2021.9.1
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/simfs
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 10000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 15728640
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 14994072
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 734568
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 5
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 5
UCD-SNMP-MIB::dskTotalLow.1 = Gauge32: 15728640
UCD-SNMP-MIB::dskTotalHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskAvailLow.1 = Gauge32: 14994072
UCD-SNMP-MIB::dskAvailHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskUsedLow.1 = Gauge32: 734568
UCD-SNMP-MIB::dskUsedHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: 0
UCD-SNMP-MIB::dskErrorMsg.1 = STRING:
#
このように、タイムアウト値を伸ばせば正しく情報を取得できる場合、/etc/mrtg/mrtg.cfgを編集し
mrtgがsnmpdサーバーに問い合わせをする際に、タイムアウト値を指定するようにします。
タイムアウト値の設定はどのようにやるのか
MRTGのdocには以下の記述がありました。
拡張ホスト名の文法
“community@router”が使用される箇所では、コロン区切りの 接尾辞をつけることによってSNMP通信用のパラメータを追記する ことができます。
community@router[:[port][:[timeout][:[retries][:[backoff][:version]]]]]
各パラメータの意味は以下の通り:
port SNMPエージェントが使用するUDPポート(デフォルト: 161)
timeout SNMPクエリの最初のタイムアウトを秒で示したもの (デフォルト: 2.0)retries タイムアウトしたリクエストに関して再試行する回数 (デフォルト: 5)
backoff 再試行する度にタイムアウトに掛けられる数値 (デフォルト: 1.0)
version SNMPのバージョン。高速のルータを使用している場合には’2’にした ほうがいいでしょう。MRTGが64bitカウンタでポーリ ングを行うように なり、過剰なカウンタラッピングを阻止することができます。ただし全ての ルータでサポートされている訳で はありません。例:
3:public@router1:::::2
デフォルトと変わらない値は省略することが可能です。後に続くコロンも 省略することができます。
私の場合、disk使用量確認時点でタイムアウトが発生していましたので、
少なくともdisk情報を取得する際の設定を変更してあげる必要がありました
変更前例:
Target[disk]: dskPercent.1&dskPercent.1:public@snmpdサーバーのIP
変更後例:
Target[disk]: dskPercent.1&dskPercent.1:public@snmpdサーバーのIP::10
コメント
[…] MRTG snmpd “No Response”のエラーを回避してみたの巻 […]