木曜日, 12月 05, 2013

tomcat5.5/6のJVM RAM周りををcactiで監視する

cactiでRAM周りを監視するまでの備忘録のべまっくす!


【公式マニュアル】
http://docs.oracle.com/javase/jp/1.5.0/guide/management/SNMP.html
http://docs.oracle.com/javase/6/docs/technotes/guides/management/snmp.html


【参照blog】
・トラシスラボ 技術ブログ様
http://trasis.jp/blog/lab/2009/08/snmpでtomcat-メモリを監視-linux編.html

・うまい棒blog様
http://d.hatena.ne.jp/hogem/20121206/1354802392



【作業手順】
① snmp.aclの準備(5.5/6共通)
※パスは環境に合わせて変更してくださいね!

cd /usr/java/j2sdk/jre/lib/management
vi snmp.acl
---
acl = {
    {
        communities = コミュニティ名
        access      = read-only
        managers    = cactiのサーバーIP,自分自身のIPアドレス(なぜかは後述)
        }
    }
---
chmod 600 snmp.acl
chown tomcatを起動するユーザー snmp.acl


② CATALINA_OPTSの設定(5.5/6別)
ファイルや環境変数などで、CATALINA_OPTSに以下を追加する。
5.5はポート番号と、snmp.aclの場所を指定する。6系はinterfaceをさらに追加する。
環境変数に追加するなら、tomcatを起動させるユーザーの.bashrcなどに以下を追加するとよいです。以下は環境変数に突っ込む場合の例(ファイルなら頭のexportは取ってね!)
※tomcat7は未確認だけど、-Dcom.sun.management.snmp.acl.fileの最後の「.file」を取ればいいらしい。

5.5(※1.5.0_22の場合は、下の6用にしないとダメだった・・・なぜか不明)
export CATALINA_OPTS="-Dcom.sun.management.snmp.port=1161 -Dcom.sun.management.snmp.acl.file=/usr/java/j2sdk/jre/lib/management/snmp.acl"

6用
export CATALINA_OPTS="-Dcom.sun.management.snmp.port=1161 -Dcom.sun.management.snmp.acl.file=/usr/java/j2sdk/jre/lib/management/snmp.acl -Dcom.sun.management.snmp.interface=0.0.0.0"


③ tomcatを再起動して、cactiサーバーから手動で叩いてテスト
$ snmpwalk -v 2c -c community server-name:1161 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.101.1.2.2
SNMPv2-SMI::enterprises.42.2.145.3.163.1.1.2.101.1.2.2 = Counter64: 172
$
という感じで取得できた。

④cactiでテンプレートの追加と動作テスト
cactiで、JVMのテンプレートを入れて20分ほど待つ…がデータを引っ張ってこれていない…。
cactiのポーリングのport番号を確認してみる。

Console > Data Templates > JVMのどれか、たとえばjvmThreadCount
を開くと、SNMP Port欄に、確かに1161番が指定されているので大丈夫っぽいけど、
取れない。ということはsnmpデフォルトの161番でアクセスしている可能性が高い。
ので、諦めて1161に転送するsnmpd proxyを設定する。

⑤snmpd proxyの設定
※mibファイルはいらんけど便利なんで入れておく。

cd /usr/share/snmp/mibs
wget http://docs.oracle.com/javase/1.5.0/docs/guide/management/JVM-MANAGEMENT-MIB.mib
vi /etc/snmp/snmpd.conf
proxy -m /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.mib -v 2c -c community名 サーバー自身のIP:1161 .1.3.6.1.4.1.42.2.145
/etc/init.d/snmpd reload

⑥proxyの確認
cactiサーバーから、161番でJVMに関するデータが取れるか確認する。
$ snmpwalk -v 2c -c community server-name .1.3.6.1.4.1.42.2.145.3.163.1.1.2.101.1.2.2
SNMPv2-SMI::enterprises.42.2.145.3.163.1.1.2.101.1.2.2 = Counter64: 390
$
取れた(ここでauthorizationErrorが出て取れない場合は、snmp.aclに自分自身のIPを追加していない可能性が高い) 。で、cactiを見てみると…無事取れている。
cactiの「SNMP port」設定で、1161が指定されているのに161で問い合わせにいくとはこれいかに。

参考画像…このポート指定がなぜ効かないのか…は今後考える(笑)




⑦正常性確認

tomcatを何度か立ち上げ直してみる。
/etc/init.d/tomcat start
/etc/init.d/tomcat stop
どちらも正常に立ち上がって、エラーが出ずに止まること。tomcat.pidを作っておきながら立ち上がらないとか、大量のエラーを吐いて止まるときは、だいたいCATALINA_OPTSが間違えている。



【番外編:トラブルシュート】

$ snmpwalk -v 2c -c community tomcat-server:1161 .1.3.6.1.4.1.42.2.145
Error in packet.
Reason: authorizationError (access denied to that object)
$
 → 原因 snmp.aclのmanagersにアクセス元が含まれていない可能性があります。


$ snmpwalk -v 2c -c community tomcat-server .1.3.6.1.4.1.42.2.145
SNMPv2-SMI::enterprises.42.2.145 = No Such Object available on this agent at this OID
$
 → 原因 tomcatのsnmpにアクセスできていない可能性があります。


$  snmpwalk -v 2c -c community tomcat-server .1.3.6.1.4.1.42.2.145
Timeout: No Response from tomcat-server
$
 → 原因 CATALINA_OPTSで、snmp.acl.fileが正しく指定できていない可能性があります。


$/etc/init.d/tomcat stop
// snip
Dec 4, 2013 08:05:23 AM org.apache.catalina.startup.Catalina stopServer
致命的: Catalina.stop:
java.net.ConnectException: Connection refused
...
 → 原因 Dcom.sun.management.snmp.portで指定したポートが、他のサービスで既に利用中なため立ち上げられなかったようです。他のポートを指定しましょう。



終わり