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

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

jstatd: попытка:

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

Эта ссылка говорит, что jstatd открывает другой порт: http://rukuro-blog.heroku.com/2011/06/30/monitoring-remote-java-applications-with-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 из визуального интерфейса 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 в calspath.

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 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 в соответствии с этим ССЫЛКА на страницу справки 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

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

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


person fodon    schedule 10.10.2012    source источник
comment
К вашему сведению, я решил использовать XFCE и tightvnc и запустил visualvm на удаленной машине.   -  person fodon    schedule 20.10.2012


Ответы (4)


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

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

person Nicholas    schedule 10.10.2012
comment
Так это jmx с нестандартным подключением... стоит попробовать. Я предполагаю, что у визуального vim не будет проблем с поиском сервера. - person fodon; 11.10.2012
comment
Это не сработало ... к вопросу добавлены подробности моей попытки. - person fodon; 11.10.2012
comment
Я только что добавил некоторые подробности в раздел вопросов. Я также сделал ссылку, которую использовал для помощи в настройке подключения и VisualVm для теста. - person fodon; 12.10.2012
comment
Это кажется хорошим объяснением: blog.cantremember.com/debugging- с-jconsole-jmx-ssh-туннелями - person David Mann; 17.10.2013

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

person Tomas Hurka    schedule 11.10.2012
comment
Это тоже не сработало для меня. подробности того, как моя попытка не удалась, были добавлены к вопросу в разделе «Использование SOCKS». - person fodon; 11.10.2012
comment
Вы не упомянули, что вы сделали в VisualVM после того, как настроили socks-прокси, и что произошло. - person Tomas Hurka; 11.10.2012
comment
Я разместил ссылку на документы, которые я использовал для настройки визуальной виртуальной машины, и добавил в пост дополнительную информацию, в основном о том, что я видел на визуальной виртуальной машине. - person fodon; 12.10.2012
comment
Этот метод работал у меня, но только с JDK 1.7. JDK 1.6 потерпел неудачу, но не особенно помог мне объяснить, почему. - person eebbesen; 12.08.2013

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

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

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

  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. Launch JVisualVM
    1. Right-click on "Local" > "Add jstatd Connection..." > "Add Custom" and enter "2000" in "Port" selection;
    2. Щелкните правой кнопкой мыши «Локальный»> «Добавить соединение JMX ...» и введите «localhost:2003» в поле «Соединение» и установите флажок «Не требовать подключения SSL».
    3. Ваш Java-процесс появится дважды: один для типа соединения "jstatd" и один для типа соединения "JMX".

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

person Anthony O.    schedule 03.11.2016
comment
Я открываю порты прямо на сервере, чтобы протестировать ejstatd. Я могу добраться до портов, но соединение с JMX не работает. - person mavi; 03.01.2018