リモートサーバー上で動くJavaアプリに対してjvisualvmを動かす


こんにちは、@s_tsukaです。

jvisualvmというJMX監視ツールがあります。これを使うとGUIでJavaアプリのメモリなどの挙動を見れるのでデバッグに大変有効です。

ところがこれはGUIツールなので、CUIだけのLinuxにsshしても使うことはできません。これを使える方法をメモしておきます。jmxポートに対してsshトンネルしたりする方法もあるかと思いますが、そっちもそっちで面倒くさいので、今回はX11経由で見る方法について書いておきます。

手順

  1. sshでJavaアプリが動いているサーバにログイン
  2. sudo yum install xorg-x11-xauth でX11をインストール
  3. 一旦exitでsshから抜ける
  4. 再びssh、ただし今度は-XオプションをつけてXForwardするようにする
  5. LANG=C jvisualvm でjvisualvmを起動。LANG=Cは文字化け対策。jvisualvmはPATH解決されない場所に置いてあるかもしれないので、そこは適宜チェック。そもそもJRE環境だとjvisualvmがなかったりするので、その場合はDLしてきたりJDKを入れて使えるようにしておく

この状態でX11プロトコルで画面の情報がssh経由でlocal pc上に送られてくるので、local pc上からjvisualvmの画面を操作できます。

オプション・トラブルシューティング

jvisualvmしてもJavaプロセスが見えない場合は、ユーザの権限のせいかと思います。rootでjvisualvmすれば良いですが、sudo su などでrootになってから実行する場合は注意がいります。まずsudo su -だと環境変数がリセットされてX11に問題が出るので、sudo suで(ダッシュなしで)rootになります。次にX11の認証情報、というか環境変数?を引き継がないといけないので、xauth merge /home/(suする前のログインユーザ名)/.Xauthority を実行します。これでOKです

Javaアプリがdocker上で動いている場合。これは単純で、起動したjvisualvmのJMX接続でdocker containerのipとportを指定してリモート接続の形式を取れば良いです。(X11によるリモート+JMX portのリモート)

jvisualvmがうまく起動しない場合は、-J-Dnetbeans.logger.console=true オプションを付けると良いと思います。ログが出ます。

libXext.so.6 cannot open shared object file みたいなerrorが出た場合は

yum install libXext
yum install libXrender
yum install libXtst

あたりで解決すると思います。

以上です。