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 с обеих сторон.
Спасибо за чтение:)
Ответы
Ответ 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.