VisualVM через SSH - PullRequest
       60

VisualVM через SSH

46 голосов
/ 23 октября 2009

Я прочитал Visual VM удаленно через ssh , но я думаю, что я не до конца понял, потому что это не работает для меня :-( Пожалуйста, кто-нибудь может привести пример?

ssh -D 9696 login@ip.of.external.machine и visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true запускает visualvm, но никакие процессы внешнего компьютера не отображаются (только локальные, такие как сам visualvm). Более того, иногда (но не всегда) я получаю сообщение «канал 3: открытие не удалось: подключение не удалось: подключение отказано» в моем окне ssh.

Любая помощь?

Ответы [ 8 ]

37 голосов
/ 27 октября 2009

Вам нужно либо запустить jstatd на удаленной стороне, либо указать соединение JMX, используя порт host :.

Jstatd:

jstatd -J-Djava.security.policy=permissions.txt [-p port]

После этого: добавьте удаленное соединение к целевому компьютеру и в свойствах этого удаленного соединения настройте соединение jstatd.

(permissions.txt содержит, например, это:

grant {
  permission java.security.AllPermission;
};

Редактировать: (Ответ на комментарий)

  1. ssh -D 9696 me@remote и запустите jstatd, как указано выше, в удаленной командной строке. Если вы хотите, чтобы jstatd был на другом порту, отличном от 1099 по умолчанию, используйте аргумент -p для jstatd.
  2. запустить visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true на локальной машине
  3. в visual vm: добавить новое удаленное соединение и указать remote в качестве хоста и порт для jstatd (1099 по умолчанию или то, что вы указали с -p при запуске jstatd)

    Теперь вы должны увидеть процессы на удаленной стороне в visualvm

22 голосов
/ 02 июля 2015

У меня есть другое решение, использующее стандартное туннелирование SSH и без портов брандмауэра для открытия. У меня SOCKS прокси не работает.

Запустите JVM с параметрами:
-Dcom.sun.management.jmxremote = истина
-Dcom.sun.management.jmxremote.ssl = ложь
-Dcom.sun.management.jmxremote.authenticate = ложь
-Dcom.sun.management.jmxremote.port = [port1]
-D java.rmi.server.hostname = локальный
-Dcom.sun.management.jmxremote.rmi.port = [port2]

Важной частью является "server.hostname = localhost". Кроме того, вы явно определяете оба порта (connect + "random" RMI port), для "jmxremote.rmi.port" требуется как минимум Java 7 update 4 (я где-то читал, не проверял эту информацию - используйте «lsof -i» серверный компьютер для проверки реально используемых портов).

(Конечно, вы можете использовать аутентификацию или SSL.)

Подключитесь через ssh к серверу и перешлите локальные port1 и port2 на localhost: port1 | 2 и сервер.

В VisualVM откройте JMX-соединение с localhost: port1 (без настройки прокси).

12 голосов
/ 15 марта 2015

У меня была проблема привязки jstatd на localhost, поэтому мне пришлось набрать

jstatd -J-Djava.security.policy=allPerm.policy -J-Djava.rmi.server.logCalls=true -p <port> -J-Djava.rmi.server.hostname=<my ip>

также для jvisualvm я использую эти параметры вместо

jvisualvm -J-DsocksProxyHost=localhost -J-DsocksProxyPort=<socks-port>

таким образом, подключаясь через ssh-прокси, я мог бы использовать реальный IP-адрес моей удаленной машины.

Кража из этого ответа я сделал себе полное напоминание на моем сайте .. я надеюсь ты не против анкон Спасибо за это кстати :)

11 голосов
/ 09 мая 2017

У меня возникла такая же проблема при подключении jVisualVM к удаленному приложению через ssh.

Этот урок помог мне решить мою проблему. http://issamben.com/how-to-monitor-remote-jvm-over-ssh/

Чтобы решить эту проблему, убедитесь:

  • вы задали два порта в конфигурации jvm

     -Dcom.sun.management.jmxremote.ssl=false 
     -Dcom.sun.management.jmxremote.authenticate=false 
     -Dcom.sun.management.jmxremote.port=9010
     -Dcom.sun.management.jmxremote.rmi.port=9011
     -Djava.rmi.server.hostname=localhost
     -Dcom.sun.management.jmxremote.local.only=false
    
  • ssh-туннель правильно установлен

     ssh -i yourPermissionFile.pem -l username 101.101.101.101 -L 9010:localhost:9010 -L 9011:localhost:9011
    
4 голосов
/ 24 октября 2012

Я также обнаружил, что аргументы jvm:

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

не работает на сборке, которую я использую 1.3.2.

Поэтому я использовал Инструменты> Параметры> Сеть и установил его вручную в настройках SOCKS.

НО VisualVM все еще не обнаружил удаленные процессы. Затем я удалил прослушивание localhost «No proxy hosts», поскольку это, вероятно, заблокировало его.

3 голосов
/ 24 ноября 2011

Я обнаружил, что в jvm аргументы для прокси не работают. По крайней мере, в версии 1.3.3 (сборка 111013). Настройка прокси в Сервис> Параметры> Сеть работала у меня. Также должны работать общесистемные настройки прокси, хотя по определению это влияет на все остальные сетевые подключения.

0 голосов
/ 10 января 2019

Я знаю, что этот вопрос старый, но я предлагаю более простое решение вместо использования jstat.

просто используйте только SSH и Jvisualvm

  1. ssh с sockproxy (ex ssh -D 6666 host@123.123.123.123)
  2. запустить jvisualvm с носком (jvisualvm.exe -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 6666)
  3. добавить хост JXM (например: 234.234.234.234:16000)

Используйте jvisualvm простой способ обнаружить утечку памяти и контролировать процессор, ОЗУ приложения

0 голосов
/ 23 января 2017

Попробуйте другую версию jvisualvm (например, новейшую из https://visualvm.github.io/download.html)

Я не мог заставить его работать с jvisualvm, так как он не использовал прокси-сервер SOCKS (я не видел ничего связанного с jvisualvm в ssh -v -D 9696). Удаленные приложения никогда не появлялись в jvisualvm. VisualVM показал их через несколько секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...