簡體   English   中英

使用 VisualVM 分析 tomcat 應用程序

[英]Profiling tomcat application with VisualVM

我試圖在用戶名 tomcat6 下運行 visualvm,因為顯然 visualvm 只能找到在其用戶名下運行的應用程序。 因此,默認情況下,它只會查找在我的用戶名下運行的應用程序。 我已經能夠通過 jmx 將 visualvm 與 tomcat6 連接起來,但這缺乏檢測分析的精細粒度。

我嘗試以下在用戶名 tomcat6 下運行 visualvm,但出現以下我不明白的錯誤。

$ sudo -u tomcat6 jvisualvm
No protocol specified
Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
...

不幸的是,遠程模式下只有采樣可用,因此JMX將缺乏檢測工具。

實際上,您在tomcat6用戶下運行visualvm的方法是正確的。 你應該看看這個關於如何在 sudo 下運行X11應用程序的問題。

傳遞DISPLAYXAUTHORITY環境變量的最簡單方法是使用sudo -E命令保留當前用戶環境。

此外,如果您在tomcat6用戶下看不到您的進程,則應檢查CATALINA_TMPDIR是否指向/tmp 否則你應該把它傳遞給visualvm

jvisualvm -J-Djava.io.tmpdir="${CATALINA_TMPDIR}"

實際上,有很多替代方案,如yourkitjprofiler隨 java 代理一起提供,它們允許遠程檢測分析。

如果運行你的應用程序的計算機是遠程的——比如服務器——那么你不能在沒有工作的情況下運行 GUI 應用程序。 啟用對VisualVM的遠程訪問可能會更容易。

您可以使用兩種技術連接到遠程 JVM:使用jstatd或使用 JMX。 我不確定您認為使用 JMX 會失去什么,但顯然jstatd不會讓您訪問分析工具、CPU 監視器等)。

您需要配置 JVM 和 Tomcat 以允許遠程訪問。 這需要3個步驟:

  1. 啟用遠程 JMX。 事實證明, 有一個指南

  2. 修復用於 RMI 的“流浪端口”。 也有一個指南

  3. (可選)安排對服務器的安全遠程訪問。 最簡單的方法是使用ssh -Lport:localhost:port和一系列-L參數將多個端口從工作站轉發到服務器。 映射您在步驟#1 和#2 中必須配置的所有端口。 如果您不這樣做,則需要對上述所有端口進行非防火牆訪問。

  4. 重新啟動 JVM 並連接 JVisualVM。

更新 2022-06-01

請注意,“流浪端口”問題已在 JVM 級別修復,因此無需應用程序(即 Tomcat)支持。 Tomcat 8.5 及更高版本的第 1 項包含更新的指令,使最新的 JVM 不需要第 2 項。

最簡單的方法是在 Tomcat 上打開一個遠程 JXM 端口,以便能夠使用 jvisualvm 遠程(從您的台式計算機)連接到您的遠程 Tomcat(在您的服務器上)。

您需要將以下系統屬性傳遞給您的 JVM:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=<whatever_port_you_want>
-Dcom.sun.management.jmxremote.ssl=false

然后在本地電腦上打開jvisualvm(JVM版本需要相同或更新),文件->添加遠程主機->在主機上輸入名稱。 它將為此主機創建一個條目。 右鍵這個條目 -> 添加 JMX 連接 -> 輸入端口 -> 確定

jvisualvm 將能夠遠程訪問您的應用程序。

如果需要,您還可以使用以下系統屬性保護連接(您需要創建文件並將它們定位到您想要的位置:

-Dcom.sun.management.jmxremote.password.file=jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=jmxremote.access 

這些屬性需要添加到 CATALINA_OPTS 環境變量中。 法例:

export CATALINA_OPTS = "$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 "

有關 JMX 的更多信息在這里: https ://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html

我嘗試做類似的事情,但不允許在服務器上安裝 JVisualVM。 讓 JVisualVM 連接到遠程機器似乎永遠無法正常工作。 我懷疑防火牆規則阻止了部分網絡連接。 我發現遠程分析服務器的唯一方法是通過 ssh 隧道。

  1. 在服務器上的 CATALINA_OPTS 中設置 JMX 端口

    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=13333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false; 導出 CATALINA_OPTS

  2. 在您的桌面計算機上打開與服務器的 ssh 連接

    ssh -D 61444 用戶名@tomcat.server.address

  3. 向 JVisualVM 添加一個標志,以便它代理其網絡連接

    “C:\Program Files\Java\jdk1.7.0_79\bin\jvisualvm.exe”-J-Dnetbeans.system_socks_proxy=localhost:61444 -J-Djava.net.useSystemProxies=true

  4. 讓 JVisualVM 連接到 jmxport,網絡流量通過 ssh 進行隧道傳輸。

    祝你好運。

暫無
暫無

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

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