TF2 Sushi Server 運営記
2012~2016
Team Fortress 2(TF2)は Valve の対戦 FPS。その協力モード MvM(Mann vs. Machine) は、プレイヤー6人でロボット軍団の侵攻を防衛するモードで、公式サーバーのほかに個人が建てる「コミュニティサーバー」で遊ぶ文化があった。
Sushi 鯖は、2012年の夏にそのコミュニティサーバーとして建てた日本向けサーバー群。最初は1部屋だったが、最盛期には MvM 10部屋 + Payload(爆弾カートを押し合う対戦モード)+ Idle という構成になり、累計利用者は最終的に25万人を超えた。これはその運営の記録。
数字で見る Sushi 鯖
累計利用者数の推移。当時のブログで節目ごとに発表していた実測値を直線でつないだもの:
設立一周年(2013年8月)時点の統計と、確認できる最終値(2016年8月、MOTD アーカイブの Stats ページより):
| 項目 | 一周年(2013/08) | 最終(2016/08) |
|---|---|---|
| 利用者数 | 58,340 | 257,822 |
| プレイ回数 | 41,247 | 197,693 |
| チャット発言数 | 1,451,755 | 5,040,641 |
| 破壊されたロボットの数 | 21,344,226 | 100,095,713 |
| 拾われた金 | 184,017,368 | 1,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
- 2012年7月 — SD サーバー1部屋で設立。SD(Special Delivery)は直前の Pyromania アップデート(2012年6月)で追加されたばかりのモードで、中立のオーストラリウム(金塊)を奪い合ってロケットに届けるルール。「競争率の激しい時期」とはこの新モード直後のサーバー乱立期のこと
- 2012年8月 — MvM(Mann vs. Machine)がアップデートで登場。以降は MvM カスタムマップサーバーが Sushi 鯖の主軸になる
- 2013年3月 — 累計利用者3万人
- 2013年5月 — Idle 鯖の実験(後述)
- 2013年7月 — 累計5万人。パフォーマンステスト用のサーバー #d を別 VPS(ConoHa)に追加するなど、この頃が拡張のピーク。「Sushi Summer Event」と称してサイトを夏デザインにする計画も日記に残っている
- 2014年6月 — 累計10万人(100,279)
- 2015年3月 — 壊滅の危機。8台のサーバーが一斉に死んでいて、調べると steamcmd.sh が SIGBUS(不正なメモリアクセスによる異常終了)で落ちていた。strace や gdb(実行中プロセスの挙動を追うデバッグ道具)で追っても原因が掴めず、「なんかマシン自体の問題じゃね」とさくら VPS のノードを reboot したら直った。このとき累計は15万人(158,840)
- 2016年8月 — 確認できる最後の統計で累計257,822人
- ほぼ週単位で新しいカスタムマップを導入していた。更新履歴は当時の MOTD の Updates ページにそのまま残っている
最終的なサーバー構成は 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 が進まない
- 調査: カスタムマップでは BOT が地形に引っかかって進行不能になることが頻発していた
- 修理: スタックを検知して該当 BOT を破壊する機能を SourceMod で自作。2012年9月7日に #1 へ試験導入し、翌日「BOT のスタックキラー」として全サーバーに展開(当時の更新履歴より)。あわせて stuck 対策として wave のリスタート機能も実装し、これが公開プラグイン TF2 MvM Wave Restart につながった
プレイヤーがリスポンルームのシャッターに挟まる(mvm_diverge)
- 調査: マップを decompile して実装を確認し、
bot_teleportで BOT をシャッターの真下に置いて開閉実験。シャッターの開閉トリガーがOnStartTouchで実装されているため、BOT がシャッターの下にいるのに別のプレイヤーが離れた瞬間に閉じてしまい、その場にいた人が挟まる——という機序を特定 - 修理方針:
OnStartTouchAll(触れている全員が離れるまで開いたまま)で実装すればスタックしない、という検証記事を残している(2012年9月)
リスポン地点にスタックする(mvm_paradigm_a5)——直して配って、直後に公式が直す
- 修理: マップを decompile してリスポン地点を修正し、mvm_paradigm_a5_d1 として配布(decompile 版なので suffix は
_d+ バージョン番号、という命名まで決めている)。「オフィシャルで対応したらそれに差し替えたら良いぽよ」と書いた矢先、投稿直後に作者の fix 版が公開された。「まぁ俺のマップも同じ感じなので俺はめんどいので自作の fix 版そのままみたいな感じで」(2012年9月)
Tank が動かない(mvm_Scream_Tv)——再コンパイルを諦め、サーバー側で直す
- 調査: bsp から
vbspzipで同梱ファイルを抽出し、vmex で vmf に decompile。Tank の移動経路(path_track)がそもそもマップに存在しないことを発見 - 失敗: Hammer で path_track を設置して再コンパイルしたら LEAK 警告。Pointfile で場所を潰しても、マップを一切変更していないのに LEAK の位置が変わる怪現象に阻まれ、「詰んで終わってしまった。なんなんだろう。。」(2012年9月28日)
- 修理: 2日後、再コンパイル自体を放棄して Stripper:Source(マップデータを変えずにサーバー側でエンティティを注入する MOD)に切り替えた。path_track を47個注入して Tank の経路を作り、接続時に空しか映らない問題には info_observepoint を、Tank が爆弾を設置しても何も起きない問題には boss_deploy_relay を追加、BOT が落ちやすい場所は nav メッシュに nav_avoid を設定——1枚のマップの4つのバグをサーバー側だけでまとめて修理した(2012年9月30日)
テクスチャが紫・モデルが ERROR 表示(mvm_desert_fort)
- 調査: 必要なマテリアルやモデルが配布物に同梱されていないのが原因。この系統の直し方は2通りあると整理している(.res ファイルで自動ダウンロードさせるか、bspzip で bsp に同梱するか)
- 修理: 直した版を mvm_desert_fort_lite としてリリース(2013年6月)
popfile(wave 定義)がバグっている
- マップ本体でなく popfile 側の問題は作者に報告する側に回った。“Your popfile has 3 mistake point. Would you fix this code?” と修正コードを添えて英語で報告している(2012年9月・mvm_30wave_of_the_dead 2、2013年6月・mvm_sundown_a3)
- 報告癖はゲームの外にも向いていて、Steam ストアの誤字を報告したら Steam Trading Card の正式リリースで修正されていた(2013年6月)
カスタムマップサーバーを維持した理由
MvM カスタムマップサーバーを維持し続けた理由(2013年1月の日記):
どんなに面白いマップを頑張って作ってもそのマップを回してくれるサーバーがなかったら水の泡になっちゃう。それってすごい悲しいことだよね。そしてもったいない。だから俺はmvmのカスタムマップサーバーをこのまま維持しようかなーと思ってる。
そうしないとカスタムマップ作成の文化が滅びてしまうと思う。今主流のマップだってほとんどは誰かの作ったカスタムマップだったわけで、そういう文化殺すのはすげー良くない。いまのvalveのマッパーの人も昔はtf2mapsの普通のユーザーだった人もいるわけで。
Sushi 鯖はたくさんの人に支えられていた。設立初期のテストプレイにいつも付き合ってくれた SpaceMomonga さん(導入 Mod のほとんどは彼とのテストプレイから生まれた)、停滞期に Forum で新マップを助言してくれた Arilou さん、マップを提供してくれた Gadget さんをはじめとするマップ作者のみなさん——そしてここに名前を挙げきれない、テストプレイや Forum やゲーム内で関わってくれたたくさんのプレイヤーのみなさん。ありがとうございました。