使用VisualVM对Tomcat应用程序进行性能剖析

6

我试图在用户名为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)
...

http://stackoverflow.com/questions/24153416/java-lang-internalerror-cant-connect-to-x11-window-server-for-jvisualvm-profil - David
4个回答

5
如果你的应用程序运行的计算机是远程的,比如服务器,那么没有一些工作是无法运行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和更高版本包含更新的说明,使项目#2不必要使用最新的JVM。

终于有一个可行的解决方案了!这应该是被采纳的答案。 - Johan

4

很遗憾,远程模式下只能使用抽样采集,因此JMX将缺乏工具。

实际上,您在tomcat6用户下运行visualvm的方法是正确的。您应该查看这个问题,了解如何在sudo下运行X11应用程序。

传递DISPLAYXAUTHORITY环境变量的最简单方法是使用sudo -E命令来保留当前用户环境。

另外,如果您无法在tomcat6用户下看到进程,则应检查CATALINA_TMPDIR是否指向/tmp。否则,您应该将其传递给visualvm。

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

实际上,有很多替代方案,例如yourkitjprofiler,它们都带有Java代理以允许远程检测剖析。


echo ${DISPLAY} 返回 :0 作为我的账户和 GUI 程序当然在我登录时正常工作。那么,以 tomcat6 用户身份尝试打开 GUI 程序意味着什么? - user782220
@user782220,您能否尝试使用 sudo -E 启动它?另外,您可以尝试传递一个 XAUTHORITY 环境变量。我会扩展我的答案。 - vsminkov
我刚刚尝试了 sudo -E -u tomcat6 jvisualvm,在将多个文件的权限更改为可读后,一切正常。 - user782220

2
我曾试图做类似的事情,但服务器不允许安装JVisualVM。让JVisualVM连接远程机器似乎从未正常工作过。我怀疑防火墙规则阻止了部分网络连接。我发现唯一的远程分析服务器的方法是通过ssh隧道。
1. 在服务器上设置JMX端口的CATALINA_OPTS: ``` CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=13333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false; export CATALINA_OPTS ```
2. 在您的桌面机器上打开到服务器的ssh连接: ``` ssh -D 61444 username@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隧道传输网络流量。
祝你好运!

2

最简单的方法是在Tomcat上打开远程JMX端口,以便能够从您的桌面电脑远程连接到您的服务器上的远程Tomcat,并使用jvisualvm进行调试。

您需要将以下系统属性传递给您的JVM:

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

请先在您的本地计算机上打开JVM版本相同或更新的jvisualvm。然后,选择“文件”->“添加远程主机”->输入主机名。这将创建一个该主机的条目。右键单击该条目->“添加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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接