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のバージョンアップだけでも問題なかったかもしれない。