【papermc用】の ガベージコレクション 比較してみた

MinecraftServer

Minecraft Server用として使うガベージコレクションを4種類まとめて見たので、

どれが一番よかったか、どの環境に適していそうかを書き出していきます!

検証環境

server スペック

vCPU4コア(intel core i5-11400)

RAM10GB(ddr4 3200)

nvme ssd(gen4×4)

minecraft server

Paper 1.21.4-147-main@3bd69f2 (2025-02-10T22:59:40Z) for Minecraft 1.21.4

OpenJDK 64-Bit Server VM 21.0.3+9-LTS

paper付属のspark以外の追加pluginはありません。

負荷のかけ方

村人のAIが重いことを利用してベンチマーク?みたいなものをしたので誤差はありますが、

実際のentityなので入る人数に意外と直結するかも?です!

判断基準

判断スーパーフラットに村人を1200体入れた同じワールドでsparkを使用し、

起動から5分間前後モニタリングした時のデータで判断しています。

村人以外スポーンせず、

村人は圧死するギリギリの数に合わせて密度を最大まで高くして負荷を最大限高めています。

判断材料に使う項目は

  • MSPT(med)
  • MSPT(95%ile)
  • TPS
  • Memory(process)
  • net.minecraft.server.MinecraftServer.waitUntilNextTick()

この項目を主にみていきます。

MSPT(MAX)は基本的にサーバー起動時の数値なので当てにならないので今回は考えないこととします

これらの項目の説明は以下のグラフを参照してください

/説明
MSPT(med)MSPTの中央値
MSPT(95%ile)MSPTの上位5%を除いた値全体の平均
TPSサーバーが一秒間に計算したtick数
Memory(process)-Xms5G -Xmx5Gで割り当てたメモリーからどれだけ使っているか
net.minecraft.server.MinecraftServer.waitUntilNextTick()Minecraft サーバーから認識したCPUの空き率

ベンチマークの結果

実際のCPU RAM SSDの性能に左右される部分もあるので、

実際に検証した起動引数も載せておきます

デフォルトとなる起動引数

ひとまず基準となる起動引数を載せておきます

java -Xms5G -Xmx5G -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar server.jar --nogui

基準の引数でのsparkの結果

/実測値
CPU使用率(15m)(%)19.33
MSPT(med)34.1
MSPT(95%ile)48.5
TPS-1m/5m/15m20/20/20
Memory(process)GB1.9
net.minecraft.server.MinecraftServer.waitUntilNextTick()(%)21.72

何もせずにこれだけ耐えれるのなら意外と優秀かも?

ただしCPU使用率(waitUntilNextTick)が高めなので人は入らなさそう。

UseG1GC

特徴:

  • レイテンシーはそこまで良くない
  • tick timeはとても安定してる
  • 設定が大まかなならこれが一択 詰めた設定するなら次のUseParallelGCがお勧め
  • シングルコアは気にしなくても安定する
java -Xms5G -Xmx5G -XX:+UseG1GC -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=16 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs/ -Daikars.new.flags=true -jar server.jar --nogui

基準の引数でのsparkの結果

/実測値
CPU使用率(15m)(%)15.45
MSPT(med)26
MSPT(95%ile)41.3
TPS-1m/5m/15m20/20/20
Memory(process)GB2
net.minecraft.server.MinecraftServer.waitUntilNextTick()(%)36.91

デフォルトよりも結果がよくなった!

waitUntilNextTickも落ち着いてし無難なのがG1だと思う。

UseParallelGC

特徴:

  • レイテンシーはそこそこ
  • tick timeは並列をし始めるとムラが発生するので1-2スレッド指定が一番安定した
  • 設定を詰めたらこれが一番よさそう
  • シングルコアはそこそこいる
java -Xms5G -Xmx5G -XX:+UseParallelGC -XX:ParallelGCThreads=1 -XX:+ParallelRefProcEnabled -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=3 -XX:SurvivorRatio=18 -jar server.jar --nogui

基準の引数でのsparkの結果

/実測値
CPU使用率(15m)(%)15.17
MSPT(med)25.6
MSPT(95%ile)38.7
TPS-1m/5m/15m20/20/20
Memory(process)GB1.1
net.minecraft.server.MinecraftServer.waitUntilNextTick()(%)37.28

waitUntilNextTickの空きがとてもあるしMSPTも低い

メモリーの使用率も低いからとても良い

シングルスレッドの強いサーバ(コンシューマー向けCPUなど)でサバ運営の場合は一番お勧めできる

UseZGC

特徴:

  • 並列処理が得意っぽい
  • ただしtick timeムラが発生しやすい
  • 並列処理をしないとまともに動かない
  • ムラが若干あったけど鯖の起動が一番早かった
  • シングルコアは弱くてもある程度動く
java -Xms5G -Xmx5G -XX:+UseZGC -XX:+ParallelRefProcEnabled -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:ZUncommitDelay=300 -XX:ZAllocationSpikeTolerance=5 -XX:ConcGCThreads=3 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs/ -Daikars.new.flags=true -jar server.jar --nogui

基準の引数でのsparkの結果

/実測値
CPU使用率(15m)(%)17.85
MSPT(med)32.6
MSPT(95%ile)43.6
TPS-1m/5m/15m20/20/20
Memory(process)GB1.9
net.minecraft.server.MinecraftServer.waitUntilNextTick()(%)24.52

CPU使用率のばらつきが少ない、

比較的にCPUが弱くても動きそう…

一般的なレンタルサーバなどのCPUクロックが低めでコア数が多いサーバーならありかも。

その他ならUseParallelGC使って見てほしい!

環境ごとのおすすめ

データがそろったのでまとめに入りたいと思います

おすすめ度メリットデメリット
指定なし1/5設定が簡単動作が重い
UseG1GC2/5スペックに左右されずに動作する印象設定をちゃんとしないと軽くならない
UseParallelGC5/5とても軽量シングルコア性能が高くないと軽量化できなさそう
UseZGC2/5GCをマルチスレッド化して動かせるからCPU弱い場合に使いたい若干不安定になる気がする?

papermcはシングルスレッド動作なので、

シングルコア性能が高いサーバーを借りたら幸せになれます!

最後に

一回自分の環境ですべて試してみて

自分が好きなガベージコレクションを選んで設定を確認してみてください!

コメント

タイトルとURLをコピーしました