minecraftマルチサーバを安定運用するためのtips

ちょっと前から自宅鯖にminecraftサーバを建てて、友達とマルチプレイで遊んでる。先週末の東京は雪ということもあって昼間から篭ってプレイしてたんだけど、どうもサーバが重い。色々調べた結果、安定稼働に至るまでちょっとした作業が必要だった。

前提

minecraftサーバを動かしているサーバのスペックはこんな感じ。

大量のディスク書き込みを避ける

minecraftは結構な量のディスクIOが発生するらしく、多人数でプレイする場合は注意が必要。

3人でプレイ中にサーバが応答しなくなった際、iostatを取ってみた結果がこれ。

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.32    0.00    1.13   82.24    0.00   15.32

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda             116.67         4.27         3.39         22         17

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.10    0.00    0.20   72.24    0.00   27.45

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda              87.53         4.08         9.83         20         48

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.45    0.00    0.57   81.99    0.00   16.99

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda             165.98         7.77         2.00         45         11

iowaitがひどいことになっている。この時はsshの応答もかなり遅くて、しんどかった。

そこで一旦minecraftのデータ領域をHDDからRAMディスク上に退避してみる。

UbuntuでRAMDISKを利用する方法 - RENAISSANCE

 # mkdir /ramdisk
 # chmod 777 /ramdisk
 # echo "/dev/shm /ramdisk tmpfs size=1024m 0 0" >> /etc/fstab
 # mount -a

プライベートで使っているマルチサーバなら、1GBも割り当てていれば十分なはず。あとは /ramdisk 下にminecraftディレクトリを移動させてサーバを起動する。万が一サーバがシャットダウンした時用に、RAMディスクからcron等でバックアップを取るのもを忘れずに。

これを実施後プレイしながらiostatを眺めていたけど、waitが爆増する事は無くなった。

Java7環境でサーバを動かす

ramdiskで運用し始めて1時間くらい経つと、再びiowaitが70近くなってきた。ramdisk運用なのになぜ?と思ってtopしたら、どうも異常な量のメモリを食ってるらしい。

Tasks: 139 total,   1 running, 138 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.8%us,  0.1%sy,  0.0%ni, 95.3%id,  2.8%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8061756k total,  7764492k used,   297264k free,    16332k buffers
Swap:  8273436k total,  1131092k used,  7142344k free,   148132k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 9863 root      20   0 32268 2288 1944 S    9  0.0   0:00.31 http
 9024 root      20   0 9500m 6.8g 3216 S    1 88.2  18:58.28 java

色々調べてみるとjavaバージョンが原因との疑惑が浮上する。

Java memory usage ballooning to all RAM when running Minecraft Server - Ask Ubuntu

forumでjava6からjava7にアップデートして解決したとの書き込みがあったので、早速試してみる。

以下はアップデート前に使っていたバージョン。

% java -version                                               ~
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.1) (6b24-1.11.1-4ubuntu3)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

アップデートしてデフォルトで利用するjavaバージョンを切り替える。

# apt-get install openjdk-7-jre-headless
# update-alternatives --config java
# java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

その後2人で数時間プレイしてみた限り安定稼働している。

まとめ

jarファイル1つ落としてくればセットアップ完了と思いきや、意外なところに落とし穴があった。

今回RAMディスクを使ってみたけど、実際ioがネックになっていた最大の理由はJava6環境で異常にメモリを食っていたのが原因な気がするので、Javaのバージョンアップだけでも問題なかったかもしれない。