使用 VisualVM 分析 tomcat 个应用程序

Profiling tomcat application with VisualVM

我正在尝试 运行 用户名 tomcat6 下的 visualvm,因为显然 visualvm 只能在其用户名下找到应用程序 运行ning。所以默认情况下,它只会在我的用户名下查找应用程序 运行ning。我已经能够通过 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.access0(X11GraphicsEnvironment.java:65)
    at sun.awt.X11GraphicsEnvironment.run(X11GraphicsEnvironment.java:115)
...

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

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

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

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

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

实际上有很多替代方案,例如 yourkit or jprofiler 附带 java 允许远程检测分析的代理。

最简单的方法是在 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版本需要相同或更新),File -> Add Remote Host -> 输入Host上的名字。它将为此主机创建一个条目。右键单击此条目 -> 添加 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; 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 传输网络流量。

    祝你好运。

如果运行安装您的应用程序的计算机是远程的(如服务器),那么您无法运行 GUI 应用程序而不做一些工作。启用对 VisualVM.

的远程访问可能会更容易

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

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

  1. 启用远程 JMX。原来,there's a guide for that.

  2. 修复用于 RMI 的 "wandering port"。还有一个guide for that

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

  4. 重新启动 JVM 并连接 JVisualVM。