KeepWorlds

パルワールド サーバーのメモリリーク:重くなる原因と定時再起動の組み方

パルワールドの専用サーバーはエンジン既知のメモリリークで数日で落ち、メモリ増設では治りません。唯一効くのは定時再起動。メモリ容量ごとの間隔、リークを速める設定、セーブを失わない自動再起動の手順。

パルワールドの専用サーバーはたいてい同じ経過をたどります。初日は快適、一週間後にときどきカクつき、二週目の深夜に全員が落ち、その後は落ちる間隔がどんどん短くなり、ある朝セーブデータが読めなくなる。設定の問題ではありません。このゲームのサーバーには既知の、いまだ修正されていないメモリリークがあり、プロセスのメモリ使用量は増える一方で、稼働が長いほど物理上限に近づき、最後は OS に強制終了されます。

この記事では、リークがどう起きるか、どの設定がそれを速めるか、メモリ増設だけでは解決しない理由、そして唯一本当に効く対策である定時再起動の自動化までを扱います。マシンのスペック自体が足りているかを先に確認したい場合は必要スペックからどうぞ。

まず本当にこの問題か確かめる

次の三つが揃えば、ほぼ間違いなくリークです。

兆候確認方法
メモリ使用量が増え続け、プレイヤーが抜けても戻らないtop / htop でサーバープロセスの RES を見る。Windows はタスクマネージャー
稼働時間とともに重くなり、再起動すると直る再起動が最良の診断です。直る=リーク、直らない=マシン不足
プロセスが黙って消え、全員が同時に落ちるLinux なら dmesg に OOM killer の記録が残ります

最後の一つがいちばん痛い症状です。強制終了された瞬間にセーブ書き込み中だった可能性があり、途中まで書かれた Level.sav は次回起動時に初めて発覚します。リークとバックアップを同じ話として扱うべき理由がここにあります。

メモリはどこに消えているか

サーバーのメモリは四つの要素から成り、そのうち三つは増える一方です。

  1. 基礎消費。1.0 以降はコールドスタート直後で 4 GB 前後。これが床です。
  2. オンラインのプレイヤー。描画距離と探索範囲のぶんで、一人あたりおよそ 1.5 GB。ログアウト後に一部は戻りますが、全部ではありません。
  3. ワールドに溜まったもの。拠点、建築物、働いているパル、地面のドロップ品。プレイヤーが抜けてもメモリ上でシミュレーションされ続けます。 最大の割合を占め、しかも減りません。辞めた人は拠点を持って帰ってくれません。
  4. リークの残り。エンジンが回収しきれなかったぶんで、稼働時間に比例して増えます。ワールドで何も起きていなくても増え続けます。

前の三つが「どれだけメモリが必要か」を決め、四つ目が「どのくらいの頻度で再起動しなければならないか」を決めます。この二つを分けて考えると、以降の判断がはっきりします。

1.0 でこの問題はアーリーアクセス時代より重くなりました。海上拠点は泳ぐパルと飛ぶパルの新しい経路探索を持ち込み、天空の島と世界樹は追加の読み込み領域で、作り直された襲撃は一度に生成する実体が増えています。以前 8 GB で回っていたワールドは、1.0 以降は 16 GB を基準にしてください。

リークを速める設定

四つの設定がリークの速度に直結します。すべて PalWorldSettings.ini のあの一行の中にあります(安全な編集方法は設定の全項目解説へ)。

設定既定値推奨理由
bEnableInvaderEnemyTrueFalse拠点襲撃は最大のリーク源として知られています。襲撃のたびに大量の AI 実体と経路データが生成され、撃退後もエンジンが片付けきれません。オフにすると同じワールドでメモリがおよそ半分になります
BaseCampWorkerMaxNum15既定のまま働くパル一体ごとに行動シミュレーションが走ります。拠点の多いサーバーで 50 にするのは、1 コアを使い切る最短ルートです
DropItemAliveMaxHours1.00.5持ち主のいないドロップ品が残る時間(時間単位)。半分にすると実体の回収が早まります
AutoSaveSpan30既定のまま、広げても 60 まで自動保存の間隔で、単位は秒です。短いほどディスク書き込みが増え、遅いディスクでは保存のたびに止まります。ただし 60 秒を超えないでください。クラッシュ時に失う進行がその間隔ぶんになります

