Minecraftサーバーのラグと戦う
Minecraftサーバーを建てるうえで何よりの強敵が、サーバーラグ。サーバーのオーナーは如何にしてラグを減らすかに尽力しなければならず、その過程でいろいろ見つけることができたので備忘録としてここに書き残しておく。
・ラグの原因を特定する
自分の環境だと、プラグインを入れ始めてから急にラグを感じてきたのでプラグインがリソースを消費していることは明確だったためそちらを調べることにした。そこで役に立つのがSpigotにデフォルトで備わっているレポート機能である。
まずコンソール上で"timings on"と入力する。するとサーバーのパフォーマンスの集計が始まるので最低3分待つ。ラーメンがちょうど沸くので空腹の鯖主は今のうちにお湯を注ぐべきだ。
集計終了後に"timings paste"と入力するとサーバーリソースの消費状況がレポートとして出されるのでそれをブラウザで開く。すると以下のような情報が得られる。
サーバーの情報を表したグラフと、具体的な詳細が記されたリソースの消費状況だ。グラフに関しての説明は割愛。
基本的には下を見る。この一覧はソートできるので自分の欲しい情報に合わせて使うのが吉。今のこの表を見ると、buildingと呼ばれるワールドに処理がさかれていることがわかる。ちなみに、Minecraft本来の処理であれば文頭にMinecraft:が付き、プラグインによるリソース消費があれば"Plugin:"という風になる。プラグインのどの処理がラグいかもわかるので必見である。
最新バージョンのラグ
Minecraft1.16以降においてサーバーオーナーが注目すべきなのはエンティティの処理にある。
具体例を挙げると、村人だ。最近のバージョンアップで村人のAIにも大幅な変更が加わりこれが厄介なことにサーバーのラグの原因にもなる。なんでも村人の持つ「家を記録した」上での移動処理がナカナカきついんだとか。サーバーオーナーとしては村人をため込まないように声をかけて、ユーザー側もそれにある程度こたえられる計らいをするのが両者のためになると思われる。
また、mob同士の衝突判定もラグを引き起こすため、農場やTTなどでmobを一か所にためる機構はNGとするのがベストだと思われる(そもそもラグを気にしているサーバーがTTを許可すべきではない) 。
Entityを水に浮かべる処理もかなりきついのでユーザー側は水流運搬には配慮が必要である。
クロック回路については言わずもがな処理が重い。ただ便利な機構であるため、例えば「停止機構付き」を原則にしたり「光源の更新を防ぐため、必ず回路周辺を明るく照らす」ことを義務づけることが妥協案としてある。自分はクロック回路が好きなのでこの方針を取る予定でいる。
あまり縛りを設けたくない
正直なところ、こういったラグを防ぐために既存機能を大きく制限するのは自分の信条に反するので何か対策を取れないかと考えた。そこでいくつか有用なPluginを見つけたので紹介する。(Pluginは2020年10月時点でのものでありそれ以降対応されるかは不明)
・ViewDistanceTweaks
https://www.spigotmc.org/resources/view-distance-tweaks-1-14-1-16.75164/
サーバーのTPSの状況に応じてユーザーのチャンクロード距離を自動的に変更してくれる。新しいワールドを一斉に探索されるときとかに有用かもしれない。
・Villager Lobotomizatornator
悪名高き村人の処理に関するPlugin。
村人が1x1の隙間に押し込まれた場合、経路探索の処理含めたAIの一切を停止し、定期的に取引の更新以外をしなくなるというもの。
基本的にユーザーは村人の運用方法として取引施設を作成することがメインになると思われ、その際ほとんどのプレイヤーは村人を1ブロックスペースに監禁するのでその際に効力を発揮する。ところでこのプラグインの名前、自分はかなり好き。
・Villager Optimiser
もしかしたら普通に村人を景観として扱う人もいるかもしれないのでそういう人のためのプラグイン。簡単に説明すると村人の経路探索AIの思考頻度を大幅に減らすことで処理を軽くするもの。
・Entity Tracker Fixer
通常Minecraftはプレイヤーの感知範囲外にあるエンティティも処理を行うが、このプラグインは範囲外のエンティティの処理をなくすことで大人数がいる環境でTPSを確保することができる。
なお上記プラグイン達を導入したことによって不都合なことが起きても知らんぷりです。
この記事が気に入ったらサポートをしてみませんか?