FGO を支える負荷試験ツール

V
shiguredo
Published in
5 min readJul 11, 2018

これはアカツキディライトワークスが共同で主催している “FGOなど大規模ゲームの課題から学ぶゲームサーバ・インフラ勉強会” での LT 発表資料です。こちらの資料に軽く補足を入れながら話をしていきます。

時雨堂では FGO の検証に利用するための負荷試験ツールを提供しています。

先日、大きめのメンテナンスが無事終わり、ほっとしています。

さて、メンテが無事終わって、FGO の中の人から以下のようなありがたいメッセージをもらいました。

負荷試験ツールなくしては今回の改修はなしえなかったと思いますので本当にありがとうございました…。

その負荷試験ツールがどんな仕組みで、どんなことを実現しているのかを書いていきます。時雨堂が負荷試験ツールで実現したことのみを書きます。

主に技術的な話というよりはこんなことやったよがほとんどです。

本番データを利用した負荷試験

利用されている負荷試験ツールは、時雨堂が1から開発したオリジナルです。Erlang/OTP を利用して開発されています。そのツールに対して FGO 向けの機能を追加したものを利用してもらっています。ちなみにその機能はツールに取り込んでしまいました。

負荷試験は本番試験と同等の環境をもう一面構築してもらい行いました。データベースも本番と同等です。FGO 側の環境には一切時雨堂側では触っていません、むしろ触れなくしてもらいました。あくまで API 経由でのみのアクセスしかできません。

今回の負荷試験の目的は「本番データを使って本番ユーザをシミュレーションして負荷をかける」というものです。

つまり「できる限り本番と同じような負荷を再現する仕組みを作る」ということでした。

結果を先に書くと、本番に限りなく近い負荷を継続的に、簡単にかけられる仕組みを実現しました。

Lua でシナリオを書く

そこで今回、実現したのはユーザ一人一人をシミュレーションできるようにすることです。

Erlang 1 軽量プロセス、1 ユーザで実現しました。さらにそのシミュレーションのシナリオは Lua で書くことができるようにしました。Lua on Erlang VM なので、通常の Lua とは違います。

Lua でシナリオを書くことでプログラマブルにシナリオを書けるようになりました。複雑なシナリオも実現可能です。

分散環境で

1 台のサーバから大規模な負荷をかけるのは難しいため、master/minion モデルを取りました。master は 1 台、minion は負荷をかけたい台数分。

分散の仕組みはそんなに複雑なものではないですし、アピールする部分でもないので省略します。

分散環境で負荷をかけると一番先に引っかかるのが帯域です。1 MB のファイルを 10000 ユーザがダウンロードすると 10000Mbps です。つまり 10Gbps です。もし負荷試験をやる場合は気をつけてください。

とにかく簡単に

シェルスクリプトを叩くだけで用意されたシナリオが分散環境に配置されて、大規模な負荷をかけられるようにしました。

使う側は負荷をかけられるのが大事なのであって、使いこなしたいわけではありません。ここは重要です。

バグも見つけられる

シナリオ型の負荷試験は通常の単純なテストと違います。実際の動作よりもひどい動きをさせています。

そのため、今回は実際いくつかのバグも発見しました。さらに負荷は簡単にかけられるため再現も簡単です。

これはとても良い結果で嬉しかったです。

異常系のテストもできる

負荷試験ツールを利用して負荷が起こった状態で問題が起きた状況を再現できます。つまり異常系です。これを事前にかなりテストできたのは大きかったと中の人から伝えられました。

ただ API を叩くだけではなく本番のユーザに近い動作をするシミュレーション型の負荷試験だからこそ実現できたのだと思います。

いいことばかりに見えるが

さて、ここまで見るといいことばかりに見えます。実際「使う側」はそうです。ただ、使うシナリオを書いたり、ツールを開発するにはかなりの労力と時間を費やしています。

特にツールを使ってシナリオの検証をひたすら行うのは地獄です。この部分は時雨堂の社員が相当頑張ってくれました。

ちなみに、この社員が噂の FGO の要望に「リリース前の負荷試験」と書いた社員です。まさか自分でそのリリース前に負荷試験をすることになるとは思わなかったでしょう。

シナリオは実際ほぼほぼクライアントに限りなく近い実装を Lua で起こす必要があります。さらに FGO を熟知する必要もあります。

かなりしんどい作業で、実際仕様通りに動かないなんてこともよくある話です。その場合の仕様確認などをしながらのシナリオ作りは相当大変です。

本気の負荷試験をやるには負荷試験専門家、負荷試験ツール開発者、負荷試験のための本番と同等の環境を維持する覚悟が必要になります。はっきり言って普通に大変です。

つまり、負荷試験を本気でやると相当大変です。覚悟がない限りオススメできません。ただ行う価値は凄くあります。当たり前です、本番で起きるであろう負荷を事前に誰にも迷惑がかからない状態で試せるわけですから。

まとめ

今回 FGO チームはその覚悟を持って取り組んでくれました。正直かなりしんどかったです。ただ結果として本当に大きな成果が出せたと思います。

負荷試験は相当理解が必要な試験です。そして簡単に実現することはできませんし、ノウハウも必要ですし、連携も必要です。それをすべて受け入れ一緒に頑張ってくれた FGO チームに感謝しています。

今後も時雨堂は FGO を裏方として支えていければと思います。

--

--