3

リモートJavaアプリをプロファイリングしようとしていますが、実際にはゲームサーバーです。私のローカル マシン (JDK1.7.0_02 x64 を搭載した Windows XP x64) では正常に動作しますが、運用サーバー (JDK1.7.0_03 i586 を搭載した CentOS) では非常に奇妙な動作をします。

多くの検索を行った結果、このタスクには VisualVM を使用する必要があることがわかりました。したがって、VisualVM はローカル マシンでうまく動作しますが、ローカル マシンでハングすることはありません。実稼働環境で実際のペイロードを使用してプロファイリングする必要があります。引数を指定してリモート マシンで jstatd を開始しました

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=false &

ポリシーファイルで

grant codebase "file:/usr/java/jdk1.7.0_02/lib/tools.jar" {
    permission java.security.AllPermission;
};

次に、このようにJavaアプリケーションを開始しました

java -server -Dcom.sun.management.jmxremote\
 -Dcom.sun.management.jmxremote.port=4000\
 -Dcom.sun.management.jmxremote.ssl=false\
 -Dcom.sun.management.jmxremote.authenticate=false\
 -jar /home/pinballSocketServer/pinballSocketServer.jar

アプリケーションと jstatd の両方が root 権限で起動されます。

VisualVM はリモート ホストに接続できませんでした。しかし、リモート ホストでは、VisualVM が実行され、リモート ホストが追加されている間、次のログが表示されます。

Feb 16, 2012 7:11:52 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:11:56 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:12:00 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:12:04 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]

さらにグーグルで調べたところ、ssh トンネリングを使用する必要があることがわかりました。次の方法でパテを構成しました

http://www.advancedigital.ru/show/putty_config.jpg

およびVisualVMとして

http://www.advancedigital.ru/show/visualvm_config.jpg

上記の VisualVM の操作を追加すると、リモート ホストに接続されますが、スレッドの概要チャートしか表示されず、プロファイラーが非アクティブになっています。

両方のマシンの jvm は似ていて、同じプラットフォーム (x86 または x64) を持つべきであるといういくつかの推奨事項を見てきましたが、別のマシン (JDK1.7.0_03 x86 を使用した Windows 7 x86) からのプロファイリングを既に試しましたが、同じです。結果。

私もこれを試しましたが、再び同じ結果が得られます。 ssh 経由の VisualVM

このプロファイリングを機能させるにはどうすればよいですか?

4

3 に答える 3

2

サーバーに X11 ライブラリがインストールされている場合は、JVisualVMをリモートで実行し、Putty で X11 接続をローカル マシンで実行されている X11 サーバーに転送することができます。

X11 サーバーが利用できない場合、Xming - http://www.straightrunning.com/XmingNotes/ - は問題なく動作します。コンピューターが安全であれば、アクセス制御なしで実行できるため、起動と実行がはるかに簡単になります。

X11 通信は非常に冗長であることに注意してください。"blowfish"-cypher を使用して、圧縮を要求します。

于 2012-03-02T13:27:28.830 に答える
-1

jstatd接続だけのデバッグから始めて、後でJMX接続を残します。あなたが書いたように、なぜsshトンネリングを使うべきなのかは明確ではありません。リモートホストにファイアウォールがありますか、それともsshトンネリングを使用する必要があると思うのはなぜですか。1つの追加の注意-両方のマシンのjvmが類似していて、同じプラットフォーム(x86またはx64)を持っている必要があるというのは真実ではありません。

于 2012-02-20T14:13:19.087 に答える