运行Metabase

Metabase在Java虚拟机(JVM)上运行,并且根据其配置,它可能会使用服务器的文件系统来存储一些信息。因此,JVM或文件系统的问题可能会阻止Metabase运行。

Java版本

确保您正在使用11或更高版本的Java。

Metabase内存使用情况

Metabase 以 JAR 文件形式提供,在 Java 虚拟机(JVM)上运行。

区分 Metabase 的内存使用量和 JVM 的内存使用量非常重要。

JVM 将消耗一定量的内存。默认情况下,JVM 将使用大约机器 RAM 的四分之一(尽管您可以更改 JVM 应使用的 RAM 量)。

JVM 应用程序(如 Metabase)将消耗和释放分配给 JVM 的 RAM。然而,JVM 不会将未使用的 RAM 释放给机器;JVM 的内存使用量将保持不变。

因此,在拥有 8 GB RAM 的机器上,默认情况下 JVM 将使用 2 GB RAM。Metabase 将根据其活动使用这些 2 GB JVM 分配的 RAM 中的一些或全部。但从机器的角度来看,JVM 将始终使用分配的 2 GB RAM,即使 Metabase 只使用了分配 RAM 的一小部分。

诊断内存问题

根据上述 JVM 处理内存的解释,如果您遇到 Metabase 的性能问题,您认为这不是由于您的数据仓库导致的,您需要检查以下这些红旗

Metabase 由于 Java 堆空间不足而崩溃 OutOfMemoryError

通常情况下,JVM 可以确定系统上可用的 RAM 量,并自动设置堆内存使用的合理上限。然而,在特定的共享托管环境中,这并不总是按预期工作。这种错误的典型症状是类似的消息

java.lang.OutOfMemoryError: Java heap space

如果您看到这种“内存不足” (OOM) 错误,您需要为 JVM 分配更多内存

当以折线图查看内存使用量随时间的变化时,您会看到锯齿形图案

您可以使用工具查看 Metabase 随时间使用其可用内存的方式。请查看

您需要检查的特定 Prometheus 指标是 jvm_memory_bytes_used{area="heap"}

一个值得关注的红旗:锯齿形图案。Metabase 会迅速消耗大量内存,这将触发垃圾回收,释放内存,然后 Metabase 又迅速消耗这些内存。这种内存使用的上下上下上下模式是频繁垃圾回收周期的标志。垃圾回收将占用 CPU 周期,这可能会减慢您的应用程序。

如果您看到这种情况,您需要增加分配给 JVM 的内存量

为 JVM 分配更多内存

您可以通过设置 JVM 选项为 JVM 的堆分配更多内存。例如,您的 Java 运行时可能使用 -X 标志来完成此操作

java -Xmx2g -jar metabase.jar

向上调整内存分配,直到 Metabase 似乎满意,但请确保将此数字低于机器上可用的总 RAM 量,因为 Metabase 不会是唯一的进程。为机器上的其他进程留出 1 到 2 GB 的 RAM 通常足够,因此您可以在 2 GB RAM 的机器上将 -Xmx 设置为 1g,在 4 GB RAM 的机器上设置为 2g,依此类推。您可能需要尝试这些设置以找到使 Metabase 和其他一切协同工作的设置(并且这种实验可能需要升级到具有更多内存的机器)。

您还可以使用环境变量 JAVA_OPTS 来设置 JVM 参数,而不是直接传递给 java。当运行 Docker 镜像时,这特别有用

docker run -d -p 3000:3000 -e "JAVA_OPTS=-Xmx2g" metabase/metabase

诊断导致 OutOfMemoryError 的内存问题

如果Metabase实例在耗尽内存之前启动并运行了很长时间,可能存在特定事件,例如大型查询,触发了OutOfMemoryError。诊断内存使用情况的一种方法是在触发OutOfMemoryError时启用堆转储。要启用此功能,您需要向java调用添加两个标志。

java -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/a/directory -jar metabase-jar

-XX:HeapDumpPath标志指定了放置转储的位置——当前目录是默认值。当发生OutOfMemoryError时,JVM将在指定的目录中转储一个hprof文件。这些hprof文件可能很大(与-Xmx参数的大小相同),所以请确保您的磁盘有足够的空间。这些hprof文件可以用许多不同的工具读取,例如jhat(包含在JDK中)或Eclipse内存分析工具

Metabase无法读取或写入文件或文件夹(IOError)

如果您看到有关文件权限的错误,例如Metabase无法读取SQLite数据库或自定义GeoJSON地图文件,请查看我们的Docker故障排除指南中的“Metabase无法从文件或目录中读取”部分。

警告:sun.reflect.Reflection.getCallerClass不受支持

不用担心。

WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.

如果您看到上述错误,请忽略它。您的Metabase完全健康,并且按预期运行。

阅读其他Metabase版本的文档。

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