使用 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
应用程序。
传递DISPLAY
和XAUTHORITY
环境变量的最简单方法是使用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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章