监控您的Metabase

诊断与性能相关的问题可能是一项挑战。幸运的是,JVM自带了一些工具,可以帮助诊断许多常见问题。启用JMX并使用VisualVM等工具可以帮助诊断内存不足、Metabase停滞或响应时间缓慢等问题。

本指南假设您已在本地上安装了VisualVM工具。VisualVM包含在OpenJDK和Oracle JDK中。您可以在JDK安装目录的bin目录中找到VisualJVM。某些Linux发行版将VisualVM与JDK分开,在这种情况下,它是一个单独的visualvm包。

连接到本地Metabase

如果您已在Metabase服务器上安装了VisualVM并且能够在那里运行VisualVM,那么这是最简单的方法,因为不需要设置与Metabase实例的远程通信。在这种情况下,像平常一样启动Metabase,然后单独启动VisualVM。

localprocess

连接到远程Metabase

监控远程Metabase实例(或运行在Docker容器中的本地实例)可能更为常见,但需要更多的设置。首先,我们需要指定一些系统属性,让JVM知道我们希望允许远程监控。假设我们使用java -jar metabase.jar运行Metabase,我们需要将调用更改为以下命令,该命令包括属性

java --add-to-start=jmx,jmx-remote \
     -Dcom.sun.management.jmxremote \
     -Dcom.sun.management.jmxremote.port=1099 \
     -Dcom.sun.management.jmxremote.rmi.port=1099 \
     -Dcom.sun.management.jmxremote.authenticate=false \
     -Dcom.sun.management.jmxremote.ssl=false \
     -Dcom.sun.management.jmxremote.local.only=false \
     -Djava.rmi.server.hostname=<Metabase Hostname> \
     -jar metabase.jar

端口号1099是典型的RMI/JMX端口号,但它可以是任何可访问的端口号。

上述命令使您的应用程序对任何人都可以进行监控,应仅在有信任网络的情况下短时间使用。保护此连接是可能的,请参阅Oracle文档

如果您在docker容器中运行Metabase,您需要指定上述系统属性,并确保端口已打开。Docker允许通过单独的文件指定环境变量,该文件可以传递给docker run调用。您可以创建一个名为metabase-vars.env的文件,并指定JAVA_OPTS

JAVA_OPTS=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=<Metabase Hostname>

此文件期望每个环境变量都在其单独的一行上,没有换行符

docker run --env-file=metabase-vars.env -d -p 3000:3000 -p 1099:1099 -h <Metabase Hostname> --name metabase metabase/metabase

添加-p 1099:1099将JMX端口用于监控,--env-file=metabase-vars.env将传递额外的JMX相关环境变量。实例启动后,VisualVM需要知道如何连接到正在运行的实例。首先添加一个新的远程实例

addremotehost

然后使用您上面指定的主机名

sethostname

您的本地机器必须能够引用您指定的主机名(可能需要hosts条目)

addjmxhost

如果您使用Docker,JMX主机指定的端口号需要与系统属性和公开的端口号匹配

jmxport

接下来打开新的远程JMX进程

jmxinstance

运行时信息

使用VisualVM连接到正在运行的Metabase可以提供许多运行时信息。以下是一些亮点

堆转储

当遇到内存相关问题时,通常首先需要问的问题是:什么在消耗额外的内存?堆转储将捕捉到特定时间点内存中的所有内容。该内存快照可以在稍后由Eclipse Memory Analyzer Tool等工具进行分析。通过“监控”选项卡创建堆转储

heapdump

线程转储

另一个有用的Metabase系统视图是线程转储。当Metabase看起来停滞或极慢时,线程转储将指示每个线程在特定时间点正在执行(或阻塞)什么。通过“线程”选项卡收集线程转储

threaddump

进一步阅读

阅读有关其他Metabase版本的文档。

想要改进这些文档吗? 提出更改。