TF2 Sushi Server 運営記

Team Fortress 2(TF2)は Valve の対戦 FPS。その協力モード MvM(Mann vs. Machine) は、プレイヤー6人でロボット軍団の侵攻を防衛するモードで、公式サーバーのほかに個人が建てる「コミュニティサーバー」で遊ぶ文化があった。

Sushi 鯖は、2012年の夏にそのコミュニティサーバーとして建てた日本向けサーバー群。最初は1部屋だったが、最盛期には MvM 10部屋 + Payload(爆弾カートを押し合う対戦モード)+ Idle という構成になり、累計利用者は最終的に25万人を超えた。これはその運営の記録。

数字で見る Sushi 鯖

累計利用者数の推移。当時のブログで節目ごとに発表していた実測値を直線でつないだもの:

Sushi 鯖 累計利用者数の推移(2012–2016)20万10万020132014201520161周年 58,340100,279158,840257,822

設立一周年(2013年8月)時点の統計と、確認できる最終値(2016年8月、MOTD アーカイブの Stats ページより):

項目一周年(2013/08)最終(2016/08)
利用者数58,340257,822
プレイ回数41,247197,693
チャット発言数1,451,7555,040,641
破壊されたロボットの数21,344,226100,095,713
拾われた金184,017,3681,564,860,426

一周年の時点でこう書いている:

2100万体ものロボットが破壊されたことになります。どっちが攻めてるのかわからない状況です。ひどい話だ!!

最終的にはその5倍、1億体を超えた。

サーバー案内ページ(MOTD)は月に約9万 PV。利用者は平日200人、金曜400人、土日は600人ペースだった(累計3万人達成時に初めて可視化して「daily で100人程度だと勝手に思い込んでたぞ」と驚いている)。

歩み

競争率の激しい時期に設立したSushi鯖は最初はSD(Special Delivery)サーバーで、当時はまだ1部屋だったけど、いまではMvM(Man vs Machine)の10部屋になっております :D

最終的なサーバー構成は MvM #1-5/#A-C、PL(Payload)#6-7、Idle。当時の MOTD 一式は静的アーカイブとして保存してある(MvM/PL/Idle)。Steam グループも当時のまま残っている。

Idle 鯖という実験

TF2 はプレイしているだけでアイテムがランダムドロップする仕組みがあり、それを放置プレイで稼ぐ「idling」という文化があった。当時は textmode 起動などグレーな放置手法が横行していて、VAC(Valve のチート対策)に BAN されるリスクと隣り合わせだった。それなら普通にサーバーブラウザから join できる Idle 専用サーバーがあれば安全だろう、という理屈で 2013年5月に建てたのが Idle 鯖:

無駄なBANリスク減らせるなら善行だよねという論理展開をして自分を納得させることで建ててみた。

調べる過程で「maxplayers が 1 にセットされてると item drop しない」という仕様も突き止めている。なお Idle 鯖の利用者は Sushi 鯖の利用者数にカウントされないようにあえてしてあった。

Forum とスパム戦争

サーバーと並行して phpBB の「Sushi Gaming Forum」も運用していた。新マップの情報が集まる場所で、後期の新マップ導入を支えた Arilou さんの助言もここから来ている。「Sushi フォーラムで、新マップ情報教えてくださる方、本当にありがたい。。」(2013年3月)

もっとも、運用記録の大半はスパムとの戦いである。2012年10月、スパムが多すぎて画像認証を reCAPTCHA に変更——それでも突破される。調べた結論は「人力で CAPTCHA を解かせる代行業者がいるらしい」だった。溜まったスパムの手動全消しを繰り返しながら NG ワード MOD と Akismet を投入し(「captcha は結局突破されるのでいらんかもなぁ」)、スパムに埋もれて有益な投稿に気づくのが遅れる事件も起きた。最終兵器は「日本語が含まれていないメッセージは投稿できなくする」というローカライズ全振りの対策で、同じ日の日記には「スパム絶滅の予感」とある(2012年11月)。

運営のために作った道具

