Aikar's flags、12GBで5つの設定が変更。そのうち1つは減少
4GBのフラグ設定を16GBサーバーにコピーすると、5つの値が間違ったままになります。どの5つが間違っているのか、そしてMod入りサーバーとバニラサーバーが境界線を越えるプレイヤー数を正確に解説します。
Aikar's flagsは、Paperサーバー用のコミュニティ標準のJVM引数であり、通常は一つのブロックとしてコピーされます。しかし、実際には一つのブロックではありません。20個の引数のうち、5つはヒープが12GB未満か12GB以上かによって変更されます。小規模ヒープ用の設定を大規模ヒープサーバーに貼り付けることは、「推奨フラグ」を実行しているつもりで、実際にはそうではないという最も一般的な間違いです。
変更される5つの設定
| フラグ | 12GB未満 | 12GB以上 |
|---|---|---|
-XX:G1NewSizePercent | 30 | 40 |
-XX:G1MaxNewSizePercent | 40 | 50 |
-XX:G1HeapRegionSize | 8M | 16M |
-XX:G1ReservePercent | 20 | 15 |
-XX:InitiatingHeapOccupancyPercent | 15 | 20 |
G1ReservePercentは減少する唯一のフラグです。 5つのうち4つはヒープサイズとともに増加しますが、この1つだけは減少します。そのため、「大規模サーバーのために数値を上げる」という中途半端な記憶が、最適ではないどころか間違った設定を生み出してしまいます。これは、エバキュエーション(evacuation)の失敗に備えてヒープの一部を予約するもので、ヒープが大きくなると、同じ絶対的な余裕を確保するために必要な割合は小さくなります。
残りの13個の-XX:引数は、すべてのヒープサイズで同じです。-XX:+UseG1GC、-XX:MaxGCPauseMillis=200、-XX:+AlwaysPreTouch、-XX:SurvivorRatio=32、-XX:MaxTenuringThreshold=1などは変更されません。-Xmsと-Xmxだけがヒープサイズ自体を追跡します。
12GBの境界線が実際にどこにあるか
このページのジェネレーターは、プレイヤー数からヒープサイズを算出します。
GB = clamp( ceil( (modded ? 2.5 : 1) × (2 + players / 12) ), 2, 32 )
Mod入りサーバーはバニラサーバーの2.5倍の予算が割り当てられており、この係数によって、大規模ヒープの分岐に到達するサーバーが決まります。
| プレイヤー数 | バニラ | Mod入り |
|---|---|---|
| 10 | 3 GB | 8 GB |
| 20 | 4 GB | 10 GB |
| 29 | 5 GB | 12 GB ← Mod入りがここで境界を越える |
| 50 | 7 GB | 16 GB |
| 100 | 11 GB | 26 GB |
| 109 | 12 GB ← バニラがここで境界を越える | 28 GB |
Mod入りサーバーは29人のプレイヤーで大規模ヒープフラグに到達します。バニラサーバーは109人まで到達しません。したがって、ほとんどのバニラPaperサーバーを運用している人にとっては、小規模ヒープ設定が常に正しいものとなります。一方、Mod入りサーバーを運用しているほとんどの人にとっては、予想よりもはるかに早く小規模ヒープ設定が正しくなくなります。
この計算式における2つの重要な制限
32GBを超える推奨はされません。 バニラサーバーは349人のプレイヤーで上限に達し、それ以上は増えません。これは丸め誤差ではありません。およそ32GBを超えると、JVMは圧縮オブジェクトポインタ(compressed object pointers)を失い、ヒープ内のすべての参照が大きくなるため、RAMが増えても使用可能なヒープは減少する可能性があります。この点を超えてスケールアップするには、より大きなサーバーではなく、2台目のサーバーを導入するべきです。
1人のプレイヤーであっても、2GB未満を推奨することはありません。 これは、サーバーソフトウェアが人口よりも優先されるためです。
そして、計算式が何を示していようと、JVMにサーバーが持つすべてのリソースを与えてはいけません。 -Xmsと-Xmxは意図的に同じ値に設定されています。これは、負荷がかかってもJVMがヒープサイズを変更しないようにするためです。つまり、選択した数値は即座に永続的に確保されます。オペレーティングシステムがあなたと競合することなく利用できるよう、1〜2GBのRAMを残しておきましょう。