トラシスラボ 技術ブログでタグ「snmp」が付けられているもの

snmpでtomcat メモリを監視 (Linux編)

|

概要

前回 は、Windows 上で起動した Java プロセスを snmp で監視する方法を説明した。

今回は Linux 上で起動した Tomcat プロセスのメモリを監視する方法について説明する。

動作環境

項目
OS CentOS 5
Java JDK 6 update 10
Tomcat 6.0.20

tomcat 起動時の設定

Tomcat を起動する時の CATALINA_OPTS 変数に次の記述を追加する。
例えば、/etc/tomcat6/tomcat6.conf で次のように記述する。
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.snmp.port=1161 -Dcom.sun.management.snmp.acl.file=/etc/tomcat6/snmp.acl"

/etc/tomcat6/snmp.acl 作成

ファイルを作成する。
acl = {
 {
   communities = public
   access = read-only
   managers = localhost
 }
}
さらに、snmp.acl のパーミッションを 600 に変更する。
# chown roo:root snmp.acl
# chmod 600 snmp.acl
ここまで設定が終わったら、Tomcat を起動する。
# service tomcat6 start

MIB ファイルを置く

/usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.mib を作成する。
# cd /usr/share/snmp/mibs/
# lftpget http://java.sun.com/j2se/1.5.0/docs/guide/management/JVM-MANAGEMENT-MIB.mib

/etc/snmp/snmp.conf 設定

次に snmpd の設定。このファイルの最後へ記述を追加する。
proxy -m /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.txt -v 2c -c public localhost:1161 .1.3.6.1.4.1.42.2.145
記述を追加したら、snmpd を再起動する。
# service snmpd restart

動作確認

$ snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.42.2.145

出力結果をカスタマイズ

数字で構成される OID 値を文字列に変更できる。
上記の手順で mib ファイルを snmpwalk を実行するホストに置いた後、次のように環境変数を設定する。
.bashrc などに書いておくとよい。
$ export MIBS=ALL
$ snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.42.2.145

参考

snmpでtomcatメモリを監視(Windows編)

|

概要

Javaでwebサイトを運用し、ある程度規模が大きくなってくるとメモリ管理で悩まされる。
安定、高速なwebサイトを目指すためにはメモリ関連のモニタリングとチューニングが必要になってくる。

ガベージ・コレクション関連のログ出力設定を行う方法は簡単だが、nagios などで監視を行い、閾値に達したらアラート・メールで通知してくれると便利である。

今回は Java の snmp 監視を有効にする設定手順について説明する。

開発環境

項目
OS Windows XP Pro SP3
IDE 環境 Eclipse 3.4.1(Preiades All in One)
Java JDK 6 update 10

Windows 環境での設定手順

概要

Windows 上で起動中の Eclipse から Java プログラムを起動し、そのプロセスを snmp で監視できるよう、設定を行う。

プログラム例

次のようなプログラムを作成した。
public class Test {
	public static void main(String[] args) throws InterruptedException {
		int count = 0;
		
		for (;;) {
			Thread.sleep(1000);
		
			count++;
			System.out.println(count);
		}
	}
}
とりあえず1回実行してみる。
[実行] メニュー ⇒ 実行 ⇒ Java アプリケーション

起動オプション設定

1回実行した後、今度は実行構成を開く。
[実行] メニュー ⇒ 実行構成


[引数] タブを選択し、「VM引数」のところに次の文字列を入力する。
-Dcom.sun.management.snmp.port=161 -Dcom.sun.management.snmp.acl.file=c:/snmp.acl -Dcom.sun.management.config.file=c:/management.properties

設定ファイルのコピー

次に、C:\Program Files\Java\jre6\lib\management の下にある、次の2つのファイルを C:\ にコピーする。
  • management.properties
  • snmp.acl.template
snmp.acl.template は snmp.acl に名前を変える。

設定ファイルの修正

c:\snmp.acl
ホスト 172.16.1.2 からコミュニティ名「public」で snmp 読み込みを受け付ける場合は、次のように記述する。
   acl = {
     {
       communities = public
       access = read-only
       managers = 172.16.1.2
     }
    }
 
c:\management.properties
Java 起動時、デフォルト設定では localhost で 161 ポートを listen する。別のホストから snmp を受け付けるには、次のように Java プログラムを起動するホストの IP アドレスを設定する。
com.sun.management.snmp.interface=172.16.1.3

アクセス権の修正

エクスプローラで c:\snmp.acl 上で右クリック、[プロパティ] を選択する。


[セキュリティ] タブを開き、[詳細設定] ボタンを押す。

「子オブジェクトに適用するアクセス許可エントリを親から継承し、それらをここで明示的に定義されているものに含める」についているチェックを外す。

「アクセス許可エントリ」から、自分の名前以外を全て削除する。
Administrator や他のユーザからのアクセス権が残っていると、Java プログラム起動時に次のようなエラーメッセージが出てしまう。
エラー: パスワードファイルの読み取りアクセスは制限する必要があります。: c:/snmp.acl

これで準備完了。
サンプルプログラムを起動したあと、snmp アクセスを許可したホスト(上記の例だと 172.16.1.2) から次のようにアクセスしてみる。
$ snmpwalk -v 2c -c public 172.16.1.3 .1 -On | less
次のような内容が出力される。
.1.3.6.1.4.1.42.2.145.3.163.1.1.1.1.0 = Gauge32: 729
.1.3.6.1.4.1.42.2.145.3.163.1.1.1.4.0 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.1.0 = Gauge32: 0
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.2.0 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.3.0 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.1 = STRING: "CodeCacheManager"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.2 = STRING: "Copy"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.3 = STRING: "MarkSweepCompact"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.1 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.2 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.3 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.1 = STRING: "Code Cache"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.2 = STRING: "Eden Space"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.3 = STRING: "Survivor Space"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.4 = STRING: "Tenured Gen"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.5 = STRING: "Perm Gen"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.6 = STRING: "Perm Gen [shared-ro]"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.7 = STRING: "Perm Gen [shared-rw]"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.1 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.2 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.3 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.4 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.5 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.6 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.7 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.1 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.2 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.3 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.4 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.5 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.6 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.7 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.1 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.2 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.3 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.4 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.5 = INTEGER: 2
...
なお、-v で指定する SNMP バージョンは 2c を指定する必要がある。
1 だと、heap 値を取得できない。

参考情報

Sun から提供されている以下のドキュメントを参考。

2010年9月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30