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 и начинает мониторинг
Вот шаги, которые работали для меня:
- Запустите 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
- Щелкните правой кнопкой мыши "Local" > "Add jstatd Connection..." > "Add Custom" и введите "
2000
"в выборе" Порт "; - Щелкните правой кнопкой мыши "Local" > "Add JMX Connection..." и введите "
localhost:2003
"в поле" Соединение "и установите флажок" Не требовать SSL-соединения " - Ваш Java-процесс появится дважды: один из типа соединения "jstatd" и один из типа соединения "JMX".
- Щелкните правой кнопкой мыши "Local" > "Add jstatd Connection..." > "Add Custom" и введите "
Отказ от ответственности: я являюсь автором инструмента ejstatd с открытым исходным кодом.