監控您的 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 --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

您的本機電腦必須能夠參考您指定的主機名稱(可能需要主機項目)

addjmxhost

如果您使用 Docker,則為 JMX 主機指定的連接埠需要符合系統屬性和公開的連接埠

jmxport

接下來,開啟新的遠端 JMX 處理程序

jmxinstance

執行階段資訊

連線到執行中的 Metabase 與 VisualVM 會使大量執行階段資訊可用。以下是一些重點

堆積傾印

當遇到與記憶體相關的問題時,通常要問的第一個問題是:是什麼消耗了額外的記憶體?堆積傾印將在特定時間點擷取記憶體中所有內容的快照。該記憶體快照稍後可以由 Eclipse Memory Analyzer Tool 之類的工具進行分析。從「監控」標籤建立堆積傾印

heapdump

執行緒傾印

正在執行的 Metabase 系統的另一個有用的圖片是執行緒傾印。在 Metabase 似乎停滯或極度緩慢的情況下,執行緒傾印將指示每個執行緒在特定時間點正在執行(或封鎖)的內容。透過「執行緒」標籤收集執行緒傾印

threaddump

延伸閱讀

閱讀其他 Metabase 版本的文件。