screen

サーバPCで何か操作するときには基本的にMacからSSHでログインするのでGUIは要らないのだけど、
MinecraftのサーバーコンソールをSSH上で普通に起動しても、一度セッションを終えてしまうとサーバーコンソールを見られなかった。方法があるのかもしれないがぼくは知らないので、仕方なくGUI上で起動していた。リモートデスクトップの調子が悪いと、わざわざサーバPCの所まで行かなければならなくて煩わしかった。
久々にLinuxでのMinecraft鯖について調べたら、screenなるものを使えば解決出来るらしい。
http://www.rui-fam.com/sims-style/blog/2011/04/minecraftvps.htmlを参考にした。

screenってなんぞ

screenは仮想コンソール?だかなんだか。Windowsで言うなら、ログオフではなくユーザの切り替えをする感じ。それもプログラム単位っつーかコマンド単位っつーか、コンソール画面を保持しておける。
mcって名前の仮想コンソールでminecraft_server.jarを実行させれば、SSH接続を終了して再開しても、仮想コンソールmcを呼び出すことが出来る。

つかいかた

とりあえずインストール。と思ったがUbuntu10.10 Server X64には入ってた。入ってなかったらapt-get。

screenが入ってることが確認できたら、Minecraftサーバの起動スクリプトを少しいじる。
バニラかRemoteToolKitのようなMODを使っていないなら

#!/bin/sh
screen -AmdS セッション名 java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
という風に書き換える。セッション名はmcとか適当に。
RemoteToolKitを使っている場合は、
#!/bin/bash                                                                     

USER=user
PASS=pass

##YOU SHOULD NOT NEED TO EDIT ANYTHING BELOW THIS LINE##
DIRECTORY=$(cd "`dirname "$0"`" && pwd)
(cd "$DIRECTORY"; screen -AmdS セッション名 java -Xmx30M -Xms30M -XX:MaxPermSize=40M -jar\
Minecraft_RKit.jar ${USER}:${PASS})

となる。要するに、コマンドの前に
screen -AmdS セッション名
を付けてやればいい。
書き換えた起動スクリプトを実行してみると、画面上は何の変化もない。ここで、セッション名をmcとすると
screen -r mc
を実行すると、セッションmcに切り替わる。後は普通のサーバコンソールと変わらない。セッションを再びバックグラウンドに戻すときは、Ctrl+Aを押した後、Dを押す。他にも山ほどコマンドがあるので、その辺はscreen コマンドなんかでぐぐってください。

-Sはセッション名の指定オプションらしい。他のオプションはなんだろう。dはデタッチ状態で起動かな?

1.6

1.6になりましたが、バグだらけのようです。個人的には妙にカクつくのが気になります。
水流エレベータやトロッコブースターが使えなくなったのは別にどうでもイイです。水流エレベータが使えなくなったのなら、なんらかの垂直移動機構を実装すべきだと思いますが。

1.6でマルチに大幅な修正が入った模様。で、

* Fixed network packets being sent unbuffered, causing huge amounts of packets being sent

The Word of Notch — The changelist for 1.6

通信にバッファを使用するように修正されたのかな。多分1.6以降ではtcpbufferは必要ないです。

tcpbuffer2

CUIでの使用に関して追記。ややこしくなるので別記事として書く。
tcpbufferv5にはオプションとして、

  • gui true/false デフォルトはtrue
  • port tcpbufferの待ち受けポート デフォルトは25500
  • target.port tcpbufferの接続先ポート デフォルトは25565
  • target.address tcpbufferの接続先アドレス デフォルトはlocalhost

が少なくとも存在する。

サーバ側での記述

ポート等に変更が無ければ、サーバ側では次のような記述で充分。

java -jar -Dgui=false tcpbufferv5.jar
もしMinecraftの待ち受けポートを標準の25565から例えば2525に、tcpbufferの待ち受けポートを25500から例えば5500に変更している場合は、
java -jar -Dgui=false -Dtarget.port=2525 -Dport=5500 tcpbufferv5.jar
となる。

クライアント側での記述

ポート等に変更が無い場合、

