使用 VisualVM 分析 tomcat 应用程序

Posted

技术标签:

【中文标题】使用 VisualVM 分析 tomcat 应用程序【英文标题】:Profiling tomcat application with VisualVM 【发布时间】:2016-08-18 23:08:45 【问题描述】:

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

【问题讨论】:

***.com/questions/24153416/… 【参考方案1】:

不幸的是,远程模式下只能进行采样,因此JMX 将缺少检测工具。

实际上您在tomcat6 用户下运行visualvm 的方法是正确的。你应该看看这个question 如何在 sudo 下运行X11 应用程序。

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

此外,如果您在tomcat6 用户下看不到您的进程,您应该检查CATALINA_TMPDIR 是否指向/tmp。否则你应该把它传递给visualvm

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

实际上,Java 代理提供了很多替代方案,例如 yourkit 或 jprofiler,它们允许远程检测分析。

【讨论】:

echo $DISPLAY return :0 作为我的帐户和 gui 程序当然可以正常工作以我的身份登录。那么这对于尝试以 tomcat6 用户身份打开 gui 程序意味着什么。 @user782220 你能尝试用sudo -E 启动它吗?您也可以尝试传递 XAUTHORITY 环境变量。我会扩展我的答案。 我刚刚尝试了sudo -E -u tomcat6 jvisualvm,在必须对一堆东西进行 chmod 以保持各种文件的可读性之后,一切正常。【参考方案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版本需要相同或更新),文件->添加远程主机->在主机上输入名称。它将为此主机创建一个条目。右键这个Entry->添加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

【讨论】:

【参考方案3】:

我尝试做类似的事情,但不允许在服务器上安装 JVisualVM。让 JVisualVM 连接到远程机器似乎永远无法正常工作。我怀疑防火墙规则阻止了部分网络连接。 我发现远程分析服务器的唯一方法是通过 ssh 隧道。

    在服务器上的 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

    在您的桌面计算机上打开与服务器的 ssh 连接

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

    向 JVisualVM 添加一个标志,以便它代理其网络连接

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

    让 JVisualVM 连接到 jmxport,网络流量通过 ssh 进行隧道传输。

    祝你好运。

【讨论】:

【参考方案4】:

如果运行您的应用程序的计算机是远程的(例如服务器),那么您将无法在没有工作的情况下运行 GUI 应用程序。启用对VisualVM 的远程访问可能会更容易。

您可以使用两种技术附加到远程 JVM:使用 jstatd 或使用 JMX。我不确定您认为使用 JMX 会失去什么,但显然 jstatd 不允许您访问分析工具、CPU 监视器等)。

您需要配置 JVM 和 Tomcat 以允许远程访问。这需要 3 个步骤:

    启用远程 JMX。结果是there's a guide for that。

    修复用于 RMI 的“流浪端口”。还有一个guide for that。

    (可选)安排对服务器的安全远程访问。最简单的方法是使用ssh -Lport:localhost:port 和一系列-L 参数将多个端口从您的工作站转发到您的服务器。映射您在步骤#1 和#2 中必须配置的所有端口。如果您不这样做,则需要对上述所有端口进行非防火墙访问。

    重新启动 JVM 并连接 JVisualVM。

【讨论】:

终于找到了一个可行的解决方案!这应该是公认的答案。

以上是关于使用 VisualVM 分析 tomcat 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 visualvm 分析 Tomcat Web 应用程序

当我打开visualvm分析器时tomcat关闭

如何在 STS 中使用 VisualVM 分析器?

了解 visualvm 分析器中的 CPU 时间

使用 VisualVM 监控 Java 应用程序

使用 VisualVM 和 SSH 远程监控 Tomcat 7 服务器