JavaVMチューニング

ども、uniunixでっす。

今回はマインクラフトのJavaVMチューニングの難しいお話なんで、分からない人関係ない人はこのページをそっ閉じでよろしこ(笑)

ネオユニsurvivalサーバのパフォーマンスを上げようとしてサーバサイドのJavaVMのチューニングやってるけど、深入りすると色々忘れるわ間違えるわで頭おかしくなってきたんで、記録しようかと。

間違ってたり改善できそうなポイントあれば誰かコメントで教えて!(切実

前提

まずネオユニsurvivalサーバの前提は次の通り。

・CentOS7
openjdk version “13.0.1”
・spigot利用
・BungeeCord利用

あんまり詳細に書きすぎると攻撃対象にされるのでまぁこんなもんでいいかと。
あと、「なんでopenjdk13使ってんのぉ?んおぉ?」と思う方もいるかもしれないが、運用してる俺自身もなんでこのバージョンなのかはわからんw

ただ、G1GCのGC改善が良きとのことだったので興味本位に導入しました、てへ♪←

ということで、このページで説明するJVMオプションはバージョンが13基準なんで、12以下、14以上のバージョンで動作するかどうかは知らん。
8では使えなかったと思ふ。

現在のオプション指定は次の通り。

java -server -Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:G1NewSizePercent=20 -XX:G1MaxNewSizePercent=60 -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:+UseCompressedOops -XX:CompressedClassSpaceSize=512M -XX:G1HeapRegionSize=32M -XX:ParallelGCThreads=6 -XX:ConcGCThreads=2 -Xlog:gc*=info:file=/micrabk/log/gc_%t.log:time,uptime,level,tags:filecount=30,filesize=50M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump/ -jar spigot-1.15.1.jar nogui


それでは各オプション詳細メモ。

基本オプション

-Xmx8G
Javaヒープの最大値。
例は8GB。
-Xms8G
Javaヒープの初期値と最小値。
例は8GB。
-Xmx8Gを指定してるので実質Javaヒープは8GB固定。
+UnlockExperimentalVMOptions
試験的なVMフラグのロック解除。
この指定がないと試験JVMオプションを指定しても使用不可。

G1GCオプション

-XX:+UseG1GC
明示的にG1GCを使うことを指定。
-XX:MaxGCPauseMillis=50
停止期間の目標値。
例は50ms。
デフォルトは200ms。
-XX:G1NewSizePercent=60
若い世代の最小サイズとして使用するヒープサイズの割合。
例は60%。
デフォルトは5%。
-XX:G1MaxNewSizePercent=60
若い世代の最大サイズとして使用するヒープサイズの割合。
例は60%。
デフォルトは60%。
-XX:ParallelGCThreads=6
アプリケーションスレッドが停止するフェーズで使われるGCのスレッド数。
例は6。
デフォルトは論理CPU数(=論理コア数)。
最大値は8。
9以上の場合は
(8+(論理CPU数−8)×(5÷8))
で計算される。
-XX:ConcGCThreads=4
Concurrent Marking の処理を並列実行するスレッド数。
例は4。
デフォルトは
( ParallelGCThreads +2)/4。
小数点以下は切り捨て。
最低値は1。
ParallelGCThreads を超える値は設定不可。
-XX:G1HeapRegionSize=32M
G1リージョンのサイズ。
最小Javaヒープ・サイズを基にリージョンが約2048個になるように2の累乗で1MBから32MBの範囲で指定するが、マイクラでは最大の32MBで固定する。

その他オプション

-XX:MetaspaceSize=512M
Metaspace領域に起因するFullGCの基準値。
例は512MB。
-XX:MaxMetaspaceSize=512M
Metaspace領域に起因するFullGCの最大値。
例は512MB。
-XX:MetaspaceSize=512M の設定より、実質512MBに固定される。
-XX:+UseCompressedOops
圧縮オブジェクトポインター機能を有効。
+を-にすると無効。
Javaオブジェクトのサイズを圧縮し、JavaVM実行時のJavaヒープ領域、Explicitヒープ領域の使用サイズを減らす。
-XX:CompressedClassSpaceSize=512M
Compressed Class Spaceの最大値。
【Compressed Class Space】
-XX:+UseCompressedOopsを指定している場合、Metaspace領域内に作成される領域。
Javaヒープ内のオブジェクトから参照されるクラス情報が配置される。
Compressed Class Space以外のMetaspace領域では、それ以外のメソッド情報等が配置される。
-Xlog:gc*=info:file=/aaa/bbb/ccc_%t.log:time,uptime,level,tags:filecount=30,filesize=50M
ログの出力設定。
openjdkの公式サイトを参照した。

例の場合、
出力先:/aaa/bbb/ccc
出力内容:time(ISO-8601準拠の現在日時)、uptime(JVMを開始してからの時間)、level(ログメッセージのレベル)、tags(ログメッセージに関するタグセット)
出力ファイル数:30
出力ファイルサイズ:50MB

-XX:+HeapDumpOnOutOfMemoryError
OufOfMemoryError時のヒープダンプ自動出力を有効。
+を-にすると無効。
-XX:HeapDumpPath=/aaa/bbb/ddd
OufOfMemoryError時のヒープダンプファイルの出力先。
例での出力先:/aaa/bbb/ddd

最後に

これで自分自身今後忘れてもここで確認すれば思い出すやろう。。。

ちなみにuniunixのマイクラプレイヤーサイドのJVMオプション設定は次の通り。

-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M

まぁここら辺はそんなに気にしなくても良いかも。
PCにメモリを24GB積んでるんで、-Xmx8G -Xms8Gの部分は -Xmx16G -Xms16Gでも良いんかもしれん。


コメント

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