弊社エンジニアが、Google社主催の「第5回 Game Engineers Meetup – 負荷試験特集」において、「Cloud Run を用いたゲームタイトル開発」というタイトルで登壇させていただいたので、その時の内容をご紹介します。
目次
1. Google Cloud 導入の経緯
Google Cloud の利用を通じて解決したいこと
- フルマネージドな環境に切り替えることで、インフラ管理コストを削減したい
- 特に Cloud Spanner を使いたい
特定の施策だけ DB の CPU 使用率が高い場合、インスタンスタイプを毎回変更する必要があった
- 特に Cloud Spanner を使いたい
- 社内にノウハウをためたい
Google Cloud 移行への課題
AWS からの Google Cloud 移行する際の課題点
- 社内に Google Cloud 経験者がほぼいない
- Cloud Run の知識がない
- Cloud Spanner の知識がない
- (Google Cloud の関係ないですが、言語も Golang を採用したが、業務での経験者ゼロでした )
2. 事例タイトル紹介
Google Cloud を利用したゲームタイトル「サクコイ」を事例とし報告します。
- タイトル: サクコイ
- ジャンル: 恋愛シミュレーション
- 公開日: 2023 年 7 月
___
3. アーキテクチャ紹介
4. 負荷試験準備
負荷試験を迎えるにあたり行った 事前準備
- 負荷試験クライアント設定
- 負荷試験の性能目標値の設定
- シナリオの作成とプレテスト
負荷試験クライアント設定
- Locust を採用
- GKE での実行
- Pod のリソースは十分か?
- Worker node の数は調整可能か?
負荷試験の性能目標値
- 想定 RPS の設定
- Latency の値を50,95,99% tile 毎に目標値設定
シナリオの作成とプレテスト
- API 単体 & ユーザアクション毎で テストできるようにシナリオ作成
- 低スペック環境で強めの負荷をかけ、シ ナリオのバグ潰し
5. 負荷試験実施
当然のように問題は発生したので、起きた問題と対応方法について紹介します。
発生した問題
- Cloud Spanner Lock Wait の発生
- Cloud Run で 503 エラーが頻発
Cloud Spanner Lock Wait の発生
Cloud Spanner 側で発生した問題として、 Lock Wait の発生がありました。
コンソール内 Lock Insights から発生を確認することができます。
また、Lockstatisticsから、どテーブルに対し、どキーで Lockが発生したかを確認できます。
Cloud Spanner Lock Wait の解決
1 リクエスト内の処理で、トランザクションを使い分けるように 修正しました。
Cloud Spanner Lock Wait が発生する別ケースの紹介
Lock Insights からグラフの振れを確認することはできるが、Lock statistics が表示されないケースもある。
この場合、Cloud Spanner 内部の処理(Split の分割など)によるものが原因で描画されることがある。
同時間帯で Transaction の Latency に影響出るようであればサポートへ相談しましょう。
Cloud Run で 503 エラーが頻発
負荷をかけ始めて数分経過すると、 503 エラーが頻発する事象が発生しました。トラブルシューティングが 公式ドキュメント にあるので、1つ1つ確認を行いました。
- Cloud Logging を確認する
- アプリレベルのタイムアウト
- ダウンストリーム ネットワークのボトルネック
- 1 つのコンテナへのインバウンド リクエストの上限
1つのコンテナへのインバウンド リクエストの上限とは?
コンテナ インスタンス あたりの リクエスト レート を見積もることにしました。
計算に必要な変数は:
1. concurrency
2. median_request_latency
コンテナ インスタンスあたりのリクエスト レートを計算
● concurrency の確認
Cloud Run コンソール内の 「新しいリビジョンの編集とデプロイ」から Maximum concurrent requests per instance の値を確認してください
● Median_request_latency の確認
モニタリング内の「 Metrics Explorer」から
503 エラー発生時の 50 % tile の Latency の値を 確認してください
計算結果と対応について
- concurrency : 60
- median_request_latency 48ms
計算式 「concurrency * (1sec) / median_request_latency」 に当てはめると、 60 * (1/0.048) = 1250
↓
対応策
公式ドキュメントに沿って、 concurrency の値を調整することで解決
median_request_latency の値はゲームの仕様、実装、環境のスペックなどに左右されると思いますので、 各タイトルごとにあった concurrency の値を負荷試験段階で見つけておくことをおすすめします。
6. まとめ
● Google Cloud を使用したゲームタイトル開発の事例として “サクコイ”の例を紹介
● ゲーム仕様とアーキテクチャを紹介
● 負荷試験前の準備について紹介
● 負荷試験時に発生した問題と対応方法について紹介
〜Google Cloud を使ってみての感想〜
当初 AWS からの移行にはかなり不安がありました。
しかし、カスタマーエンジニアの方々のサポートや、ドキュメントやブログ記事の充実さから、 問題が発生しても調査できる状況にありましたので、徐々に不安も取り除かれていきました。
最後に、Google Cloud / Golang ともに未経験の社内メンバーでしたが、互いに情報共有しながら ローンチまで実現できたのは弊社にとっても良い財産になりました。
他社様も機会があれば是非チャレンジしていただきたいです。