jconsole で Tomcat7 をモニタリング

jconsole で Tomcat7 をモニタリングするには、起動スクリプトで次のように JAVA_OPTS を指定します。

準備
ここでは、ファイアウォールを越えたりする場合のことも考えて、リモートから接続するにあたっては SSH ポートフォワードで接続する方法を使ってみます。

  • tomcat.localdomainというホストでtomcatを稼働しているとします。
  • tomcat.localdomainのマシンでは、/usr/java/jdk1.7.0_17 に JDK7 をインストールし、Tomcat を $HOME/applications/apache-tomcat-7.0.37 へインストールしておきます。
  • クライアントマシンではJDK7は$HOME/applications/java/jdk1.7.0_17にインストールしておきます。
  • Tomcat のサイトから Extras: JMX Remote jar (catalina-jmx-remote.jar)をダウンロードしておきます。

ローカルマシン
まずは次のようなスクリプトを用意して、同じマシンで Tomcat7 と jconsole を使ってみましょう。

#!/bin/sh
CATALINA_HOME=$HOME/applications/apache-tomcat-7.0.37
JAVA_HOME=/usr/java/jdk1.7.0_17
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=127.0.0.1"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9993"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

export JAVA_HOME
export JAVA_OPTS
CATALINA_HOME/bin/startup.sh

ローカルマシンからアクセスをするときの jconsole は下記コマンドで起動します。

$ /usr/java/jdk1.7.0_17/bin/jconsole

プロセスで tomcat のものを選択してから接続としてもよいですし、ネットワーク経由で、localhost:9993 を指定して接続してもよいです。開発マシンではこのようにローカルマシンで動かすことも多いでしょう。Eclipseからの接続もlocalhost:9993でいけるので、簡単に使えることがわかります。

リモートマシン
次にリモートマシンで動作するTomcatへクライアントマシンから接続をする場合の設定についてみてみましょう。

ネットワーク経由でちがうマシンからの接続となると、JMX + RMI が使用されるので、Tomcat のサイトから Extras: JMX Remote jar (catalina-jmx-remote.jar)をダウンロードして $CATALINA_HOME/lib ($HOME/applications/apache-tomcat-7.0.37/lib)へおく必要があります。

$CATALINA_HOME/conf/server.xml で Listener 要素を追加します。いくつか Listener 要素が記述されているはずなので、そこへ下記を追加してください。

  <Listener
   className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
   useLocalPorts="true"
   rmiRegistryPortPlatform="9993"
   rmiServerPortPlatform="9994"/>

先ほど作成したTomcat用の起動スクリプトも下記のように変更します。

#!/bin/sh
CATALINA_HOME=$HOME/applications/apache-tomcat-7.0.37
JAVA_HOME=/usr/java/latest
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=localhost"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote=true"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

export JAVA_HOME
export JAVA_OPTS
$CATALINA_HOME/bin/startup.sh

準備ができたら、Tomcatを再起動しておきます。

それでは、クライアントマシンからの接続をしてみましょう。次のようなツール用ディレクトリを用意して、jconsole を使います。JMX Remote jar (catalina-jmx-remote.jar)がクライアントにも必要だという点に注意しましょう。

jconsole/
|-- bin
|   `-- start.sh
`-- lib
    `-- catalina-jmx-remote.jar

スクリプト start.sh の内容は次のようになります。SSHポートフォワードを停止する stop.sh も用意するといいかもしれません。そちらは自分で考えてみてください。

#!/bin/sh
JAVA_HOME=$HOME/applications/jdk7
cf=`readlink -f $0`
d=`dirname $cf`
TOOL_HOME=${d}/..

ssh -f -N -L9993:localhost:9993 -L9994:localhost:9994 tomcat.localdomain

$JAVA_HOME/bin/jconsole \
 -debug \
 -J"-Djava.class.path=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jconsole.jar:$TOOL_HOME/lib/catalina-jmx-remote.jar" \
 service:jmx:rmi://localhost:9994/jndi/rmi://localhost:9993/jmxrmi

なお、MacOS X では JAVA_HOME や java.class.path の指定は下記ようにすると良いでしょう。readlinkコマンドも挙動がLinuxとはちがうので使わないようにする必要があります。Mountain Lion でない場合は、JAVA_HOMEには「/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home」などを指定する必要があるかもしれません。

#!/bin/sh
JAVA_HOME=`/usr/libexec/java_home -v 1.7`
SYSTEM_JAVA="/System/Library/Frameworks/JavaVM.framework"
d=`dirname $0`
TOOL_HOME=${d}/..

ssh -f -N -L9993:localhost:9993 -L9994:localhost:9994 tomcat.localdomain

$JAVA_HOME/bin/jconsole \
 -debug \
 -J"-Djava.class.path=$SYSTEM_JAVA/Classes/classes.jar:$SYSTEM_JAVA/Classes/jconsole.jar:$TOOL_HOME/lib/catalina-jmx-remote.jar" \
 service:jmx:rmi://localhost:9994/jndi/rmi://localhost:9993/jmxrmi

Java7 でのモニタリングについては、「Monitoring and Management Using JMX Technology – Java SE Monitoring and Management Guide」が参考になります。Apache Tomcat7 でのモニタリングについては「Apache Tomcat 7 Configuration Reference (7.0.37) – The LifeCycle Listener Component」が参考になります。

同じタグの記事: CentOS
同じタグの記事: JConsole
同じタグの記事: Linux
同じタグの記事: Tomcat
同じカテゴリの記事: Java
関連書籍: CentOS