「第5回 Game Engineers Meetup – 負荷試験特集」に弊社エンジニアが登壇しました

WRITER: Taka
2023/11/20

弊社エンジニアが、Google社主催の「第5回 Game Engineers Meetup – 負荷試験特集」において、「Cloud Run を用いたゲームタイトル開発」というタイトルで登壇させていただいたので、その時の内容をご紹介します。

 

1. Google Cloud 導入の経緯

Google Cloud の利用を通じて解決したいこと

  • フルマネージドな環境に切り替えることで、インフラ管理コストを削減したい
    • 特に Cloud Spanner を使いたい
      特定の施策だけ DB の CPU 使用率が高い場合、インスタンスタイプを毎回変更する必要があった
  •  社内にノウハウをためたい

 

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つ確認を行いました。

  1. Cloud Logging を確認する
  2. アプリレベルのタイムアウト
  3. ダウンストリーム ネットワークのボトルネック
  4. 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 ともに未経験の社内メンバーでしたが、互いに情報共有しながら ローンチまで実現できたのは弊社にとっても良い財産になりました。
他社様も機会があれば是非チャレンジしていただきたいです。