こんにちは。エンジニアのAraoです。今回は、SNMPでサーバーのCPU使用率やロードアベレージなどのモニタリングを行う方法を紹介します。

SNMPとは

Simple Network Management Protocolの略で、ネットワークに接続されている機器の監視、制御を行うための通信プロトコルです。一般に、監視を行うサーバーをSNMPマネージャー、監視対象となるサーバーをSNMPエージェントと呼ぶため、本記事でもそれに倣います。

本記事では、Net-SNMPというSNMPを実装したOSSを利用して、同一ネットワーク内のLinuxサーバーの

  • CPU使用率
  • ロードアベレージ
  • ストレージの使用率
  • メモリ使用率
を監視することを目標にします。

なお、Net-SNMPには、SNMPエージェントにおいて上記の項目の値が閾値を超えたり、何らかの異常が起きたときに、SNMPマネージャーにそのことを通知する機能も持っていますが、本記事ではその機能の解説は行いません。というのも、その機能に頼りきっていると、SNMPエージェントがその通知すらできない最悪の状態になっていることを検知できないからです。

必要なパッケージのインストール(SNMPマネージャー、SNMPエージェント共通)

CentOSの場合

$ sudo yum install net-snmp net-snmp-libs net-snmp-utils

Ubuntuの場合

$ sudo apt-get install snmpd snmp snmp-mibs-downloader

設定ファイルの編集(SNMPエージェント)

以下のように、/etc/snmp/snmpd.confを編集します。

# Access Control

com2sec mynetwork 10.31.0.0/21 internal
# セキュリティの定義
# mynetwork: セキュリティ名(任意の文字列)
# 10.31.0.0/21: どこからの情報の取得を許可するか(プライベートIPを指定)
# internal: コミュニティ名(任意の文字列)

group mygroup v2c mynetwork
# グループの定義
# mygroup: グループ名(任意の文字列)
# v2c: どのバージョンのSNMPを使うか(一般に、v1, v2c, v3のどれか)
# mynetwork: セキュリティ名(上で設定したもの)

view systemview included .1.3.6.1.2.1.25
view systemview included .1.3.6.1.4.1.2021
# SNMPで取得可能な情報の範囲を指定
# systemview: ビューの名前(任意の文字列)
# included: ~を含む(included)もしくは~を除く(excluded)
# .1.3.6.1.2.1.25, .1.3.6.1.4.1.2021: サブツリー(詳細は後述)

access mygroup "" v2c noauth exact systemview none none
# アクセス許可に関する設定
# mygroup: グループ名(上で設定したもの)
# "": コンテキスト(v2cを使用する場合は指定不可)
# v2c: SNMPのバージョン。一般に、v1, v2c, v3のどれかが使われる
# noauth: セキュリティレベル(v2cを使用する場合は指定不可)
# exact: コンディション(v2cを使用する場合は指定不可)
# systemview: 読み取り対象のビュー
# none(1): 書き込み対象のビュー。ここでは指定しない
# none(2): 通知対象のビュー。ここでは指定しない

# System Contact Information

syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root  (configure /etc/snmp/snmp.local.conf)
# システムの場所、連絡先を指定できる。ここではデフォルトのまま

# Logging

dontLogTCPWrappersConnects yes
# ログを記録しないように設定している

SNMPの起動(SNMPエージェント)

設定ファイルの編集が済んだら、 snmpd.service を起動します。

$ sudo systemctl start snmpd.service

また、サーバーを再起動したときのことを考え、自動起動設定もしておくと良いです。

CentOSの場合

$ sudo systemctl enable snmpd.service

Ubuntuの場合

/lib/systemd/systemd-sysv-install enable snmpd

動作確認(SNMPマネージャー)

$ snmpwalk -v 2c -c internal web102

オプションvで指定しているのが、使用するSNMPのバージョンで、オプションcで指定しているのが、先ほど設定したコミュニティ名です。最後に指定している引数が監視対象のSNMPエージェントで、ホスト名、もしくはプライベートIPで指定します。山のような出力が得られれば動作確認は完了です。

実際のモニタリング(SNMPマネージャー)

CPU使用率の監視

$ snmpwalk -v 2c -c internal web102 HOST-RESOURCES-MIB::hrProcessorLoad
HOST-RESOURCES-MIB::hrProcessorLoad.196608 = INTEGER: 29

SNMPエージェントがマルチコアの場合は、各コアの使用率が返ってくるとのことですが、今回監視しているweb102はシングルコアなので、使用率はひとつしか返ってきません。

オプションvとオプションc、1番目の引数は、先ほどの動作確認と同様です。2番目の引数で、どの情報を取得したいか項目名を指定します。項目名の代わりに、OIDと呼ばれるIDを指定することでも情報を取得できます。

