Як активувати JMX на JVM для доступу з jconsole?
Як активувати JMX на JVM для доступу з jconsole?
Відповіді:
Відповідну документацію можна знайти тут:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
Запустіть програму за допомогою таких параметрів:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Наприклад, як це:
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar Notepad.jar
-Dcom.sun.management.jmxremote.local.only=false
не обов'язково потрібно, але без цього він не працює на Ubuntu. Помилка була б приблизно такою:
01 Oct 2008 2:16:22 PM sun.rmi.transport. customer .TCPTransport$AcceptLoop executeAcceptLoop
WARNING: RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=37278] throws
java.io.IOException: The server sockets created using the LocalRMIServerSocketFactory only accept connections from clients running on the host where the RMI remote objects have been exported.
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:89)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.run(TCPTransport.java:359)
at java.lang.Thread.run(Thread.java:636)
див. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
Також будьте обережні,-Dcom.sun.management.jmxremote.authenticate=false
що робить доступ доступним для всіх, але якщо ви використовуєте його лише для відстеження JVM на локальній машині, це не має значення.
Оновлення :
У деяких випадках мені не вдалося дістатися до сервера. Потім це було виправлено, якщо я також встановив цей параметр:-Djava.rmi.server.hostname=127.0.0.1
com.sun.management.jmxremote
має значення за замовчуванням як true
. (Дякую, Sun!) Щоб бути надзвичайно зрозумілим, особливо тим, хто менш знайомий з JMX nobs, я використовую: com.sun.management.jmxremote=true
Ref: docs.oracle.com/javase/8/docs/technotes/guides/management/…
Dcom.sun.management.jmxremote.rmi.port=9011
і відкрити в брандмауері - все ще не можу з'єднатися з брандмауером, що працює. Будь-які думки? Я щось пропустив?
Біг у контейнері Docker створив цілу низку додаткових проблем підключення, тому, сподіваємось, це комусь допоможе. Мені потрібно було додати наступні параметри, які я поясню нижче:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${DOCKER_HOST_IP}
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
DOCKER_HOST_IP
На відміну від використання jconsole локально, ви повинні рекламувати інший IP, ніж ви, можливо, побачите зсередини контейнера. Вам потрібно буде замінити ${DOCKER_HOST_IP}
зовнішній IP-адрес (ім'я DNS) вашого хокера Docker.
JMX Remote & RMI Ports
Схоже, що JMX також вимагає доступу до інтерфейсу віддаленого управління ( jstat ), який використовує інший порт для передачі деяких даних при арбітражі з'єднання. Я не побачив ніде відразу очевидного, jconsole
щоб встановити це значення. У пов'язаній статті процес був таким:
jconsole
якщо ввімкнено ведення журналуjconsole
намагався використатиiptables
/ firewall
правила, якщо потрібно, щоб дозволити цей порт підключитисяХоча це працює, це, звичайно, не є автоматизованим рішенням. Я вибрав оновлення з jconsole до VisualVM, оскільки він дозволить вам чітко вказати порт, на якому jstatd
працює. У VisualVM додайте новий віддалений хост та оновіть його зі значеннями, які співвідносяться із зазначеними вище:
Потім клацніть правою кнопкою миші нове підключення до віддаленого хоста та Add JMX Connection...
Не забудьте встановити прапорець Do not require SSL connection
. Будемо сподіватися, що це дозволить вам підключитися.
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
також є ключовим у випадку тунелювання JMX / RMI через SSH. Без них доступ до віддалених об'єктів здійснюється за допомогою загальнодоступного / основного / ... IP-сервера за допомогою якогось випадкового порту, який неможливо легко переслати.
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
ніде користуватися - я просто використовував localhost
і пересилав порти під час запуску докерного зображення: -p 9998:9998, -p 9999:9999
і т. Д.
Зауважте, Java 6 в останньому втіленні дозволяє jconsole приєднатися до запущеного процесу навіть після того, як він був запущений без закликів JMX.
Якщо це доступно для вас, також врахуйте jvisualvm, оскільки він надає велику кількість інформації про запущені процеси, включаючи профілер.
Я використовую WAS ND 7.0
Моєму JVM потрібні всі наступні аргументи для моніторингу в JConsole
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
У Linux я використовував такі парами:
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
а також я відредагував /etc/hosts
так, щоб ім'я хоста узгоджувалося з адресою хоста (192.168.0.x), а не з адресою петлі (127.0.0.1)
Запустіть свою програму java із такими параметрами командного рядка:
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Важливо використовувати параметр -Dcom.sun.management.jmxremote.ssl = false, якщо ви не хочете встановлювати цифрові сертифікати на хості jmx.
Якщо ви запустили свою програму на машині з IP-адресою 192.168.0.1 , відкрийте jconsole , поставте 192.168.0.1:8855 у поле Віддалений процес і натисніть кнопку Підключити .
-Dcom.sun.management.jmxremote.ssl=false
? Якщо має jconsole
відображатись помилка, чи це просто тихо не вдалося підключитися?
поряд із наведеними нижче параметрами командного рядка,
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Іноді на Linux-серверах imx-з'єднання не вдається. це тому, що в хмарі Linux Linux, в / etc / hosts, так що ім'я хоста вирішується на адресу хоста.
найкращий спосіб виправити це - пінг конкретного сервера Linux з іншої машини в мережі та використання IP-адреси цього хоста в
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
Але ніколи не покладайтеся на ipaddress, який ви отримуєте з сервера Linux, використовуючи ifconfig.me. ip, який ви потрапляєте туди, маскується, який присутній у файлі хоста.
Спершу потрібно перевірити, чи ваш процес Java вже працює з параметрами JMX. Зробити це:
ps -ef | grep java
Перевірте свій процес Java, який потрібно контролювати. Якщо ви можете побачити параметр jmx rmi Djmx.rmi.registry.port = xxxx, тоді використовуйте порт, згаданий тут, у вашому java visualvm, щоб віддалено підключити його під з'єднання jmx.
Якщо він не працює через jmx rmi-порт, тоді вам потрібно запустити процес java із наведеними нижче параметрами:
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Примітка: номери портів залежать від вашого вибору.
Тепер ви можете використовувати цей порт для спільного отримання jmx. Ось це порт 1234
.
sudo lsof -i:1234
не показує нічого для мене
Крок 1: Запустіть додаток, використовуючи наступні параметри.
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Вище наведені аргументи прив'язують додаток до порту 9999.
Крок 2: Запустіть jconsole, виконавши команду jconsole в командному рядку або терміналі.
Виберіть "Віддалений процес:" та введіть URL-адресу як {IP_Address}: 9999 та натисніть кнопку Connect, щоб підключитися до віддаленої програми.
Ви можете посилатися на це посилання для повного застосування.
У мене була ця проблема, і я створив проект GitHub для тестування та з'ясування правильних налаштувань .
Він містить роботу Dockerfile
з підтримуючими сценаріями та простий docker-compose.yml
для швидкого тестування.