VisualVM через SSH
Я читал 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.
Любая помощь?
9 ответов
Вам нужно либо запустить jstatd на удаленной стороне, либо указать соединение JMX, используя порт host:.
Jstatd:
jstatd -J-Djava.security.policy=permissions.txt [-p port]
После этого: добавьте удаленное соединение на целевой компьютер и в свойствах этого удаленного соединения настройте соединение jstatd.
(permissions.txt содержит, например, это:
grant {
permission java.security.AllPermission;
};
Изменить: (Ответ на комментарий)
ssh -D 9696 me@remote
и запустите jstatd, как указано выше, в удаленной командной строке. Если вы хотите, чтобы jstatd был на другом порту, отличном от 1099 по умолчанию, используйте аргумент -p для jstatd.- бежать
visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
на локальной машине в visual vm: добавьте новое удаленное соединение и укажите remote как хост и порт для jstatd (1099 по умолчанию или то, что вы указали с -p при запуске jstatd)
Теперь вы должны увидеть процессы на удаленной стороне в visualvm
У меня есть другое решение, использующее стандартное туннелирование SSH и отсутствие портов брандмауэра для открытия. Для меня SOCKS прокси не работает.
Запустите свою JVM с параметрами:
-Dcom.sun.management.jmxremote = верно
-Dcom.sun.management.jmxremote.ssl= ложь
-Dcom.sun.management.jmxremote.authenticate= ложь
-Dcom.sun.management.jmxremote.port =[port1]
-Djava.rmi.server.hostname = localhost
-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 к серверу и перенаправьте ваш локальный порт 1 и порт 2 на локальный хост: порт 1|2 и сервер.
В VisualVM откройте соединение JMX с localhost:port1 (без каких-либо настроек прокси).
У меня возникла та же проблема при подключении 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
У меня была проблема привязки 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-адрес моей удаленной машины.
Кража из этого ответа я сделал себе полное напоминание на моем сайте.. я надеюсь, что вы не возражаете, Анкон Спасибо за это, кстати:)
Я также обнаружил, что аргументы jvm:
-J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
не работал над сборкой я использую 1.3.2.
Поэтому я использовал Инструменты> Параметры> Сеть и установил его вручную в настройках SOCKS.
НО VisualVM все еще не нашел удаленные процессы. Затем я удалил прослушивание localhost "No proxy hosts", поскольку это, вероятно, заблокировало его.
Я обнаружил, что в JVM аргументы для прокси не работают. По крайней мере, в версии 1.3.3 (сборка 111013). Настройка прокси в Сервис> Параметры> Сеть работала у меня. Также должны работать общесистемные настройки прокси, хотя по определению это влияет на все остальные сетевые подключения.
Я знаю, что этот вопрос старый, но я предлагаю более простое решение вместо использования jstat.
просто используйте только SSH и Jvisualvm
- SSH с sockproxy (ex ssh -D 6666 host@123.123.123.123)
- запустить jvisualvm с помощью sock (jvisualvm.exe -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 6666)
- добавить хост JXM (например: 234.234.234.234:16000)
Используйте jvisualvm простой способ обнаружить утечку памяти и контролировать процессор, оперативную память приложения
Попробуйте использовать другую версию jvisualvm (например, самую новую с https://visualvm.github.io/download.html).
Я не мог заставить его работать с jvisualvm, так как он не использовал прокси SOCKS (я не видел ничего связанного с jvisualvm в ssh -v -D 9696). Удаленные приложения никогда не появлялись в jvisualvm. VisualVM, однако, показал их через несколько секунд.
Google Cloud gcloud, который работает для меня:
- Создайте туннель SOCKS с помощью putty/ssh (соединение шпатлевки > ssh > туннель > динамический исходный порт 61099 для ssh -D61099)
- Варианты Java (! удалите все остальные советы, которые вы приняли):
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
- VisualVM: Инструменты > Параметры > Сеть > Вручную > SOCKS Прокси: локальный порт: 61099
- Нажмите OK, в дереве приложений щелкните правой кнопкой мыши и выберите «Добавить удаленный хост».
- !используйте внутренний IP-адрес виртуальной машины (10.128.xx)
- Щелкните правой кнопкой мыши этот хост-узел и добавьте JMX.
- Введите 10.128.xx:1099