JMXとjstatdを使ったJavaアプリケーションのパフォーマンス監視

Java Management Extensions(JMX)は、Javaプログラムの監視や管理を可能にするフレームワークです。また、カスタム実装したMBeanを使用して特定のメトリクスを検出することも可能です。ローカル環境では、jvisualvm、jconsole、またはJMCを使って直接JVMに接続できますが、リモートでの利用には以下の設定が必要です。

JMXによるリモートアクセスの設定

次の例では、Java 11に基づいた設定を行っています。

java \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=9000 \
-Dcom.sun.management.jmxremote.rmi.port=9100 \
-Djava.rmi.server.hostname=192.168.1.1 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar app.jar
  • com.sun.management.jmxremote:JMXのリモートサービスを有効化します。
  • java.rmi.server.hostname:JMXサービスが使用するIPアドレスまたはホスト名を指定します。
  • com.sun.management.jmxremote.port:JMXサービスがリッスンするポート番号です。
  • com.sun.management.jmxremote.rmi.port:RMIサービス用のポート番号です。

認証付きリモートアクセスの設定

認証を有効にする場合、以下のように設定します。

java \
-Dcom.sun.management.jmxremote=true \
-Djava.rmi.server.hostname=192.168.1.1 \
-Dcom.sun.management.jmxremote.port=9100 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/path/to/jmxremote.access \
-jar app.jar
  • com.sun.management.jmxremote.password.file:パスワードファイルへのパスを指定します。
  • com.sun.management.jmxremote.access.file:アクセス権限を定義したファイルへのパスです。

jmxremote.passwordおよびjmxremote.accessファイルには、次のような内容を追加します。

# jmxremote.access
admin readwrite

# jmxremote.password
admin Passw0rd!

SSLを使用したセキュアなリモートアクセス

SSLを有効にする場合は、次のように設定します。

nohup java \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=9200 \
-Dcom.sun.management.jmxremote.rmi.port=9300 \
-Djava.rmi.server.hostname=192.168.1.1 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Djavax.net.ssl.keyStore=/path/to/keystore.jks \
-Djavax.net.ssl.keyStorePassword=Passw0rd! \
-Djavax.net.ssl.trustStore=/path/to/truststore.jks \
-Djavax.net.ssl.trustStorePassword=Passw0rd! \
-jar app.jar > /dev/null 2>&1 &
  • javax.net.ssl.keyStore:キーストアファイルのパスを指定します。
  • javax.net.ssl.trustStore:トラストストアファイルのパスを指定します。

キーストアとトラストストアの生成

次のシェルスクリプトを使用して、必要な証明書を生成できます。

#!/bin/bash

CLIENT_ALIAS="client"
SERVICE_ALIAS="server"
PASSWORD="Passw0rd!"
HOSTNAME="localhost"
VALIDITY_DAYS=365

keytool -genkeypair -alias $CLIENT_ALIAS -keyalg RSA -validity $VALIDITY_DAYS -keystore "$CLIENT_ALIAS.keystore" -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$HOSTNAME, OU=Dev, O=Company, L=City, S=State, C=Country"
keytool -exportcert -alias $CLIENT_ALIAS -keystore "$CLIENT_ALIAS.keystore" -file "$CLIENT_ALIAS.cer" -storepass $PASSWORD

keytool -importcert -alias $CLIENT_ALIAS -file "$CLIENT_ALIAS.cer" -keystore "$SERVICE_ALIAS.truststore" -storepass $PASSWORD -noprompt

keytool -genkeypair -alias $SERVICE_ALIAS -keyalg RSA -validity $VALIDITY_DAYS -keystore "$SERVICE_ALIAS.keystore" -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$HOSTNAME, OU=Dev, O=Company, L=City, S=State, C=Country"
keytool -exportcert -alias $SERVICE_ALIAS -keystore "$SERVICE_ALIAS.keystore" -file "$SERVICE_ALIAS.cer" -storepass $PASSWORD

keytool -importcert -alias $SERVICE_ALIAS -file "$SERVICE_ALIAS.cer" -keystore "$CLIENT_ALIAS.truststore" -storepass $PASSWORD -noprompt

mkdir -p client server
mv $CLIENT_ALIAS.* client/
mv $SERVICE_ALIAS.* server/

jstatdの設定と起動

jstatdは、RMIベースのサーバーで、JVMの作成や終了、その他の実行状態を監視することができます。

jstatd.policyファイルの作成

jdk9以降の場合、以下のように設定します。

grant codebase "jrt:/jdk.jstatd" {
    permission java.security.AllPermission;
};

grant codebase "jrt:/jdk.internal.jvmstat" {
    permission java.security.AllPermission;
};

jstatdサービスの開始

jstatd -J-Djava.rmi.server.hostname=192.168.1.1 -J-Djava.security.policy=./jstatd.policy -p 1099 > /dev/null 2>&1 &

これにより、リモートからJVMとその上で実行されているプログラムを監視できるようになります。

タグ: JMX jstatd java-monitoring

8月14日 06:25 投稿