VisualVM через замазку SSH-туннеля - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь профилировать удаленное приложение Java, на самом деле это игровой сервер.Он работает нормально на моей локальной машине (Windows XP x64 с JDK1.7.0_02 x64), но на рабочем сервере ведет себя очень странно (CentOS с JDK1.7.0_03 i586).

Я сделал многопоиска и обнаружил, что я должен использовать 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 запускаются с правами суперпользователя.

, и 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)]

После дальнейшего поиска в Google я обнаружил, что мне нужно использовать туннелирование ssh.Я настроил замазку следующим образом

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

и VisualVM, так как это

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

Adter munipulation над VisualVM подключается к удаленному хосту,но я вижу только сводную диаграмму потоков и профилировщик неактивен.

Я видел некоторые рекомендации, что jvms на обеих машинах должны быть одинаковыми и иметь одинаковую платформу (x86 или x64), но я уже пробовалпрофилирование с другого компьютера (windows 7 x86 с JDK1.7.0_03 x86) и тот же результат.

Я тоже пробовал это, но снова получаю тот же результат. VisualVM поверх ssh

Как мне заставить этот профилирование работать?

Ответы [ 3 ]

3 голосов
/ 04 декабря 2013

Несмотря на то, что на это ответили, мне удалось это сделать, поэтому я добавлю свой подход:

Я использовал следующий источник:

https://bowerstudios.com/node/731

Я сделал это в Windows, используя git bash с командой ssh. Вы также можете использовать Cygwin или чистый Minggw.

1) Запустите команду ssh tunnel в командной строке (я делаю это в git bash / MINGGW32).

ssh -D 9010 -p 22 root@IP -v

2) Запустите ваше приложение на сервере с опциями JMX (одна строка)

 java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false -jar application.jar

3) Запустите visualVM через прокси-сервер socks для подключения (один вкладыш)

visualvm -J-Dnetbeans.system_socks_proxy=localhost:9010 
-J-Djava.net.useSystemProxies=true

4) На самом деле добавьте удаленное соединение JMX в visualVM

Также доступно: http://maythesource.com/2013/12/04/connecting-to-jmx-from-visualvm-using-ssh-tunnel/ (со временем будет обновляться с дополнительной информацией).

2 голосов
/ 02 марта 2012

Обратите внимание, что если на сервере установлены библиотеки X11, вы можете запустить JVisualVM удаленно и просто установить Putty для переадресации соединения X11 на сервер X11, работающий на вашем локальном компьютере.

Если у вас нет доступного X11-сервера, Xming - http://www.straightrunning.com/XmingNotes/ - отлично подойдет для этого. Если ваш компьютер защищен, вы можете работать без контроля доступа, что значительно упрощает его настройку и запуск.

Обратите внимание, что связь X11 довольно многословна. Используйте шифр "blowfish" и попросите сжатие.

0 голосов
/ 20 февраля 2012

Я бы начал с отладки только jstatd-соединения и оставил бы JMX-соединение на потом. Из написанного вами не ясно, почему вы должны использовать SSH туннелирование. Есть ли на удаленном хосте брандмауэр или почему вы думаете, что вам нужно использовать ssh-туннелирование? Еще одно примечание - неверно, что jvms на обеих машинах должны быть одинаковыми и иметь одинаковую платформу (x86 или x64).

...