java -jar -Dgui=false -Dtarget.address=接続先アドレス -Dtarget.port=25500 -Dport=25565 tcpbufferv5.jar
とする。
portとtarget.portを記述する必要があるのは、標準とは逆になるため。一応書くと、接続先のポートが25500で、ローカルでMinecraftの接続を待つポートが25565だからこうなる。
接続先アドレスを変えたファイルをいくつか作成しておけば、tcpbufferを使った接続がかなり容易になると言うことだね。

tcpbuffer

最新の記事を参照してください
tcpbuffer2 - チラシの裏の表側

なんかtcpbufferの使い方でアクセスされてるので書いておく。
まず初めに、tcpbufferはサーバ側とクライアント側の両方で導入しないと意味がない。

サーバ側でやるべきこと

GUIの場合、tcpbufferを起動したらポートに変更がなければ、4のStartをクリックすればいい。2のポート番号はMinecraftサーバのポート、3のポート番号はtcpbufferが外部との通信に使うポート番号。
CUIで動かしたいなら次のようなコマンドをbatファイルなりshファイルなりにして実行しておけば良い。

java -jar -Dgui=false -Dport=25500 tcpbufferv5.jar
この場合のMinecraftサーバのポートの指定方法は知らない。
以上のいずれかの方法でtcpbufferを起動したら、tcpbufferのポート、標準なら25500についてポート開放する。これもNAPTではなくNATで設定(前の記事参照)。

クライアント側でやるべきこと

tcpbufferを起動したら1.をNoにする。次に2.に接続したいサーバのアドレスを入力(ポートは不要)し、変更があれば3.でtcpbufferが使うポートを変更する。アドレスとポートはサーバ管理者の指示に従う。以上を設定したら4.のStartをクリックし、Minecraftを起動する。起動しておいても構わない。MinecraftのMultiのアドレスにlocalhost、あるいは127.0.0.1と入力すれば接続出来るはず。
tcpbufferの7.の50msは、50ms分のデータをまとめるってことかな。小さくすればバッファ機能の意味がなくなり、大きくすれば逆に遅延が発生すると思う。

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液晶ですよ。

にっくと、Minecraftサーバ動かすときのUbuntuの設定

今日は二本立て

にっく

米国人のニックネームなどではない。
UbuntuMinecraftのサーバ(craftbukkit)を動かしてるわけだけど、ざっと検索するに、Minecraftのネットワーク関連のコードがダメらしく、安物のNICだとしばらく動かしてると負荷が大変らしい。安物のNICてのはいわゆる蟹と言われるRealtek製の物。
実際動かしてると、ローカル接続であるにも関わらず、マップのロードが遅いことがある。NICではなくバッファローのAPが原因である可能性もあるが。

と言うわけで、鉄板と名高いIntelNICを買いました。サーバ用ではなくデスクトップ用のEXPI9301CT。Amazonで3752円。

インテル Gigabit CT Desktop Adapter EXPI9301CT

インテル Gigabit CT Desktop Adapter EXPI9301CT


飾り気の無い外箱(これしか貼ってない)


シンプルすぎる内容物


きれいなIntelNICの表面
↓比較対象 RealtekNICの表面

換装してからまだ同時に3人か4人くらいしか接続してないので、体感は出来ていない。これでラグの改善が見られなかったらバッファローのAPをNECのAPに買い替えとかになるので、もう無理。

Minecraftサーバ動かすときのUbuntuの設定

最近のCPUではほとんどが負荷に追従してクロック周波数が変化する。Ubuntuでもその機能はあるのだが、Minecraftサーバのように常に動いている場合、負荷追従ではなく、常時フルスピードで動いてほしい。
Ubuntu9.04以降ではcpufreq-infoが標準でカーネルに取り込まれているらしくインストールは不要。cpufreq-infoを実行すると、搭載しているCPUの情報が表示される。
実行例

