パルワールドのサーバーが重い:原因の切り分け方
パルワールドの専用サーバーの「重い」は原因の違う四つです。誰が感じるか・いつ起きるかで切り分け、サーバー自身のフレームレートを読んで確定するまでの順番。
「サーバーが重い」の一言には、互いに関係のない四つの不具合が入っています。ゲームの中から見ると似ていて、直す場所はまったく別。だから家の Wi-Fi が原因なのにメモリを増やして買い直したり、メモリリークを直すつもりでリージョンを引っ越したりということが実際に起きます。
この記事は直し方ではなくたどり方です。一分でだいたいを振り分ける二つの質問、それでも残るものを確定させる一つの数字、そして原因ごとの直す場所。どの枝も、その主題を深く扱った記事に着地します。
ステップ1:そもそもサーバーの問題か
設定を触る前に、これが誰の問題なのかを決めます。質問は二つで足ります。ほかの人も感じているか、そして画面がカクつくのか、操作が遅れて効くのか。
| 見え方 | 誰の問題か | どこで直すか |
|---|---|---|
| 自分の操作だけ半拍遅れて効く。ほかの人は平気 | 自分の回線 | ping とリージョン、重さの三種類 |
| 画面はカクつくが操作は即反応する。ほかの人は平気 | 自分の PC | 下の「クライアントの FPS 低下は別の数字」 |
| 全員が同じ瞬間に巻き戻る | サーバー | 下のステップ2 |
| そもそも入れない、一覧に出ない、ときどき切断される | 重さではありません | 接続できないときの点検順 |
この記事が扱うのは三行目だけです。残りの三つは文字どおりサーバーの外の問題で、サーバー側の設定をどういじっても動きません。
作業を始める前に知っておくと得をする近道が一つあります。再起動して即座に良くなるなら、マシンが小さいのではありません。 このテスト一発でいちばん高くつく誤答が消え、原因はエンジンのメモリリークを指します。
ステップ2:サーバー自身のフレームレートを読む
パルワールドのサーバーには自分のフレームレートがあります。「なんとなく重い」と「この数字だ」を分けるのがこれです。値は公式の REST API から取れます。サーバーが localhost にだけ開くインターフェースです(有効化の手順とセキュリティ上の一線は REST API の記事にあります)。
curl -s -u "admin:$PW" http://127.0.0.1:8212/v1/api/metrics
{"serverfps":13,"serverframetime":76.9,"currentplayernum":4,
"maxplayernum":16,"uptime":259200,"days":137,"basecampnum":11}
パルワールドの専用サーバーは健康なとき毎秒30フレームで動きます。60ではありません。 自分のクライアントと同じだと思っていると驚く箇所で、28という読みが何の心配もいらない理由でもあります。数字の意味はこうです。
serverfps | プレイヤーの体感 |
|---|---|
| 25〜30 | 正常です。ここに直すところはないので、ステップ1へ戻ってください |
| 15〜25 | 最初の苦情が出る帯。戦闘がもたつくが、うまく言葉にできない |
| 15未満 | 全員が感じます。巻き戻り、作業中に止まったパル、遅れて入る攻撃 |
| 一桁 | 遊べる状態ではなく、たいていプロセスが落ちる数分前です |
同じ応答の中で、一緒に見る価値のある値があと三つあります。
serverframetimeは1フレームにかかったミリ秒です。フレームレートのおおよその逆数で(30fps ならおよそ33ms)、平均フレームレートが動く前にスパイクがこちらに出ます。 平均は平気なのに数秒おきに引っかかるサーバーを捕まえる値です。uptimeはプロセスが起動してからの秒数です。リークの証拠で、低いフレームレートと長い稼働時間が揃った時点で答えは出ています。basecampnumはワールドにある拠点の数です。この API が返す値のなかで、フレームレートといちばん連動します。ワールドは人が増えて重くなるのではなく、建てた量が増えて重くなるからです。
値は誰かが文句を言っているその時に取ってください。空いている朝の数字は、土曜の夜について何も語りません。
ステップ3:サーバーの FPS を下げる四つ
実際に出てくる順です。それぞれ、一分以内に白黒つくテストがあります。
1. 稼働時間 — メモリリーク。 サーバーのメモリは上がる一方で、フレームレートは道連れに下がり、最後は OS がプロセスを殺します。テストは再起動です。すぐ良くなればこれ。群を抜いて多い原因で、メモリを増やしても落ちる間隔が延びるだけ。答えは定時再起動で、間隔と「告知→保存→停止→起動」の順序、スクリプトまでメモリリークと定時再起動にあります。
2. ワールドが重くなった。 拠点、建築物、働くパル、落ちたアイテムは、全員がログアウトしたあともシミュレーションされ続けます。勝手には減りません。テストは basecampnum と、ひと回り見て回ること。拠点が十いくつあって各拠点にパルが詰まっていれば、最初の週の数倍を回しています。直接効く設定は四つ(bEnableInvaderEnemy、BaseCampWorkerMaxNum、BaseCampMaxNum、DropItemAliveMaxHours — 設定項目の全解説)。まず切るのは襲撃です。
3. 人が集まる時間帯 — メインスレッド。 物理、経路探索、戦闘、状態同期はすべて一本のスレッドで動きます。だから天井を決めるのはコア数ではなくクロックです。 テストは曲線の形。4人なら平気、10人で垂れ、人が減ると戻る。それはリークではなく人数に対するスペックの問題です。何を基準に見積もるかは必要スペックに、人数上限が数字一つでは済まない理由は人数上限の話にあります。
4. 規則正しい引っかかり — ディスク。 全員が一瞬固まる、それが一定間隔で繰り返され、サーバーが混んでいるかどうかと無関係。テストは時計です。引っかかる間隔が AutoSaveSpan(既定30秒)と一致すれば、オートセーブが遅いディスクに当たっています。これは本当によくネットワークの問題と誤診されます。SSD にすれば終わります。
二つが同時に成り立っていることもあります。数か月経ったサーバーならたいていそうです。それでも順番は上のとおりに。再起動はタダで、いちばん大きいものを消してくれます。
レンタルサーバーではこの数字がすでに引かれています
KeepWorldsのパルワールドの専用サーバーでは、フレームレートとオンライン人数を毎分記録して、コンソールのサーバーの健全性に描いています。24時間の折れ線が二本、平均 FPS と 最低 FPS、そして上限(30fps)の半分に引かれた警告ラインまであるので、このゲームで13が低いのかどうかが一目で分かります。二本の曲線を見比べるのが、curl なしのステップ3です。人数が増えるのに合わせて垂れるならメインスレッド、人数が横ばいなのに垂れるならリークかワールドの重さ。折れ線が途切れている区間はサーバーが止まっていた時間で、原因1をひとりでに片づける毎日の定時再起動もそこに見えます。
クライアントの FPS 低下は別の数字
同じ名前のフレームレートが二つあり、取り違えると何ともないほうのマシンの設定をいじることになります。自分のクライアントの FPS はグラフィックボードが描く速さ、サーバーの FPS はワールドがシミュレーションされる速さ。 二つは別々に動きます。
分ける質問は一つです。操作はいまも即座に効きますか。
| 症状 | どちらのフレームレート | 何をするか |
|---|---|---|
| 画面はカクつくが攻撃もメニューも即反応、友達は平気 | 自分のクライアント | 自分の PC の描画設定 |
| 画面は滑らかなのに攻撃が遅れて入り、全員がそう言う | サーバー | 上のステップ2 |
| 両方で、しかもワールドの特定の場所だけ | 両方 — 重い拠点は全員にとって重い | ステップ3の原因2 |
覚えておく価値があるのは最後の行です。建築物が数百、働くパルで埋まった拠点は、サーバーにはシミュレーションの負荷、自分の PC には描画の負荷。だから地図の同じ場所で二つの数字が一緒に落ちます。それを「うちの拠点でサーバーが重くなる」と言ってしまい、見当違いのマシンを探し始めることになります。
クライアント側の低下は、手を入れる場所がすべて自分の PC の中です。描画プリセット、解像度スケール、GPU を一緒に使っている別のソフト。専用サーバーに手伝えることは一つもありません。できるのは反対側の半分が健康であることを保証することで、それがこの記事の残りの内容です。
設定では直らない重さ
二つはそもそもサーバーのものではなく、設定をどれだけいじっても届きません。
- 高い ping とパケットロス。 パルワールドは UDP で通信し、失われたパケットを送り直しません。損失率が1%を超えれば、平均 ping がどれだけ良くても巻き戻りが出ます。測り方、ジッターの読み方、メンバーが複数の国に散っているときのリージョンの決め方は ping とリージョン、重さの三種類に。
- バージョンの不一致。 ゲームのアップデート後、古いビルドのままのサーバーは遅くなるのではなく全員を締め出します。しかも症状はネットワークの問題に見えます。セーブを守るアップデートの順番をどうぞ。
よくある質問
パルワールドのサーバーが重いのはなぜですか?
まず誰が感じているかを確かめてください。自分だけなら自分の回線か自分の PC です。全員が同時に巻き戻るならサーバーを再起動してみてください。すぐ良くなればエンジンのメモリリークで、これが群を抜いて多い原因です。再起動しても変わらないなら、人が文句を言っているその時間に REST API で serverfps を読みます。オンライン人数に連れて垂れるなら CPU のメインスレッド、人数が横ばいなのに垂れるなら重くなったワールドです。
パルワールドのサーバー FPS はいくつなら正常ですか?
パルワールドの専用サーバーの上限は30なので、25以上なら正常です。15〜25で最初の苦情が出はじめ、15を下回るとワールドの全員が巻き戻りと作業中に止まったパルで気づきます。値は REST API の /metrics から読み、空いている時間帯ではなくサーバーが混んでいるときに取ってください。
カクつくのは自分の PC ですか、サーバーですか?
操作が即座に効くかどうかで分かれます。画面だけがカクついて操作は即反応なら自分のグラフィックボード側で、ほかの人には何も起きていません。画面は滑らかなのに攻撃が遅れて入るならサーバー側で、同じ瞬間に全員が感じます。両方が同時に、しかも地図の特定の区画だけで落ちるなら、サーバーのシミュレーションと自分の PC の描画を同時に食うほど重い拠点です。
拠点が多いとサーバーは重くなりますか?
一緒に遊ぶ人たちが自分のサーバーに対してやることのなかで、いちばん大きいのがそれです。拠点と建築物、配置したパルは全員がログアウトしたあともシミュレーションされ続けるので、負荷はオンライン人数より建てた量に連動します。見るべき値は /metrics の basecampnum。拠点数と拠点あたりの働き手を制限すること、襲撃を切ることが、いちばん直接的な三つのつまみです。
測る人がいない時間帯のために
ここまでの全部は、人が文句を言っているまさにその瞬間に値を取ってくれる誰かがいる前提の上にあります。そしてその時刻はたいてい、誰も SSH をつなげる状況ではありません。サーバーの重さの本当の難しさはそこです。証拠はその時しかなく、誰かが見にいく頃にはサーバーは空いていて、とても健康な数字を返します。
KeepWorldsのパルワールドのサーバーでは、その値はすでに取ってあります。フレームレートとオンライン人数を毎分、警告ライン付きの24時間の曲線として。「昨夜はひどかった」を思い出して組み立て直す代わりに、開いて見るだけです。いちばん多い原因はたどり着く前に片づいています。毎日の定時再起動が、決めておいた時刻にゲーム内告知と強制保存を先に済ませてからリークを空にしてくれるからです。残りの原因を左右する設定、つまり襲撃と拠点の上限、拠点あたりの働き手は、SSH で直す .ini の一行ではなくゲーム設定フォームの入力欄です。