一行目は補足しておきます。bEnableInvaderEnemy をオフにしても消えるのはスクリプトで発生する拠点襲撃だけで、野生パルが拠点に迷い込む日常は変わらず、PvP にも影響しません。不定期に集まるグループでは襲撃はたいてい誰もいない時間に起き、戻ってきたら瓦礫の山、というのが実態です。オフにして困る人はほとんどおらず、代わりにメモリの余裕が半分戻ってきます。

メモリを増やしても治らない理由

いちばん多い誤診です。16 GB を 32 GB にして得られるのは「落ちなくなった」ではなく「三日に一度が六日に一度になった」です。リークは与えられた容量をいずれ埋め尽くします。時間の問題でしかありません。

メモリ増設で買えるのは再起動と再起動の間隔であり、それ自体には価値があります。四時間ごとではなく深夜一回で済むかどうかを決めるのはこの余裕だからです。しかし再起動の代わりにはなりません。

逆に、やってはいけないこともあります。

  • bIsUseBackupSaveData を切らないでください。バックアップはリークの原因ではなく、切ると落ちた日に戻る道が一つ減るだけです。
  • ServerReplicatePawnCullDistance を 5000 未満にしないでください。パルの同期距離の公式下限で、それより下げるとプレイヤーには止まったままのパルが見えます。
  • 一台のマシンで二つのパルワールドサーバーを動かさないでください。リークが二重に積み上がり、OOM が倍速で来ます。

どのくらいの頻度で再起動するか

マシンのメモリと襲撃の有無で決まります。実運用で通用している目安がこれです。

マシンのメモリ襲撃再起動間隔
8 GBオン1〜2 時間ごと
8 GBオフ2〜4 時間ごと
16 GB 以上オン2〜4 時間ごと
16 GB 以上オフ4〜6 時間ごと

固定メンバーのサーバーなら、実用的な答えはもっと単純です。16 GB 以上、襲撃オフ、深夜に一日一回。 この組み合わせなら一日のうちにリークが危険域まで達することはなく、朝四時の再起動はほぼ誰にも気づかれません。一日中誰かがいる公開サーバーだけが数時間ごとの再起動を必要とします。

間隔が足りているかの判断は簡単で、再起動直前のメモリ使用量が物理上限からどれだけ離れているかを見ます。余裕が 20% を切ったら間隔を縮めるか、メモリを足して間隔を広げてください。

セーブを失わずに自動再起動する

プロセスを kill するだけでは毎日クラッシュを自作しているのと同じです。正しい再起動は四段階、告知 → 強制保存 → 停止 → 起動で、すべて公式の REST API 経由で行います(RCON は非推奨になったので、新しいスクリプトの土台にしないでください)。

まず PalWorldSettings.ini で API を有効にし、ローカルホストにだけ開きます。

RESTAPIEnabled=True
RESTAPIPort=8212
AdminPassword="十分に長いパスワード"

認証は HTTP Basic で、ユーザー名は常に admin、パスワードは AdminPassword です。開発元は公式リファレンスでこの API をインターネットに直接公開する設計ではないと明言しているので、ファイアウォールで 8212 を開けないでください。

Linux でそのまま使えるスクリプトです。

#!/bin/bash
# /home/palserver/restart.sh:告知、保存、再起動
PW='十分に長いパスワード'
API='http://127.0.0.1:8212/v1/api'

curl -s -u "admin:$PW" -X POST "$API/announce" \
     -H 'Content-Type: application/json' \
     -d '{"message":"Server restarts in 5 minutes for maintenance"}'