cpufrequtils 007: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
driver: powernow-k8
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 8.0 us.
hardware limits: 800 MHz - 3.50 GHz
available frequency steps: 3.50 GHz, 2.50 GHz, 2.10 GHz, 800 MHz
available cpufreq governors: conservative, ondemand, userspace, powersave, performance
current policy: frequency should be within 800 MHz and 3.50 GHz.
The governor "performance" may decide which speed to use
within this range.
current CPU frequency is 3.50 GHz.
cpufreq stats: 3.50 GHz:99.83%, 2.50 GHz:0.00%, 2.10 GHz:0.00%, 800 MHz:0.17% (209)
analyzing CPU 1:
driver: powernow-k8
CPUs which run at the same hardware frequency: 1
CPUs which need to have their frequency coordinated by software: 1
maximum transition latency: 8.0 us.
hardware limits: 800 MHz - 3.50 GHz
available frequency steps: 3.50 GHz, 2.50 GHz, 2.10 GHz, 800 MHz
available cpufreq governors: conservative, ondemand, userspace, powersave, performance
current policy: frequency should be within 800 MHz and 3.50 GHz.
The governor "performance" may decide which speed to use
within this range.
current CPU frequency is 3.50 GHz.
cpufreq stats: 3.50 GHz:99.81%, 2.50 GHz:0.00%, 2.10 GHz:0.00%, 800 MHz:0.19% (227)
実行例はぼくの環境だが、見るべきは各CPUの最後から2行目、current CPU frequencyの項目だ。おそらく何もいじっておらずバックグラウンドでも何も動いていないなら、これが最低クロックになっている。PhenomIIx2なら800MHz。
これを変更する方法は分かったのだが、永続的に変更する方法が分からない。とりあえず起動時に変更するようにしている。
GUIで変更するには、メニューバーで右クリック、パネルの追加を選ぶと、CPU周波数がどうとかという項目が見つかると思うのでそれを追加する。コアが複数あるならコアの数だけ追加しておいた方が楽。追加したら、追加したパネルをクリックして周波数を選ぶか、あればPerformanceを選ぶ。
CUIで変更するには、
sudo cpufreq-set -c 0 -g performance
を実行する。マルチコアの場合、
sudo cpufreq-set -c 0 -g performance
sudo cpufreq-set -c 1 -g performance
sudo cpufreq-set -c 2 -g performance
sudo cpufreq-set -c 3 -g performance
などになる。

わいまっくす!す!

予告通りWM3500Rで契約してきました。規約読んでる間、担当のおっちゃんの口臭がずっと気になってた。
色は黒。白が欲しかったのだけど婦中店に無くて、他の店に在庫無いか聞いたら、白は県内に在庫が無いと。まじかよ。福井どこやら店にはあるらしい。おめでとう。
説明聞く限りは白ロムだと思うんだけど、おっちゃんが白と黒を逆に言うてた。箱に張ってあるシールに書いてある型番がPA-WM3500R(AT)Bだから白ロムのはず。


電源いれたとこ

セットアップはユーティリティ入れるのめんどかったので、電源を入れる。

WiFiランプが点滅したら接続出来るので、無線LANクライアントから3500Rに接続。
SSIDと接続キーは本体の裏面に書いてある。

ブラウザをひらいてhttp://192.168.0.1にアクセス。

管理パスの設定画面が出るので適当に設定する。

認証ダイアログが出たらユーザ名adminと設定した管理パスでログイン。

契約してないけど契約する?みたいな画面になるので契約するをぽちる。

しばらくリロード繰り返したあと、もしポータルを閉じちゃったらここをクリックしてね、って出るからそれをクリックしてポータルを開く。

ヤマダ電機を選び、あとは店頭でもらえる接続マニュアルに従い3500Rのアクティベーションをする。

アクティベーションが終われば、あとは普通のルータ同様に使える。
ってわけで、やっぱり自室の通信速度を測定。条件は昨日と同じ。
結果は下のグラフ。2枚目が昨日の。

WM3500R


WMX-U04

3mがちょうど部屋と部屋の間で、4,5mは反対側の窓に近づくので3mが一番低いので正しい。っても距離は大体。
昨日のに比べると、上りの速度は若干低下している。ところが下り速度品質、上り品質は明らかに向上した。特に上りの品質(緑)の安定感がやばい。
試しにWiMAX経由で自鯖Minecraftにつないでみたけど、ラグは2秒以下って感じ。
WiMAXやばい。一人暮らしならWiMAXだけで内も外も充分。