RAM ワールド

ワールドを RAM に置いてディスク I/O でサーバーが遅くならないようにする。バックグラウンドの同期とクラッシュからの復旧つき。

Minecraft は、チャンクを読み込む・生成する・変更するたびにリージョンファイルを読み書きしています。混み合ったサーバーや 遅いディスクでは、この I/O がボトルネックになります。RAM ワールドを使うと、Storia は起動時にワールドを RAM にコピーし、 そこで動きます。ディスクに触れるのは、変更されたファイルを一定間隔で書き込むバックグラウンドのスレッドだけです。

仕組み#

  1. 起動時。 ram-directory(初期値 /dev/shm/storia)に、ワールドフォルダ全体と min-free-mb が収まるかを確認します。 収まればワールドをそこへコピーし、RAM から読み込みます。収まらなければエラーをログに出し、Paper と同じくディスクから読み込みます。
  2. 動作中。 sync-interval-seconds(初期値 300)ごとに、前回の同期から変わったファイルをディスクにコピーします。 ファイルはいったん一時ファイルに書いてから元のファイルと置き換えるので、ディスク上のワールドが書きかけの状態になることはありません。
  3. 停止時。 stop でいつもどおり保存したあと、すべてをディスクに書き込みます。delete-on-shutdown: true なら、 そのあと RAM 上のコピーを消します。
  4. サーバーのプロセスが落ちたとき。 マシンの電源が入っている限り、RAM 上のコピーは /dev/shm に残ります。次の起動時に Storia がそれを見つけ(目印のファイルに PID を記録しています)、ほかの処理より先にディスクへ同期します。

対象は、ワールドフォルダ(server.properties の level-name。Minecraft 26.2 ではすべてのディメンションがこの中にあります)と、 level.dat がある古い形式の <level-name>_* フォルダです。

停電に注意

マシン自体 の電源が落ちたり OS がクラッシュしたりすると、RAM の内容は消えます。最後の同期以降の変更は失われます。 ディスクの負荷よりこちらが気になる場合は sync-interval-seconds を短くし、危ないメンテナンスの前には /storia sync を実行し、 いつもどおり定期的にバックアップを取ってください。

必要な RAM の量#

/dev/shm の空きとして、ワールドフォルダ以上の容量 + min-free-mb。これに加えて、Java のヒープ(-Xmx)と OS の分が必要です。 次のコマンドで確認できます。

du -sh world
df -h /dev/shm

多くの Linux では、/dev/shm は物理メモリの半分まで使えます。増やすには再マウントします。

sudo mount -o remount,size=24G /dev/shm

再起動後もこのサイズにするには、/etc/fstab に 1 行追加します。

tmpfs /dev/shm tmpfs defaults,size=24G 0 0

Windows と macOS#

/dev/shm は Linux にしかありません。ほかの OS では、自分で作った RAM ディスク(Windows なら ImDisk など)を ram-directory に指定するか、ram-world.enabled: false にしてください。

コマンド#

コマンド 説明
/storia status RAM 上のコピーの場所、RAM 使用量、最後に同期した時刻。
/storia sync 今すぐ変更をディスクに書き込みます(バックグラウンド)。

バックアップ#

バックアップは ディスク上 のコピーから取ります。ディスク上のワールドは、常に最後の同期時点の完全で矛盾のない状態です。 最新の状態を残したいときは、先に /storia sync を実行し、Synced ... file(s) と表示されるのを待ってください。

オフにする#

ram-world:
  enabled: false

サーバーを再起動します。正常に停止していればディスク上のコピーは最新なので、ほかに作業は要りません。