まずは下記コマンドでOIDを取得してみましょう。

$ snmptranslate -On HOST-RESOURCES-MIB::hrProcessorLoad
.1.3.6.1.2.1.25.3.3.1.2

次に、項目名の代わりにOIDを指定してみます。

$ snmpwalk -v 2c -c internal web102 .1.3.6.1.2.1.25.3.3.1.2
iso.3.6.1.2.1.25.3.3.1.2.196608 = INTEGER: 34

こちらの項目名とOIDについては、Net-SNMPの公式ドキュメントを参考にしましょう。

Net-SNMP Distributed MIBs

さて、先ほどの設定ファイルに関するところで説明を省略した、以下の記述の数字の羅列の意味を簡単に解説します。

view systemview included .1.3.6.1.2.1.25
view systemview included .1.3.6.1.4.1.2021

ここで指定しているのは、監視対象とするOIDのサブツリーになります。1行目では、 .1.3.6.1.2.1.25 以下の情報を監視対象に設定していて、2行目では、 .1.3.6.1.4.1.2021 以下の情報を監視対象に設定しています。

本記事では、CPU使用率、ロードアベレージ、ストレージの使用率、メモリ使用率のみを監視対象としていて、これらの対象は上記サブツリー内に含まれるので、この設定で問題ありませんが、このサブツリー内に含まれないパラメータを監視したいときは、それに合わせてサブツリーを指定してあげる必要があります。

OIDについては、先ほど紹介したドキュメントと snmptranslate コマンドを駆使して調べましょう。

ロードアベレージの監視

$ snmpwalk -v 2c -c internal web102 UCD-SNMP-MIB::laLoad
UCD-SNMP-MIB::laLoad.1 = STRING: 0.88
UCD-SNMP-MIB::laLoad.2 = STRING: 0.60
UCD-SNMP-MIB::laLoad.3 = STRING: 0.57

1分間、5分間、15分間のロードアベレージが返ってきます。

ストレージの使用率の監視

$ snmpwalk -v 2c -c internal web102 HOST-RESOURCES-MIB::hrStorageDescrHOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Physical memory
HOST-RESOURCES-MIB::hrStorageDescr.3 = STRING: Virtual memory
HOST-RESOURCES-MIB::hrStorageDescr.6 = STRING: Memory buffers
HOST-RESOURCES-MIB::hrStorageDescr.7 = STRING: Cached memory
HOST-RESOURCES-MIB::hrStorageDescr.8 = STRING: Shared memory
HOST-RESOURCES-MIB::hrStorageDescr.10 = STRING: Swap space
HOST-RESOURCES-MIB::hrStorageDescr.31 = STRING: /
HOST-RESOURCES-MIB::hrStorageDescr.36 = STRING: /dev/shm
HOST-RESOURCES-MIB::hrStorageDescr.38 = STRING: /run
HOST-RESOURCES-MIB::hrStorageDescr.39 = STRING: /sys/fs/cgroup
HOST-RESOURCES-MIB::hrStorageDescr.57 = STRING: /run/user/0

物理メモリなども含めた、ストレージ名が返ってきます。この結果を受けて、監視対象のストレージを確認しましょう。ここではIDに31が振られている/ を対象にしてみます。

$ snmpwalk -v 2c -c internal web102 HOST-RESOURCES-MIB::hrStorageSize.31
HOST-RESOURCES-MIB::hrStorageSize.31 = INTEGER: 3929344

先ほど取得した31というIDを、項目名の末尾に追加して指定することで、指定したストレージの総容量を取得できます。

$ snmpwalk -v 2c -c internal web102 HOST-RESOURCES-MIB::hrStorageUsed.31
HOST-RESOURCES-MIB::hrStorageUsed.31 = INTEGER: 686309

同様の方法で、指定したストレージの使用量を取得できます。あとは割り算してあげればストレージの使用率を求められます。

メモリ使用率の監視

$ snmpwalk -v 2c -c internal web102 UCD-SNMP-MIB::memTotalReal
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 999940 kB

物理メモリの総容量を取得できます。

$ snmpwalk -v 2c -c internal web102 UCD-SNMP-MIB::memAvailReal
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 232332 kB

物理メモリの空き容量を取得できます。あとは割り算して引き算してあげれば、メモリ使用率を求められます。

まとめと今後の予定

以上、駆け足にはなりましたが、SNMPでサーバーのモニタリングを行う方法を一通り解説しました。

これらを実際に運用する場合、crontabで定期実行する方法が考えられますが、どうせなら閾値を設定して、メールやSlackなどで通知する機能もつけたいですよね。弊社では主にRubyを使っていることもあり、これらの監視を行うためのRubyクラスの実装を後日紹介しようと思います。