Minecraft Server の JVM をモニタリングする

目的

Minecraft が高負荷になる場合に FullGC が発生したかなどの JVM 側の負荷なのか 単純に Minecraft 自体での処理が重いのかなどの切り分けを行うためにモニタリングしたい。

方法

自分のサーバは基本的に prometheus によるモニタリングを行っているので Minecraft のサーバ自体のモニタリングが行えるとよい。

GitHub - prometheus/jmx_exporter: A process for exposing JMX Beans via HTTP for Prometheus consumption

手順

前提

  • Minecraft が運用されている
  • Prometheus が運用されている
  • Grafana が運用されている

JMX のメトリクスを取得できるようにする

jmx_exporter によるメトリクスの取得を行うための javaagent の jar を落とす。

$ curl -OLJ https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar

jmx_exporter 用の config ファイルを用意。今回は簡単のため空ファイルを作成。

$ touch config.yaml

javaagent のオプションを指定して起動。jmx_exporter の jar ファイルはパス指定でも良さそうだが config.yaml がうまく動かなかったので場所を変えたい場合は要確認。下記は 8080 ポートで開く例。(実運用では jmx_exporter で 8080 はあまり使わない)

java -jar -javaagent:.jmx_prometheus_javaagent-0.3.1.jar=8080:config.yaml  -jar minecraft_server.jar nogui

Prometheus で メトリクスを取得するようにする

簡単な例。正確な記述は割愛。

  - job_name: jmx
    static_configs:
    - targets: ['xxx.xxx.xxx.xxx:port']

グラフの用意

最近の Grafana では公式のページにある程度設定されたダッシュボードがあり、これを import することによってだいたいそのまま使うことができる様子。

https://grafana.com/dashboards/3457

下記のような表示になる。GC カウントも見られ、FullGC が多いかどうかを確認でき、メモリバウンドなのかなどの確認がしやすくなる。

f:id:nise_nabe:20180830225535p:plain

結果

自分のサーバでは特に FullGC が発生してはいなかった。 原因としてログインしているユーザによる牧場で牛や豚が大量にいたことが原因のようだった。

その他

prometheus で minecraft 特有のメトリクスを取得も可能な様子。

https://github.com/sladkoff/minecraft-prometheus-exporter

この exporter は spigot という minecraft server に MOD が導入できる(api 利用が可能になる)ものを利用することによって可能な様子。自分はバニラサーバで動かしているので一旦導入は保留。