モンストサーバーのプロファイル結果を共有するページを作る

2020年の11月ごろから約4ヶ月間SREグループのインターンとして@riita10069さんをお迎えして、『モンスターストライク(以下モンスト)』のサーバーサイドにいくつかのコミットをしてもらいました。本記事はそのうちの一つについて紹介します。
モンストサーバーでのプロファイリング
モンストサーバーでは、stackprof を使ったプロファイリングができるようにしてあります(これは SRE の神谷さんが用意してくれました)。常にプロファイリングする訳ではなく、専用のエンドポイントを叩くと、指定したAPIを指定した時間だけプロファイリングし、その結果をローカルに保存してくれます。安全面を考慮して、プロファイリングを開始するエンドポイントはローカルからのみ叩くことができます。
プロファイル結果は手元に持ってきて speedscope で閲覧していました。

課題:プロファイル結果の共有
前述したとおり、プロファイル結果はプロファイリングを実行したアプリケーションサーバーのローカルに保存されます。そのため、結果を手元へ持ってくるために scp をしたり、他のサーバーメンバーと共有するために Google Drive にあげたりなどなかなか大変でした。
ゴール:プロファイル結果が見れるページを作る
とにかく、もっと簡単にプロファイル結果を共有する仕組みが欲しいとなりました。
モンストには開発支援を行える管理ページがあります。なので、そこにプロファイル結果を共有し、サーバー開発者であれば誰でも閲覧できるようにして欲しいと考えました。また、プロファイル結果の共有もわざわざ scp で手元に持ってこなくても直接アップロードのようなことができたら理想でした。
作る
「管理ページから見れるようにする」と書きましたが、@riita10069さんにはそれ以外にもいくつか方法を考えて検証してもらいました。
特に最初は「GCSにあげて署名付きURLを発行して https://www.speedscope.app を利用する」方法を検討してくれてました。ただ、署名付きURLでは正確なアクセス制限ができないなどの理由で今回の手法をとることにしました。
プロファイル結果のアップロード
モンストのサーバーでは Capistrano を利用して複数のサーバーにデプロイしています。また、それぞれのサーバーにはロールを与えて使い分けています。例えば:
- デプロイ専用ロール(ここから各種サーバーへデプロイしたりコマンドを実行したりします)
- アプリケーションサーバーロール(モンスト本体の処理をします)
- 管理ツールロール(前述した管理ツールがここで動作しています)
- データベースロール
などがあります。
前述したとおり、プロファイリングは「アプリケーションサーバーロール」のいずれかのサーバーで行われ、その結果もそのサーバー自体に保存されてしまいます。なのでまずは、Capistrano を利用してプロファイリングを結果をデプロイ専用ロールのサーバーから開始し、その結果をデプロイ専用ロールのサーバーへ持ってくるようにしてもらいました。
そして次に、これを「管理ツールロール」へアップロードする仕組みを用意してもらいました。
これで、デプロイ専用ロールのサーバーから2つのコマンドを実行するだけで、プロファイリングからプロファイル結果の共有までが行えるようになりました。
プロファイル結果が見れるページ
あとはこのプロファイル結果を管理ページから見れるようにします。やることは次の3つです。
- 管理ページで speedscope を見れるようにする
- 管理ページでプロファイル結果をプロキシする
- 両方とも見れるユーザーに制限をかける
元々 speedscope を利用してプロファイル結果を見ていたので、まずは管理ツールの中で speedscope の Web ページを動作させ、管理ツールのドメインで speedscope を見れるようにしました。
そしたら次に、アップロードしたプロファイル結果のダンプファイルを管理ページでプロキシします。管理ページ自体も Padrino で動作しているので、とても簡単なルーティングを定義してあげるだけです。
最後にユーザーの制限ですが、管理ツールは自作しているゼロトラストプロキシの裏側で動作しており、閲覧できるユーザーをロールベースで細かく制限することが簡単にできます。なので、その設定を加えるだけです。
完成
バージョンアップやコラボなどの新しいイベントを挟むと大きくパフォーマンスが変化する可能性が高いので、それに合わせてプロファイル結果をためてみています。

現状、真面目に永続化はしていないので今後の課題ですね。
おしまい
Capistrano を触ること自体が初めてだったらしく(筆者もモンストサーバーに来てから触ったので、こういう分散系のツールは個人では使わないですよね)、なかなか苦労していましたが最終的にとても便利なものが出来上がり助かっています。ありがとうございました!