簡體   English   中英

使用visualvm和JMX進行遠程監控

[英]Remote monitoring with visualvm and JMX

我想使用 jvisualvm(或 jconsole)監視遠程運行的 java(spring boot)應用程序。 在本地運行時,我可以在 jvisualvm 和 jconsole 中看到托管 bean。 遠程運行時,我無法連接。 我嘗試了幾個不同的 java 進程(例如使用 spring xd)。 在 SO 和 Google 上尋找答案並沒有幫助。

這些是我的 JAVA_OPTS(在遠程主機上):

$ echo $JAVA_OPTS
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.59.99

然后我簡單的啟動程序如下(這個是針對spring xd的,但是我用其他java程序也遇到了同樣的問題)。

$ bin/xd/xd-singlenode

服務器進程似乎選擇了以下選項:

$ ps -ef | grep single
vagrant  22938 19917 99 06:38 pts/2    00:00:03 /usr/lib/jvm/java-8- oracle/jre/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.59.99 -Dspring.application.name=admin -Dlogging.config=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config///xd-singlenode-logger.properties -Dxd.home=/home/vagrant/spring-xd-1.1.0.RELEASE/xd -Dspring.config.location=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config// -Dxd.config.home=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config// -Dspring.config.name=servers,application -Dxd.module.config.location=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config//modules/ -Dxd.module.config.name=modules -classpath (...)

遠程主機(ubuntu linux vm)上的java版本是:

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

本地機器(Mac OS)上的java版本略有不同:

$ java -version    
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b25)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

在 jvisualvm 中,我按如下方式添加遠程連接(嘗試使用 ssl 連接和不使用 ssl 連接):

在此處輸入圖片說明

這是 jvisualvm 給我的錯誤消息:

jvisualvm 給出的錯誤信息

當遠程進程正在運行時,我可以使用命令telnet 192.168.59.99:9010從本地主機連接到遠程主機 - 所以這似乎不是防火牆問題。

任何幫助都受到高度贊賞。

請使用以下 JVM 選項:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.59.99

在 Jconsole 中,使用以下內容進行連接:

service:jmx:rmi:///jndi/rmi://192.168.59.99:9010/jmxrmi

Arnab Biswas 的 anwser 在我的情況下不起作用。 經過一個小時的研究,我發現 JMX 運行在 RMI 之上,因此,JMX 使用了 2 個端口:

  • JMX 連接端口。 ( -Dcom.sun.management.jmxremote.port )
  • (臭名昭著的)漫游 RMI 數據端口。 ( -Dcom.sun.management.jmxremote.rmi.port )

RMI 數據端口將打開一個從1099開始的隨機端口。 通過將 RMI 注冊表和 RMI 服務器使用的端口設置為相同的端口,隧道將變得更加容易。

所以我需要將-Dcom.sun.management.jmxremote.rmi.port=9010添加到 JVM 選項

我需要使用以下 JVM 選項:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.59.99

閱讀更多:

讓我詳細討論一下。 我剛剛將它連接到遠程服務器。 你需要去你的jar文件所在的文件夾。 假設,您想監視X.jar文件並假設它位於usr/local/文件夾中。因此,首先cd進入該文件夾。 然后確定哪個 jdk 正在運行。 你可以通過在linux中執行命令which java找到它。 在遠程服務器的命令行中(一般我們使用PuTTy cmd)。 在 PuTTy cmd 中寫入:

java -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 -Djava.rmi.server.hostname=192.168.10.0 -jar X.jar

現在讓我詳細解釋一下。 這里需要定義rmi端口,因為jmx使用rmi 如果我們不定義rmi端口,它會自動分配一個隨機端口。 那么我們的連接就不會成功。 我們不會使用身份驗證和 ssl,因為這會造成困難。 如果你願意,你可以自己嘗試。 在主機名中,您必須指定作為 IP 地址的遠程主機名。 現在使用位於本地計算機中的visualvm 一般可以在這個文件夾中找到:

C://Program Files/Java/jdk1.8.0_201/bin 

如果沒有,則下載它並將其粘貼到目錄中。 從本地電腦運行visualvm。 您將看到一些選項,如本地、遠程。 在“遠程”選項中選擇“添加遠程主機”。 添加您的主機名。 就我而言,它是192.168.10.0 然后右鍵單擊鼠標並選擇“添加 jmx 連接”。 將打開一個窗口並插入您的端口號。 就我而言,它是9010 您可以指定任何端口號。 選擇“不需要 ssl 連接”並且不要選擇安全憑證。 因為我們在屬性中添加了身份驗證為假。 現在連接,您的連接將順利進行。 還有一個建議。 您可以使用“jstatd connection”進行連接。但它不起作用。不顯示任何輸出。可能是因為java 8問題左右。要監視內存詳細信息,您需要更新版本的“visualvm.exe”。您可以下載它。您可以使用身份驗證和 SSL 進行連接。此鏈接中討論了使用 Authentication=true 的詳細步驟: Connect to remote JMX Agent with authentication

此鏈接中討論了使用 authentication=true 和 SSL = true 的詳細步驟: JConsole SSL/TLS with Password Authentication

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM