监控你的 Metabase
诊断与性能相关的问题可能是一项挑战。幸运的是,JVM 提供了可以帮助诊断许多常见问题的工具。启用 JMX 并使用 VisualVM 等工具可以帮助诊断与内存不足、Metabase 停滞或响应缓慢相关的问题。
本指南假定您已在本地安装了 VisualVM 工具。VisualVM 包含在 OpenJDK 和 Oracle JDK 中。您可以在 JDK 安装的 `bin` 目录中找到 VisualJVM。一些 Linux 发行版会将 VisualVM 与 JDK 分开,在这种情况下,它是一个独立的 `visualvm` 包。
连接到本地 Metabase
如果您在 Metabase 服务器上安装了 VisualVM 并且可以在那里运行 VisualVM,那么这是最简单的方法,因为无需设置与 Metabase 实例的远程通信。在这种情况下,像往常一样启动 Metabase,然后单独启动 VisualVM。

连接到远程 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 需要知道如何连接到正在运行的实例。首先添加一个新的远程实例

然后使用上面指定的 hostname

您的本地机器必须能够解析您指定的 hostname(可能需要 hosts 条目)

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

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

运行时信息
使用 VisualVM 连接到正在运行的 Metabase 会提供大量运行时信息。以下是一些亮点
堆转储
在遇到内存相关问题时,通常要问的第一个问题是:是什么占用了额外的内存?堆转储将获取当时内存中所有内容的快照。该内存快照可以稍后由 Eclipse Memory Analyzer Tool 等工具进行分析。从“Monitor”选项卡创建堆转储

线程转储
另一个有用的 Metabase 运行系统快照是线程转储。在 Metabase 出现停滞或缓慢的情况下,线程转储将指示每个线程在特定时间点正在执行(或被阻塞)的内容。通过“Threads”选项卡收集线程转储

延伸阅读
阅读其他版本的 Metabase 的文档。