ByProduct - 副産物

IT FukuSanButsu Blog

社内インフラエンジニアの自宅からはじまるIT
自宅のPCに向き合いながら気づいたことや個人的な知見をまとめています


プロフィール
しらせ(HN)
とあるIT企業のインフラエンジニア。プライベートでは開発もちょっとやります。
※本ブログの内容はすべて個人の見解であり、所属する企業とは関連ありません。
2023/09/30 暫く更新停止中m
プロフィールを読む
カテゴリ別
内部リンク
相互リンク

Twitter
来訪
1190399 [合計]
154 [今日]
534 [昨日]
Powered by
Powered by AWS Cloud Computing


【Minecraft】(備忘)高負荷時にマルチサーバを止めない方法

2022/04/11
2022/04/11

ゲーム


お疲れ様です。
しらせです。

マインクラフトを使った点群データの再現実験をしているときに気づいたネタを書き連ねています。

今回はマルチサーバーが頻繁に落ちて困るという場合の対応方法をまとめます。

もくじ

落ちる原因

私がマイクラで点群データを扱うときはだいたいマルチサーバーを立てて実行しています。

大量のデータを流し込んでいるとマルチサーバーがクラッシュすることが多々あります。

基本的にマインクラフトのマルチサーバーはjavaで動作していますが落ちる原因には以下の3つが考えられます。

  1. マルチサーバー(ソフトウェア)の不具合
  2. 実行環境のリソース不足による停止
  3. ウォッチドックタイマーによる強制終了

1つ目はマインクラフトのマルチサーバー(minecraft_server.1.xx.x.jar)の不具合です。

こちらはどのような処理をすると起きるか分からないまさに偶発的なクラッシュです。

対処のしようもなく不具合であれば改善されるのを待つばかりです。

2つ目がマルチサーバーをホストしているPCの性能不足によるクラッシュです。

メモリが不足してしまう場合や、CPUの計算リソースが足りない場合などが考えられます。

3つ目がマルチサーバーの保護機能によるクラッシュです。

つい最近知ったのですが、サーバーの設定ファイル「server.properties」に以下のような設定が含まれています。

max-tick-time=60000

これはマルチサーバーが60,000ms(=60秒)応答がなければ正常に動作していないと判断して、サーバーを強制停止させるための設定です。

高負荷を掛けた状態が長く続くような処理を投入する場合、この時間の経過で以下のようなエラーとともに毎回クラッシュするようになってしまいます。

[23:19:00] [Server Watchdog/FATAL]: A single server tick took 60.00 seconds (should be max 0.05)
[23:19:00] [Server Watchdog/FATAL]: Considering it to be crashed, server will forcibly shutdown.
[23:19:03] [Server Watchdog/ERROR]: This crash report has been saved to: C:\Users\user\minecraft\.\crash-reports\crash-2022-04-09_23.19.03-server.txt

こちらは次章の設定で変更と回避することが可能です。

設定変更

マインクラフトでは自分でコマンドを定義できる「function」という機能があります。

既定では65,535個を上限にコマンドの実行が可能ですが、設定を変更することで最大2,147,483,647個まで実行が可能になります。

実際にこんなに大量のコマンドは実行しませんが、数時間実行するようなケースもあります。

その場合はmax-tick-timeに「-1」を指定してサーバーを再起動してあげます。

max-tick-time=-1

これで何時間実行してもマルチサーバーは落ちなくなります。

点群データでの実行例

マインクラフトではロードされていない地形ではfillコマンドが通らないという仕様があります。

事前に地形をロードした後でfillコマンドを実行してあげる必要があります。

ロードされていない場所へのfillを実行すると警告がでて動作しません。

[20:42:13] [Server thread/INFO]: That position is not loaded

ロードされていない地形に対してもfillコマンドを流すために「/forceload」コマンドで事前にチャンクを読み込んでからfillをするという手間を挟みます。

/forceload add <fillするx座標> <fillするz座標>
/fill <x座標> <y座標> <z座標> <x座標> <y座標> <z座標> stone
/forceload remove <fillするx座標> <fillするz座標>

forceloadコマンドは最大256チャンクごとに何か所でも設定は可能ですが、forceloadが指定されたチャンクはマルチサーバーが起動するタイミングや起動中に大量のPCリソースを必要とします。

大量に設定してしまうと話にならないくらい重くなってしまい、動作不良を起こしますので必ず実行後に解除の「remove」を入れています。

単純計算で10,000ブロックを埋めるだけなのに3倍の30,000コマンド実行する必要があります。

これをfunctionに入れ込むと最大で「715,827,882」個のブロックを一度に流し込むことができるようになります!

マインクラフトは奥が深い。

以上
おつかれさまでした。



View:6794 この記事をツイート!