Slide 1

Slide 1 text

『GO』アプリ バックエンドサーバのコスト削減 2025.01.28 GO株式会社 武村 直和

Slide 2

Slide 2 text

© GO Inc. 2 自己紹介 GO株式会社 バックエンド開発部 / 武村 直和 タクシーアプリ『GO』のバックエンドサーバの開発・運用を担当。 シーズン券を買って毎週スキー場に通ってます!

Slide 3

Slide 3 text

© GO Inc. 3 01 概要

Slide 4

Slide 4 text

© GO Inc. 4 GOのシステム全体構成と発表箇所 バックエンド 分析環境 バックエンド (App Engine) 次世代 バックエンド (Kubernetes) キュー (Pub/Sub) 分析ログ データ 基盤 (BigQuery) RDB (Cloud SQL) フロントエンド 次世代 サーバログ基盤 (Loki) サーバログ基盤 (Cloud Logging) S3 キュー (Pub/Sub) 車載位置ログ サーバ ログ サーバ ログ ユーザー アプリ ドライバーア プリ 発表箇所

Slide 5

Slide 5 text

© GO Inc. 5 02 Cloud SQLのコスト削減

Slide 6

Slide 6 text

© GO Inc. 6 ● Cloud SQLでは既存のEnterpriseプランに加えて、パフォーマン ス・可用性が向上したEnterprise Plusが追加 ○ DBバージョン更新時のダウンタイムが10秒未満に短縮 ○ これまでは数ヶ月に一度、DB更新のために設けていた メンテナンス時間が不要に ● 代償としてDBコストが約6割増 課題:契約プランをアップグレードしたらコスト上昇

Slide 7

Slide 7 text

© GO Inc. 7 作戦:クエリの削減・改善 ● 現状、CloudSQLはプライマリとレプリカ複数台を組み合わせた 構成をしている ● そこで、レプリカの台数を減らすために、負荷の軽減を目指した ● 具体的には (1) 負荷のクエリの特定(Query Insightの利用) (2) クエリの改善

Slide 8

Slide 8 text

© GO Inc. 8 調査:改善すべきクエリの特定。Query Insightの利用 ● Query InsightはCloud SQL上で負荷の高いクエリを可視化できる ○ 公式ガイド : https://cloud.google.com/sql/docs/mysql/using-query-insights ● 負荷の高いクエリは以下の特徴を持つ ○ 平均実行時間が長い(平均スキャン行数が多い) ○ 呼び出し回数が多い Query Insightの例(正規化されたクエリ毎の統計情報)

Slide 9

Slide 9 text

© GO Inc. ● 平均実行時間の長いクエリに対する改善 ○ SQLチューニングでパフォーマンスを改善 ■ 平均スキャン行数 が 返された平均行数 よりも多い場合はクエリ効率が悪い ため、なるべく近い行数になるようにインデックスを追加 ■ より高度なチューニングが必要な場合はQuery Insightの公式ガイドや SQL実行計画(Explain)を参照 ● 呼び出し回数の多いクエリに対する改善 ○ キャッシュを利用することで呼び出し回数を削減 ■ データの変更頻度に比べて呼び出し頻度が多いクエリに適用 ■ Google CloudのフルマネージドキャッシュサービスであるMemorystoreを利用 ● Redis、Valkey、Memcacheを利用可 ● https://cloud.google.com/memorystore 9 改善:インデックス追加、キャッシュ利用 etc.

Slide 10

Slide 10 text

© GO Inc. ● クエリ削減・改善によりレプリカDBの負荷が下がり、インス タンスを削減しても十分負荷に耐えられることを確認 ● レプリカインスタンス削減によりコストを20%削減 10 結果:レプリカDBの削減に成功。20%削減

Slide 11

Slide 11 text

© GO Inc. 11 03 App Engineインスタンス削減

Slide 12

Slide 12 text

© GO Inc. ● App Engineでユーザー・ドライバー向けアプリからのリクエストを処理して いる ● App Engineはリクエストに比例してオートスケールでインスタンス台数が増 えるため、利用の増加に伴いによりGoogle Cloudコストの約20%を占めるよ うになっていた 12 課題:利用者数の増加に伴いコストが上昇

Slide 13

Slide 13 text

© GO Inc. 13 ● App Engineは、各インスタンスの同時リクエスト数及びCPU使用率 を減らすことで、オートスケールの台数を減らすことができる ○ 同時リクエスト数低減 ■ リクエスト処理時間を短縮 →前章でクエリの処理時間を短縮したことで、CPUのI/O Waitを削減 ○ CPU使用率低減 ■ CPU消費が多い処理の特定・改善 →Cloud Profilerを利用して調査 作戦:リクエスト処理時間短縮とCPU消費削減

Slide 14

Slide 14 text

© GO Inc. 14 調査:改善すべき処理の特定。Cloud Profilerの利用 ● Cloud ProfilerはGoogle Cloud上で実行するプログラムのプロ ファイリングデータを簡単に取得・可視化できるツール ○ https://cloud.google.com/profiler/docs/about-profiler ● CPU時間が多い処理は以下 ○ 通信処理 ■ 大部分がDBアクセス ○ 通信後のJSON処理

Slide 15

Slide 15 text

© GO Inc. 15 改善:通信削減、JSON処理ライブラリ変更 ● 通信削減は前章の呼び出し回数削減と同様 ○ キャッシュ化 ● JSON処理ライブラリ変更 ○ 別サービスへのHTTP通信のレスポンスJSONをGo構造体に変換する ために使用するUnmarshal関数のCPU負荷が高い ○ 標準ライブラリから goccy/go-json に変更 ■ 標準ライブラリとの互換性を持たせたうえで最速を目指して開発された ■ JSON処理時間が短くなることでCPU時間を削減できる ○ JSON処理のCPU時間が75%減

Slide 16

Slide 16 text

© GO Inc. 16 ● オートスケール抑制により、インスタンスコストを約20%削減 ● 今後もリクエスト増加が見込まれるため、今回実施した削減の効 果を継続的に享受できる 結果:スケーリング抑制によりコストを20%削減

Slide 17

Slide 17 text

© GO Inc. ● Cloud SQLのクエリ改善によりレプリカインスタンスを削減して コストを約20%削減 ● App Engineのスケーリング抑制により、コストを約20%削減 ● Query InsightやCloud ProfilerなどのGoogle Cloudのツールを用 いることにより、少ない手間で調査が可能 17 まとめ

Slide 18

Slide 18 text

© GO Inc. 文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください