监控您的 Metabase

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

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

连接到本地 Metabase

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

localprocess

连接到远程 Metabase

监控远程 Metabase 实例(或在 Docker 容器中运行的本地实例)可能更常见,但这需要更多设置。首先,我们需要指定一些系统属性,让 JVM 知道我们想要允许远程监控。假设我们使用 java --add-opens java.base/java.nio=ALL-UNNAMED -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 版本 的文档。