sleep 240
curl -s -u "admin:$PW" -X POST "$API/announce" \
     -H 'Content-Type: application/json' \
     -d '{"message":"Saving and restarting in 60 seconds"}'
sleep 60
curl -s -u "admin:$PW" -X POST "$API/save"
sleep 10
sudo systemctl restart palworld

cron で毎日午前四時に回します。

0 4 * * * /home/palserver/restart.sh >> /home/palserver/restart.log 2>&1

サーバーが構築ガイドのとおり systemd サービスとして登録されていることが前提です。Restart=on-failure はクラッシュ後に立ち上げ直すだけで、メモリの増加には何もしません。両方が必要です。

Windows も考え方は同じです。PowerShell の Invoke-RestMethodannouncesave を順に叩き、Stop-ProcessPalServer-Win64-Shipping を止めて PalServer.exe を起動し直し、タスクスケジューラで毎日実行させます。

ついでにアップデートも組み込む

ゲームがアップデートされると、古いビルドのままのサーバーには誰も入れなくなります。どうせ毎日一度止めるのですから、起動のたびにバージョンを確認させてもコストはゼロです。

# palworld.service の [Service] セクションに一行追加
ExecStartPre=/usr/games/steamcmd +force_install_dir /home/palserver/palworld +login anonymous +app_update 2394010 validate +quit

起動前に毎回インストールを検証し、パッチがあれば取り込みます。起動に一、二分余計にかかる代わりに、パッチ配信日の朝にはサーバーが新ビルドになっています。アップデート前のバックアップは残しておいてください。セーブの形式がバージョンで変わることがあります。

よくある質問

パルワールドのサーバーはなぜメモリが増え続けるのですか?

三つが重なっています。拠点、パル、ドロップ品はプレイヤーが抜けてもメモリ上でシミュレーションされ続けて溜まる一方であること、エンジンに回収されない既知のリークがあること、拠点襲撃のたびに片付かない実体が残ることです。前の二つは必要なメモリ量を決め、最後の一つはそのまま切れます。

襲撃をオフにすると何を失いますか?

スクリプトで発生する拠点襲撃だけです。野生パルの侵入、PvP、ボスには影響しません。代わりに同じワールドのメモリ使用量がおよそ半分になります。

パルワールドのサーバーはどのくらいの頻度で再起動すべきですか?

16 GB 以上で襲撃オフなら深夜に一日一回で十分です。8 GB か襲撃オンなら 2〜4 時間ごとに縮めてください。判断基準は再起動直前の余裕で、二割を切ったら間隔を縮めます。

メモリを増やせばサーバーが落ちなくなりますか?

それだけでは治りません。リークはどれだけの容量でも埋めてしまい、増設は落ちる間隔を広げるだけです。数時間ごとではなく朝四時に一回で済むようになる点に価値はありますが、再起動そのものは省けません。

ホスティングならスイッチ一つ

上の手順で難しいのは個々の作業ではなく、誰も見ていない状態で長く正しく動かし続けることです。スクリプトを書く人、パスワードを管理する人、cron を見張る人、落ちたら夜中に起きる人が要ります。最初の一週間は動いていても、三か月後にまだ生きているかを覚えている人はいません。

KeepWorldsパルワールド専用サーバーでは、これらはコンソール上のいくつかの項目にまとまっています。毎日の定時再起動はチェックボックスと時刻だけで、「毎日自動で再起動する」を入れて静かな時間帯を選べば終わりです。落ちたプロセスは自動で立ち上げ直され、セーブは決まった間隔で自動バックアップされ、その前には API 経由で強制保存が入ります。襲撃や拠点あたりのパル数といった設定はゲーム設定のフォームで変えられ、ini に触れる必要はありません。各項目の意味は設定の全項目解説にあります。

他の言語で読む

自分で運用しない方法もあります

ゲームとプランを選ぶだけで、専有マシン上にサーバーが立ち上がります。バックアップ、アップデート、期限のお知らせはこちらで対応いたします。

対応ゲームを見る