運営の必要から、いくつもの道具を自作した。現在の wave(押し寄せる敵ロボットの波)数をサーバー名に出すプラグイン、wave をリスタートするプラグイン、無人になったらサーバーを終了するプラグイン——どれも SourceMod で書いたもので、Gaming にまとめてある。ほかに、自サーバー群を一覧するためのサーバーブラウザ tf2.kymt.me(HalfLife2 エンジン互換、現在は終了)も作った。

自作の道具は運用中に育っていった。wave リスタートは公開直後、リスタート投票が成立した時にプレイヤーが死亡してしまう問題が発覚し、「【重要】【緊急】」と題した記事で即修正している(2012年9月)。デバッグ用には TF2 で発生する全イベントをトグルで記録できるロガーを書いた。SourcePawn(SourceMod のスクリプト言語)に嫌気がさすと、外部コマンドを実行する Extension(RunSystemCommand)を C++ で自作した。記事は「Good bye SourcePawn.」と締められている。TF2 本体のアップデートで告知なく cvar(ゲームの設定値)が追加される事件も多かったので、cvarlist を毎日自動保存して差分を取れるようにしていた。

自作の MvM マップ3枚もこのサーバーで回すために作った。制作の顛末は TF2 マップ制作記 に。

裏側——可視化と自動スケールの構想

サーバー群の負荷は cloudforecast(SNMP ベースの監視ツール)でグラフ化していた。入れてすぐ「write が多いのは俺が plugin でログ出しまくってるからだなぁ」と気づかされている(2012年9月)。

2013年1月、毎晩21時頃はどの部屋も満員という状態になると、EC2(Amazon のクラウド)のスポットインスタンス(余剰枠を安く借りられる枠)で自動増設する仕組みを設計して起動実験まで成功させた。全サーバーに3人以上いたら起動、無人になったら自動終了、月額上限を事前に設定、スポット価格は履歴の標準偏差を見て変動が大きいときは安全側に倒して起動しない——という設計まで詰めている(常用には至らなかった)。

「俺の考えたさいきょうの SRCDS サーバー」と題した構想メモ(2012年10月)も残っている。SRCDS(Source 専用サーバー)の自動アップデートや「毎日朝4時に再起動、人が居たら完全に居なくなるまで待ってから再起動(メモリリーク対策)」は実装済みの印付きだ。未実装の夢としては、カスタムマップ更新の自動検知・配備、クリア率に応じたマップサイクル調整、チャットログの全文検索(転置インデックス)と「サーバーに関する話題を自動で検知して毎日メールで鯖管に送る」機能が挙がっている。

カスタムマップのバグを直す

MvM 登場直後(2012年9月)のカスタムマップは、バグを抱えたまま公開されるのが普通だった。回す側として、バグごとに調べて直していた記録が残っている。

BOT がマップにスタックして wave が進まない

プレイヤーがリスポンルームのシャッターに挟まる(mvm_diverge)

リスポン地点にスタックする(mvm_paradigm_a5)——直して配って、直後に公式が直す

Tank が動かない(mvm_Scream_Tv)——再コンパイルを諦め、サーバー側で直す

テクスチャが紫・モデルが ERROR 表示(mvm_desert_fort)

popfile(wave 定義)がバグっている

カスタムマップサーバーを維持した理由

MvM カスタムマップサーバーを維持し続けた理由(2013年1月の日記):

どんなに面白いマップを頑張って作ってもそのマップを回してくれるサーバーがなかったら水の泡になっちゃう。それってすごい悲しいことだよね。そしてもったいない。だから俺はmvmのカスタムマップサーバーをこのまま維持しようかなーと思ってる。

そうしないとカスタムマップ作成の文化が滅びてしまうと思う。今主流のマップだってほとんどは誰かの作ったカスタムマップだったわけで、そういう文化殺すのはすげー良くない。いまのvalveのマッパーの人も昔はtf2mapsの普通のユーザーだった人もいるわけで。


Sushi 鯖はたくさんの人に支えられていた。設立初期のテストプレイにいつも付き合ってくれた SpaceMomonga さん(導入 Mod のほとんどは彼とのテストプレイから生まれた)、停滞期に Forum で新マップを助言してくれた Arilou さん、マップを提供してくれた Gadget さんをはじめとするマップ作者のみなさん——そしてここに名前を挙げきれない、テストプレイや Forum やゲーム内で関わってくれたたくさんのプレイヤーのみなさん。ありがとうございました。