リモートサーバー上で動くJavaアプリに対してjvisualvmを動かす
こんにちは、@s_tsukaです。
jvisualvmというJMX監視ツールがあります。これを使うとGUIでJavaアプリのメモリなどの挙動を見れるのでデバッグに大変有効です。
ところがこれはGUIツールなので、CUIだけのLinuxにsshしても使うことはできません。これを使える方法をメモしておきます。jmxポートに対してsshトンネルしたりする方法もあるかと思いますが、そっちもそっちで面倒くさいので、今回はX11経由で見る方法について書いておきます。
手順
- sshでJavaアプリが動いているサーバにログイン
- sudo yum install xorg-x11-xauth でX11をインストール
- 一旦exitでsshから抜ける
- 再びssh、ただし今度は-XオプションをつけてXForwardするようにする
- 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
あたりで解決すると思います。
以上です。