オンラインゲームサーバーの開発
著者: 節政 暁生私はオンラインゲームの開発運営に関わって十数年になります。当然何度もリリースを経験していますが、未だにサーバー運営を開始する時は「ユーザーが殺到してサーバーのトラブルが発生するのではないか」と緊張します。何がそんなに難しいのでしょうか?未然に防ぐにはどうしたら良いでしょうか?
まず、考えるべきはゲームデザインです。ゲーム設計の段階から、バグやボトルネックになりそうな部分を排除しておくのが一番効果的だからです。数万人規模の人が繋いだ時の帯域消費や負荷を計算して、それに合わせてゲームを作成します。残念ながらネットワークの帯域増加や遅延の減少などの進化はそんなに早くありません。なので、いつでもパケットは少なければ少ないほど良いです。差分を取ってデーターを圧縮する、本当に必要になるまでパケットを送信しない、ユーザーの視界範囲外のパケットを削減する等色々な対策をして行きます。
プログラム開発ではバージョン管理、自動ビルド、自動チェック、ソースコード静的解析、といった定番の環境はほぼ必須といえるでしょう。バグになりそうな部分は、静的解析ツールを毎朝自動的に適用することで格段にバグが減ります。また、パターン化出来るプログラムは、ツールで自動生成出来るようにして行きましょう。数が増えるほどその効果は高まります。肝心なのはこれらのツールの運用ルールです。修正の手順からコメントの書き方まで、ワークフローを細かく決めてチームで共有します。ツールを使う人間側のミスを減らすためです。
ネットワークゲームのユーザーは多人数で複雑な状態が生じるため、再現が極めて困難なバグが発生します。再現しないバグは「気のせい」で済ませたくなりますが残念ながらそうはいきません。どんなに発生頻度の低いバグでも、数万人規模のユーザーが本気で遊ぶとあっさり表面化します。つまり、一度でも出たバグは確実にデバッグ出来るように備えなければなりません。その為には、バグが出た場合に自動通知する仕組みが必要です。クライアント、サーバー両方のプログラムで、例外やASSERTが発生した際のメモリダンプやスタックトレースをメールで通知するようにしましょう。誰のどのPCでバグが出ているか解れば、その場でプロセスにアタッチして状況を見る事も出来るはずです。
サーバー内部で何が起きているかを把握するために、ユーザーのあらゆる行動を記録するログの仕組みも必要です。ログは毎日数十GB単位で増えていきます。分析をするだけでも大変ですが、まずは全て記録してバグを取る事を優先します。ログを減らすのは後でも出来ます。本番稼働中の負荷状況を知るため、簡易プロファイラー機能を作成します。各関数が何回呼ばれて、平均何μ秒かかっているか、といった情報を記録してボトルネックがすぐ解るようにしておきましょう。
ここまでは自分たちの作ったプログラムへの対策ですが、他にもサーバー、ネットワーク機器、OS、ライブラリ、データーベースといった他人の作った物にも対策が必要になります。この手のものは特定の負荷を超えるとトラブルを起こす事が多いです。組み合わせによる問題もあり、なるべく実環境に近い形での限界テストが必要になります。このためには数万人規模の高負荷をかけられる様なダミークライアントを用意します。PCが数十台必要になる事もあり、環境を揃えるのは大変ですが、その効果は高いと言えるでしょう。
このように様々な対策をしているわけですが、それでもなおトラブルが出るのがオンラインゲーム開発の辛い所です。事前に出来る事は何でもやる気持ちでくじけず頑張りましょう。