【ゲームサーバ開発】大規模負荷に耐えられるサーバを作る。
負荷に耐えられるサーバを作る
ゲームサーバの命題の1つとして負荷に耐えうるシステムを作ることが挙げられます。
今回はスマホゲームアプリのゲームサーバにとって大規模負荷に耐えうるための大事なフェイズ、
そしてリリース前の最大の壁、「負荷テスト」について紹介します。
「負荷テスト」ってなんだ?
ゲームサーバは、ゲームアカウントをはじめとするプレイヤーデータを保存・提供したり、アイテム売却や合成をするなど、ゲームを進行するために必要な各種機能を提供するアプリケーションです。地味ですが大事な役割です。
ユーザが実際に目にするゲームクライアントは、見えないところでこのゲームサーバとやりとりをしています。
ということはクライアントの数だけサーバにアクセスが来るということです。
サーバ資源も有限なので数多くのクライアントがサーバに一斉にアクセスされたらサーバがダウンしてゲームの進行に支障をきたしてしまいます。
そういった障害が発生しないように作ったサーバアプリケーションに対して、
①大規模アクセスに耐えられるようにサーバをチューニングし、②システムのポテンシャルを知る作業が「負荷テスト」です。
簡単に触れていきます。
①ゲームサーバのチューニング
サーバをチューニングするためには、負荷をかけねばなりません。
企画やインフラ部隊と協力して負荷掛けのための準備をしていきます。
ゲームをするであろうユーザ数を想定し、ゲームをする人が通信するであろうシナリオを作成し、想定ユーザ数分だけシナリオを流します。
実際に負荷を流してみたところでこれまで見えてこなかった
ソフトウェア、ハードウェア面それぞれの問題を知ることができます。
1.ソフトウェア面でわかること
・同時アクセスならではのバグ
・負荷のボトルネックとなっている処理
2.ハードウェア面でわかること
・APIサーバ、DB、KVSなどのゲームサーバを構成する各種要素の必要スペック、台数
これらをサーバアプリケーションや、ミドルウェアのログ、各サーバのCPU/メモリ負荷、ミドルウェアの設定、ゲームサーバのコネクション数やプール数など様々な情報を確認しつつ修正したり、調整したりして負荷に強いサーバを作っていきます。
ゲームプログラムだけではなく、インフラのCPU/メモリ負荷・クエリの呼び出し頻度・最大コネクション数・プール数など、普段見ない指標や設定を分析して試行錯誤する必要があるので、サーバエンジニアとしてすごくいい経験が積めるタスクでもあります。
②システムのポテンシャルを知る
想定負荷に耐えきるサーバプログラムとシステム構成が出来上がったらシステムのポテンシャルをある程度知ることができると思います。
- n台のAPIサーバでxxxx万ユーザ分耐えられた。
- 1台あたり何req/secに耐えられた。
- 負荷や並列処理に対応できるソフトウェアの組み方。
こういった情報・経験はリリース後に重要な情報になります。
高負荷を避けられるプログラムの組み方はリリース後のアップデート開発で生きていきます。
あくまで負荷試験で行ったのは想定の負荷なので実際の負荷なんてリリースしてみないとわかりません。
想定より負荷に大きな差があった場合、どの程度サーバ構成を変更すればよいかの検討材料になります。
最後に
簡単ですが、大規模負荷に耐えるサーバを作るための「負荷テスト」について説明させていただきました。
いちエンジニア視点では毎回苦労するタスクなのですが、強いシステムを作るのに絶対欠かせない作業と感じます。