一馬力のメモ帳

MVSからLinuxまで。基盤屋さんは眠らない

PocketMineがCrashDumpを吐いて停止する時の対処法

PocketMineがCrashDumpを吐いて停止する時の対処法

Minecraft PE用マルチプレイサーバーPocketMineを常時動かしていると
CrashDumpを吐いて停止しちゃう時ってありません?
今回はそんな時の対応方法メモです。参考にしてください

目次


PocketMineがCrashDumpを吐いた時のログを見てみる

あれ??動かしてたはずのPocketMineが止まってる?
という時は、とりあえずPocketMineをインストールしたディレクトリの中にある
server.logを確認してみましょう。

2016-04-29 [19:53:37] [Server thread/EMERGENCY]: An unrecoverable error has occurred and the server has crashed. Creating a crash dump
2016-04-29 [19:53:37] [Server thread/EMERGENCY]: Please upload the "/home/mine/PocketMine-MP.git/CrashDump_Fri_Apr_29-19.53.37-JST_2016.log" file to the Crash A
rchive and submit the link to the Bug Reporting page. Give as much info as you can.

ログの中に"[Server thread/EMERGENCY]: An unrecoverable error has occurred and the server has crashed."
って出てたら,この先のメモを確認してみてください。

CrashDumpの中身を確認してみる

server.logに書いてある"[Server thread/EMERGENCY]: Please upload the〜"の先のファイルが
CrashDumpです。Dumpの中身を確認!なんて力まなくてよいです。確認するは初めの数行。
とりあえず開いてみましょう。

[mine@PocketMineMP PocketMine-MP.git]$ less CrashDump_Fri_Apr_29-19.53.37-JST_2016.log
less CrashDump_Fri_Apr_29-19.53.37-JST_2016.log

PocketMine-MP Crash Dump Fri Apr 29 19:53:37 JST 2016

Error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 131072 bytes)

dumpの中に”Error: Allowed memory size of〜”って表示されていたら,メモリ不足で停止したと推測できます。
PocketMineが利用できるメモリを増やしてあげましょう。

対応方法(pocketmine.ymlの修正)

ここからが対応方法。PocketMineのメモリ割当を変更するときは
PocketMineをインストールしたディレクトリの中の"pocketmine.yml"を修正します。

修正箇所(main-hard-limit)

修正箇所は"pocketmine.yml"の中の"main-hard-limit"部分
単位はメガバイト。この値までメモリを使うと,pocketmineが停止します。

#Main thread hard memory limit in megabytes. Set to 0 to disable
#This will stop the server when the limit is surpassed
main-hard-limit: 1024

(参考)pocketmineのソース該当部分

参考までに,"pocketmine.yml"の中の"main-hard-limit"部分を
pocketmineのPHPプログラムがどのように扱っているか確認してみます。

/src/pocketmine/MemoryManager.php

        $hardLimit = ((int) $this->server->getProperty("memory.main-hard-limit", $defaultMemory));
        if($hardLimit <= 0){
            ini_set("memory_limit", -1);
        }else{
            ini_set("memory_limit", $hardLimit . "M");
        }

読み込んだ値を"ini_set"関数を利用して設定しているようですね。
 参考PHPマニュアル ini_set: http://php.net/manual/ja/function.ini-set.php

"0"より小さい値をを指定するとphp memory_limitに"-1"をセットして制限無しとなるようです。

pocketmine.ymlのバックアップ

さっそくpocketmine.ymlを修正したいところですが,設定変更するときはバックアップを取るのがお作法。
これを習慣づけておくと,後々幸せになれるはずです(多分)

バックアップは"cp -p"コマンドで取得。取得後"ls -l"で確認しておきましょう。

[mine@PocketMineMP PocketMine-MP.git]$ cp -p pocketmine.yml pocketmine.yml.org
[mine@PocketMineMP PocketMine-MP.git]$ ls -l pocketmine.yml*
-rw-rw-r-- 1 mine mine 5726 Apr 29 12:04 pocketmine.yml
-rw-rw-r-- 1 mine mine 5726 Apr 29 12:04 pocketmine.yml.org

pocketmine.ymlの修正

pocketmine.ymlを修正します。
今回はデフォルトの2倍2048MBを割り当ててみます。

[mine@PocketMineMP PocketMine-MP.git]$ vi pocketmine.yml


#Main thread hard memory limit in megabytes. Set to 0 to disable
#This will stop the server when the limit is surpassed
main-hard-limit: 2048 : ★★★ ここを修正 ★★★

修正内容の確認(diff)

修正したらdiffを使って前後確認してみましょう。

[mine@PocketMineMP PocketMine-MP.git]$ diff -u pocketmine.yml.org  pocketmine.yml
--- pocketmine.yml.org  2016-04-29 12:04:19.910671105 +0900
+++ pocketmine.yml  2016-04-30 08:42:45.082765512 +0900
@@ -35,7 +35,7 @@

  #Main thread hard memory limit in megabytes. Set to 0 to disable
  #This will stop the server when the limit is surpassed
- main-hard-limit: 1024
+ main-hard-limit: 2048

  #Period in ticks to check memory (default 1 second)
  check-rate: 20
[mine@PocketMineMP PocketMine-MP.git]$

1024→2048に修正されている事が確認できたら,あとは反映させるだけです。

設定の反映(PocketMine)の再起動

反映にはpocketmineの再起動が必要です。
pocketmineのワールドに誰も居ないことを確認して停止しましょう。

  1. listコマンドでだれもいない事を確認 #pocketmineコンソールから実施
  2. stopコマンドでpocketmineを停止  #pocketmineコンソールから実施
  3. "./start.sh"で起動

これで, CrashDumpを吐いて停止する可能性が少なくなりました。
それでもまだ止まっちゃう!という場合は漢を見せて
"main-hard-limit:0"という選択肢もありかもしれません。(ご利用は自己責任で)

それでは楽しいPocketMine生活を^^
メモは以上です

(参考)PocketMineのインストール方法(PE v0.14.2.0対応版)

Minecraft PE用マルチプレイサーバー構築(PE v0.14.2.0対応版)のインストール方法は
以前書いた記事を参考にしてください。
ichibariki.hatenablog.com

試した環境

Minecraft PE用マルチプレイサーバー

PocketMine-MP 1.6dev 「[REDACTED]」 implementing API version 2.0.0 for Minecraft: PE v0.14.2.0 alpha (protocol version 60)

OS

[root@PocketMineMP ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@PocketMineMP ~]# uname -a
Linux PocketMineMP 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux