Minecraftのサーバ運用まとめ

かなり安定運用出来るようになってきたのでまとめようと思う。

OS

まず、OSにはサーバ用途OSを選ぶほうが無難。適当に使ってないWindowsなんかでやるとTCPコネクションの接続制限に到達しちゃう。WindowsServerなんかもあるけど、やばい高い。
なもんで、Linuxディストリビューションの中でも人気のあるUbuntu Server版を使う。これなら無料。別にFedoraでもopenSUSEでも良いけどぼくはUbuntu

CPU

うちはPhenomIIx2 555BE(定格3.2GHz)を3.5GHzで動かしてる。オーバークロックだけど、落ちたことはないからこのまま。お金あるならi7とか買えば良いと思う。555BEなら1万円で買えるとだけ。
あと、書いたような気もするけど、CPUの負荷追従は無効にすること。3.5GHzなら3.5GHzで常に動作させる。

RAM

メモリはあるにこしたことはない。UbuntuServerは64bit版ももちろん有るので、4GB以上でもどんとこい。規模にもよるけど、8GBもあれば良いと思う。Minecraft自体はそこまでメモリを食わないが、RAMDISK運用にするので8GBもあれば安心。RAMDISKユニット等ある人は4GBでも良いと思う。

HDD

適当に500GBの買っておけば充分。

運用

正直、鯖立てまではぐぐればいくらでも出てくる。ので、ここでは外部からアクセスした人にとって「サーバが重い」、あるいは「ラグがひどい」といった原因を排除することを書こうと思う。Minecraftのサーバを運営する人の一助になれば幸い。

RAMDISK

Minecraftのサーバ群はRAMDISK上に配置する。Minecraftのサーバはディスクアクセスがものすごく多いので、HDDだとそれがボトルネックになるし、SSDも向かない。RAMDISK最強。LinuxでのRAMDISKの使い方はぐぐれば出ると思うのでキーワードだけ置いておく。
RAMDISK tmpfs fstab
ソフトウェアによるRAMDISKはPCの電源が落ちるとその中身も消えてしまうので、1時間ごとにでもバックアップを取るべきだろう。Linuxで定期バックアップを取るなら、大体組み込まれているcronを使えばよい。Ubuntuなら、/etc/crontab あたりに書けば良い。次のようなスクリプトを1時間毎に実行させている。これは/media/ramdiskRAMDISKがマウントされている場合。

rsync -a /media/ramdisk/mcserver/ /home/server/backup/`date +%m%d%H%M`
最後の部分で日時のディレクトリを作成している。
サーバ機を再起動すればRAMDISKから全てのファイルは消えるので、RAMDISK運用ではさらに次の二点を行わなければならない。
2013-01-26追記
少なくとも正式版1.4世代では、この方法だけではワールドのバックアップが不完全。
Minecraft RemoteToolkitなどを使い定期的にマップを保存した後に、バックアップが実行されなければならない。
追記ここまで

  • 再起動前にRAMDISKからHDDへファイルを退避
  • 再起動後にHDDからRAMDISKへファイルをコピー

一つ目の為には次のスクリプトを使っている。
(2012/02/04 逆になっていたので修正)
/home/server/backup/toram/内にサーバ群がある場合。

rm -r /home/server/backup/toram/*
rsync -a /media/ramdisk/mcserver/ /home/server/backup/toram/
二つ目の為には次のスクリプトを使う。
mkdir /media/ramdisk/mcserver/
rsync -a /home/server/backup/toram/ /media/ramdisk/mcserver/
と書いたところでrsyncに--deleteオプションを付ければ1行目は要らないことに気づく。まぁ大体こんな感じ。

plugin

craftbukkitを使う人なら使うpluginに気をつけたほうがいい。特にlogを保存するタイプのpluginは、やたら重くなるものがある。これはもしかするとi7とか使っていると気にならないのかもしれない。ぼくの環境ではBigBrotherを使うとローカル接続ですら重くなった。

NIC

NICの影響については実証出来ていないが、Intel製のNICを使う方がサーバ機としての信頼性は高まると思う。

tcpbufferの導入

Minecraftのネットワーク関連のコードへの対策。サーバ側での使い方はぐぐれば分かると思う。簡単にいえばproxyのようなもので、
Minecraftサーバ←→tcpbuffer←→いんたーねっつ←→tcpbuffer←→クライアント
となる。

ポート変換とポート転送

うちのサーバの重さが解消した最大の原因(多分)。
普通サーバ側ではポート開放なる操作が必要なのだけど、それには大別して二種類あって、ポート変換とポート転送がある。名前はルータのメーカで変わったりする。正しくは「ネットワークアドレスポート変換(NAPT)」と「ネットワークアドレス変換(NAT)」。ポート変換とポート転送は配信で便宜的に使った言葉なのでここで訂正する。NAPTとNATである。
こいつらが何をしてくれるかというと、WANから来たデータを、LANの適切な機器へ送る手助けをしてくれている。

NATの場合:
ポートが25565のデータを受け取ったら、192.168.0.5へ送るように設定しておく。
結果、ho.ge:25565宛のデータを受け取ったら192.168.0.5へ送られる。

NAPTの場合:
ポートが25565のデータを受け取ったら、192.168.0.5へ、ポート25565で送るように設定する。
結果、ho.ge:25565宛のデータを受け取ったら、25565にポートを変換して、192.168.0.5へ送る。

同じように見えるが、NAPTの場合、25565から2525へポートを変換することが出来る。この例では25565から25565へと変化しない変換が一手間かんでいる。小規模なwebサーバやftpサーバなどならこれでも問題ないのだが、Minecraftの場合膨大な量のデータが流れてくるので、この一手間で遅延が増加する。のだと思う。少なくともうちでは、NATに変更してラグがなくなった。

まとめ

サーバが重いとき、サーバ管理者が確認すべき点は、

  • OS

サーバ用OSかどうか。TCP接続数に制限があると、しばらくしてサーバーコンソールに接続数が限界、みたいなエラーが出たような気がする。

  • CPU

CPUリソースに余裕はあるか。負荷追従になっていないか。ラグが出ているときにtopコマンドでCPU使用率をチェック。全然余裕ならCPUに問題は無い。

  • RAM

空きはあるか。Linuxの場合、Swap領域を使っていないなら問題無いと思う。

  • plugin

Minecraftをバニラ(素の状態)で起動してラグが無いならpluginのどれかが原因。一つずつ有効にする。

RealtekNICを使ってるなら、原因の可能性はある。が、その前にtcpbuffer。

  • ポート開放

NAPTになっていないか。

まずはNATかNAPTか、OS、CPU、RAMの確認。次に、tcpbufferの使用を徹底する。tcpbuffer使ってる人だけでもラグがひどいなら、pluginのチェック。これだけやればおそらく解決しそうだが、ダメならNIC

最後に

長々と書いたけど、これで改善しなかったと言われても困る。正直、サーバ運用するならこれくらいのこと確認出来て当たり前なのよね。ぼくは感覚的な所があるから、お仕事でメンテされてる人から見ればそこは違うやろとかあるだろうけど。

あと愚痴というかツッコミになるけど、Minecraftのサーバ運営してる人のサイト見ると、たまにサーバ機のパーツ名を事細かに書かれている人が居る。CPUやRAMなんかは重要やと思うけど、モニタだとか光学ドライブだとかケースなんてどうでも良いでしょ。あと無駄に良いグラボ積んでたりね。サーバ機にグラボなんか要らないから。Minecraftプレイするため、とかだったら言語道断だし。うちのサーバ機なんてオンボードにちょっと割れた15インチのXGA液晶ですよ。