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