Подтвердить что ты не робот

Jmx/jstatd доступ к удаленной машине через туннель ssh

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

jstatd: попытка:

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

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

Когда я попытался перечислить процессы, запущенные из 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 из визуального интерфейса vm: ... он выдает сообщение об ошибке:

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

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

попытка JMXMP:

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

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

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

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

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

service:jmx:jmxmp://localhost:3333

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

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

Мои попытки использования JMX и jstatd не удались.

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

ssh -i ~/.ssh/starter.pem -v -D 9696 [email protected]

Просто для полноты, я начал команду на другом конце с помощью

    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 на страницу справки 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 с обеих сторон.

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

4b9b3361

Ответ 1

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

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

Ответ 2

Используйте SSH-туннель с прокси SOCKS. Подробнее см. этот пост.

Ответ 3

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

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

Ответ 4

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

  • Запустите ejstatd на вашем удаленном хосте таким образом (в папке ejstatd): mvn exec:java -Dexec.args="-pr 2000 -ph 2001 -pv 2002" (используется для типа "jstatd" подключение)
  • Запустите приложение 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" )
  • Откройте сеанс SSH для удаленного хоста, который туннелирует эти 4 порта (с 2000 по 2003 год включил). Например, с помощью клиента OpenSSH вы должны добавить эти параметры: -L2000:localhost:2000 -L2001:localhost:2001 -L2002:localhost:2002 -L2003:localhost:2003
  • Запустить JVisualVM
    • Щелкните правой кнопкой мыши "Локальный" > "Добавить соединение jstatd..." > "Добавить пользовательский" и введите "2000" в разделе "Порт";
    • Щелкните правой кнопкой мыши "Локальный" > "Добавить соединение JMX..." и введите "localhost:2003" в "Подключение" и установите флажок "Не требуется SSL-соединение"
    • Ваш Java-процесс появится дважды: один из типа соединения "jstatd" и один из типа соединения "JMX".

Отказ от ответственности: я автор открытого инструмента ejstatd.