JMX / JSTATD доступ к удаленной машине через SSH-туннель

Я хотел бы использовать приложение visualvm через ssh-туннель (к машине EC2), используя jmx ИЛИ jstatd. Как мне это сделать? Вот список того, что было опробовано (и не удалось): (Кстати: если VisualVM не подходит, как я могу найти утечки памяти на удаленном компьютере?)

JSTATD: попытка:

Я установил сервер jstatd на машине EC2 (приложение уже работало на нем) Затем я установил локальный порт 3333 для туннельного сопоставления с удаленным портом 1099 В VisualVM я попытался подключиться с помощью jstatd к порту 3333... ни один из процессов на EC2 появился

Эта ссылка говорит, что jstatd открывает другой порт: http://rukuro-blog.heroku.com/2011/06/30/monitoring-remote-java-applications-with-visualvm... поэтому я туннелировал этот порт с локального хоста на удаленный Я перезапустил VisualVM... все еще ничего

Когда я попытался перечислить процессы, запущенные из EC2, используя следующую команду:

jps -l -m -v rmi://localhost

... я получил список процессов

Когда я перечислил это на моей домашней машине, используя

jps -l -m -v rmi://localhost:3333

.... я не получил ни одного! Итак, порт rmi не туннелируется с портом jstatd (3333)...?

попытка jmx:

Я запустил приложение на удаленном компьютере с помощью следующей команды:

java -Dcom.sun.management.jmxremote.port=3333 \
     -Dcom.sun.management.jmxremote.ssl=false \
     -Dcom.sun.management.jmxremote.authenticate=false\
        -cp :post/* <appName>

... приложение работает, поэтому я туннелировал локальный порт 3333 на удаленный 3333

Затем я попытался установить ссылку jmx на localhost: 3333 из интерфейса visual vm: ... появляется сообщение об ошибке:

cannot connect to localhost:3333 using service:jmx:rmi:///jndi/rmi://localhost:3333/jmxrmi

Если мне нужно установить ссылку на сервер RMI для удаления, я не уверен, как это сделать.

Попытка JMXMP:

Это обещание, но что-то не так:

Сначала я добавил jar jmx_remote в classpath и запустил приложение на удаленной машине, используя ту же команду, что и в случае JMX, который я показал выше. Я нашел банку на ссылку для скачивания оракула

Я настроил ssh-туннель с локального порта 3333 на удаленный порт 3333. Затем я запустил visualvm с тем же файлом jmx_remote в calsspath.

visualvm -cp:a ~/jmx/jmxremote_optional.jar

Затем я попытался подключить visualvm к удаленному серверу с помощью:

service:jmx:jmxmp://localhost:3333

Теперь кажется, что visual vm пытается подключаться бесконечно. Он показывает "Добавление службы:jmx:jmxp://localhost:3333" в строке состояния... и продолжает делать это до тех пор, пока я не закрою приложение на удаленном конце, и в этот момент оно выдает всплывающее окно с сообщением о невозможности подключения с сервером.

При использовании SOCKS:

Мои попытки использовать JMX и jstatd не увенчались успехом.

Я не уверен, что прокси-сервер SOCKS работает, вот как я пытался подключиться:

ssh -i ~/.ssh/starter.pem -v -D 9696 user@host

Просто для полноты я начал команду на другом конце с:

    java -Dcom.sun.management.jmxremote\
 -Dcom.sun.management.jmxremote.ssl=false\
 -Dcom.sun.management.jmxremote.authenticate=false\
 -Dcom.sun.management.jmxremote.port=3333 <app>

И на локальном конце я установил соединение visualvm согласно этой странице справки LINK to VisualVm.

С помощью соединения JMX я установил имя машины и порт, щелкнув правой кнопкой мыши на хосте на visualvm и заполнив порт хоста, когда мне это предложат. На этом этапе строка состояния внизу показывает, что visualvm пытается подключиться к удаленному компьютеру, и через пару минут происходит сбой.

С подключением jstatd я ожидал, что удаленные процессы будут отображаться автоматически. Этого не произошло... не было сообщений об ошибках или чего-то еще.

На стороне носков следующие сообщения повторяются циклически:

debug1: Connection to port 9696 forwarding to socks port 0 requested.
debug1: channel 2: new [dynamic-tcpip]
channel 3: open failed: connect failed: Connection timed out
debug1: channel 3: free: direct-tcpip: listening port 9696 for 50.16.35.69 port 3333, connect from 127.0.0.1 port 43909, nchannels 4
debug1: Connection to port 9696 forwarding to socks port 0 requested.
debug1: channel 3: new [dynamic-tcpip]
channel 2: open failed: connect failed: Connection timed out
debug1: channel 2: free: direct-tcpip: listening port 9696 for 50.16.35.69 port 1099, connect from 127.0.0.1 port 44644, nchannels 4

Интересно, связано ли это с каналом носков. Раньше я туннелировал отдельные порты на удаленной машине, поэтому не могу представить, что это проблема конфигурации туннелирования. Я использую Ubuntu Linux с обеих сторон.

Спасибо за прочтение:)

4 ответа

Решение

JMX/RMI трудно туннелировать напрямую, потому что если RMI. По сути, сервер создает определение заглушки RMI, в котором есть инструкции для подключения обратно к серверу, откуда он пришел, но когда вы настраиваете, заглушки сбрасываются с сервера, но все их направления неверны, и они могут ' отсюда.

Самый простой способ решить эту проблему - это отказаться от разъема RMI и использовать JMXMP. Базовый протокол - это чистые сокеты, поэтому он идеально адаптирован для туннелирования.

Используйте SSH туннель с SOCKS прокси. Смотрите этот пост для более подробной информации.

Я только что сделал это две минуты назад...

  • Удаленный сервер с jmx на порту 8686 - этот порт заблокирован
  • sshd_config на удаленном блоке должен иметь "AllowTcpForwarding yes" или закомментирован
  • Откройте сеанс putty ssh с переадресацией порта на локальный порт 8686 (или любой другой) на localhost:8686
  • Добавьте локальное соединение jmx в VisualVm, указывая на локальный перенаправленный порт
  • VisualVm автоматически видит jvm и начинает мониторинг

Вот шаги, которые работали для меня:

  1. Запустите ejstatd на вашем удаленном хосте следующим образом (в папке ejstatd): mvn exec:java -Dexec.args="-pr 2000 -ph 2001 -pv 2002" (используется для соединения типа "jstatd")
  2. Запустите приложение Java с этими дополнительными параметрами Java: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=2003 -Dcom.sun.management.jmxremote.rmi.port=2003 (используется для соединения типа "JMX")
  3. Откройте сеанс SSH для удаленного хоста, туннелирующего эти 4 порта (с 2000 по 2003 включительно). Например, с клиентом OpenSSH, вы должны добавить эти параметры: -L2000:localhost:2000 -L2001:localhost:2001 -L2002:localhost:2002 -L2003:localhost:2003
  4. Запустить JVisualVM
    1. Щелкните правой кнопкой мыши "Local" > "Add jstatd Connection..." > "Add Custom" и введите " 2000 "в выборе" Порт ";
    2. Щелкните правой кнопкой мыши "Local" > "Add JMX Connection..." и введите " localhost:2003 "в поле" Соединение "и установите флажок" Не требовать SSL-соединения "
    3. Ваш Java-процесс появится дважды: один из типа соединения "jstatd" и один из типа соединения "JMX".

Отказ от ответственности: я являюсь автором инструмента ejstatd с открытым исходным кодом.

Другие вопросы по тегам