运行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版本的文档。