Don't Repeat Yourself

Don't Repeat Yourself (DRY) is a principle of software development aimed at reducing repetition of all kinds. -- wikipedia

Mac OS X から EC2 インスタンス上に存在する JVM に VisualVM を接続する

EC2 インスタンス上に存在する Web サーバーを VisualVM 接続してで見たいと思った際に、どのようにして見たらよいかをまとめておきます。

なお、ローカル環境が Mac OS X での場合です。

手順

  1. java の起動コマンドに引数をいくつか追加する。
  2. SOCKS プロトコルで EC2 インスタンスに接続できるようにしておく。
  3. VisualVM の起動時設定に↑を使用できるようなオプションを追加する。
  4. JMX 接続を使って、リモート接続を開始する。

1. java の起動コマンドに引数をいくつか追加する

今回はポート番号 3333JMX リモート接続用に開放しておき、そこに接続してもらうように設定します。下記の引数を追加し、アプリケーションを起動しておきます。

-Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

2. SOCKS プロトコルで EC2 インスタンスに接続できるようにしておく

下記コマンドを実行し、SOCKS プロトコル *1 を有効にします。

ssh -i {pem_file_path} -fND 10000 ec2-user@{ec2-private-ip}

{pem_file_path} には、自身の PC に保存してある pem ファイルの居場所を指定します。たとえば、~/.ssh/visualvm_con.pem などです。

{ec2-private-ip} には、接続したい EC2 インスタンスのプライベート IP アドレスを入れておきます。

オプションについては、

  • -i: 秘密鍵ファイルを指定します。
  • -f: バックグラウンド実行を意味します。
  • -N: リモートコマンドを実行しません。
  • -D: ローカルホスト側におけるアプリケーションの動的なポート伝送を指定します。

3. VisualVM の起動時設定に↑を使用できるようなオプションを追加する

起動時の設定に SOCKS プロトコルの設定を追加して、jvisualvm を実行します。

jvisualvm -J-DsocksProxyHost=localhost -J-DsocksProxyPort=10000 -J-DsocksNonProxyHosts=

あるいはGUI から設定する場合は、「File > Preferences > Network」の順に開き、下記の画像のように設定値を入力しておきます。 SOCS Proxy 向けの設定の箇所に、localhost10000 を入れておきます。

f:id:yuk1tyd:20200929234137p:plain

4. JMX 接続を使って、リモート接続を開始する

JMX 接続を追加」を押すと、追加用のダイアログが立ち上がるので、そこに先ほどの {ec2-private-ip} と同じ IP アドレスとポートを書きます。ポートは JMX 用のポートのため、3333 を使用することに注意が必要です。

f:id:yuk1tyd:20200307194717p:plain
JMX 接続を追加」を押す

f:id:yuk1tyd:20200307194817p:plain
プライベート IP アドレスとポート番号を書く

上記の状態にして、「了解」ボタンを押すと、EC2 上のサーバーとの接続が開始されます。接続に成功すると、いつも見る VisualVM の画面が立ち上がってくれるはずです。

*1:あるポートにバインドした通信路へのソケットを提供してくれ、TCP/IP の肩代わりをするプロトコルです。ここで SSH を経由して JMX を通します。