コスト最適化スケーリング戦略
公開日2024.09.20
Anycloudプロダクトマネージャーの青木です。
システムやアプリケーションのパフォーマンス向上を目指す上で、スケーリング戦略は欠かせない要素です。
本記事では、垂直スケーリングと水平スケーリングの違い、判断基準、考慮すべき要素をまとめてみました。
また、Google Cloudにおけるリソース管理のベストプラクティスも交え、コストを最適化しながら柔軟なスケーリングを実現するためのアプローチも解説しています。
概要
スケールアップ / ダウン
垂直スケーリング戦略
- 単一のサーバーにおけるCPUやメモリなどのリソースを増強 / 減弱して性能を向上 / 低下させること
スケールアウト / イン
水平方向のスケーリング戦略
- 複数のサーバーやノードを追加 / 削減してシステム全体の処理能力を向上 / 低下させること
判断基準・考慮すべきこと
判断基準(ボトルネックの特定)
リソース使用率
- CPU、メモリ、ディスクI/O等のリソース使用率が高いか
コスト効率
- スケールアップ / ダウン、スケールアウト / インどの方法がコスト効率が高いか
- 常に起きている問題なのか、突発的な問題なのか
性能要求
- アプリケーションの要求に対して、リソースの処理能力が足りているか
アプリケーションの特性
- アプリケーションが高性能なCPUの機能や最適化に対応しているか
- 例:マルチスレッド対応
考慮すべきこと
アプリケーションのパフォーマンス改善余地がないか
- 処理速度を改善するために、効率的なアルゴリズムの変更
- クエリ最適化
- インデックスの適用
- スロークエリの改善
- リソースの効率的な管理
- メモリリークを防ぎ、効率的なメモリ管理
- キャッシュの利用
- etc.
次、ボトルネックになるところはどこか(負荷予測)
- システムやアプリケーションが将来的にどの程度のリソースを消費するかを予測するプロセス
Web / mobile / Desktop etc.
- CPU
- メモリ
- 同時リクエスト数
DB
- CPU
- メモリ
- ストレージ
- データ量
- 最大接続数
API
- CPU
- メモリ
- 同時リクエスト数
外部API
- Rate Limit
- リクエスト数
- クォータ(例:1時間、1日)
- トークンバケット式
⚠️注意事項
- ダウンタイムの対策
- サービスが停止している時間のこと
- 例:最低限としてリクエストが少ない時間帯にする
- Cloud SQLの場合、数分かかる。
- GCP Cloud Runにおける自動スケーリングでは、考慮されている
Cloud Run は、インスタンスの起動とリクエストの処理を切り離しますが、リクエストは新しいインスタンスが起動するまで待機してから処理されることがあります。これは特にゼロからスケーリングする場合に起こります。これは「コールド スタート」と呼ばれます。
- サービスが停止している時間のこと
Google Cloud Console 編
前提知識
- パーセンタイル
- データを小さい順に並べたとき、初めから数えて全体のパーセントの位置する単位
Cloud Run(アプリケーションサーバー)
リクエスト数
- 1秒間における処理されたリクエスト数。
- 多い場合は、CPU使用率にてリソースの飽和状況や最大同時リクエストの状況を確認してみよう。
リクエストのレイテンシ
- リクエストが発生してからレスポンスが返されるまでの時間。
- 長い場合は、アプリケーション改善やコンテナの最適化を検討してみよう。
コンテナ インスタンス数
- 存在するコンテナ インスタンスの数 (状態別)。60 秒ごとにサンプリングされます。
- 多い場合は、CPUやメモリ使用率にてリソースの飽和状況、リクエストのパターンやピーク時の負荷状況を確認してみよう。
コンテナ CPU使用率
- すべてのコンテナ インスタンスにおけるコンテナ CPU 使用率の分布。60 秒ごとにサンプリングされます。
- 高い場合は、アプリケーションの改善やCPUの性能増強を検討してみよう。
コンテナ メモリ使用率
- すべてのコンテナ インスタンスにわたるコンテナ メモリ使用率の分布。60 秒ごとにサンプリングされます。
- 高い場合は、メモリリークしていないか等メモリ管理の見直しを検討してみよう。
最大同時リクエスト
- 1 分間に各コンテナ インスタンスによって処理される同時リクエストの最大数の分布。「状態」=「アクティブ」でフィルターすると、アクティブなコンテナ インスタンスの同時実行数のみ取得されます。60 秒ごとにサンプリングされます。
- 多い場合、CPUやメモリ使用率にてリソースの飽和状況、リクエストのレイテンシ状況を確認してみよう。
公式ドキュメント
- CPU
- メモリ
- 最大同時リクエスト
- 自動スケーリング
Cloud SQL(DBサーバー)
CPU 使用率
- DBにおける負荷状況が把握できる
- 高い場合は、まずはスロークエリがないか等のクエリ最適化を検討してみよう。
合計メモリ使用量
- RAM(Random Access Memory: 実行中のプロセスやデータを一時的に格納するためのメモリ)
- 多い場合は、まずはメモリ管理の見直しを検討してみよう。
ストレージ使用量
- 格納されているデータの総量
- 多い場合は、まずは不要なデータを削除(データ整理)したり、不要なインデックス削除(インデックス最適化)したりできないかを検討してみよう。
アクティブな接続(最大接続数)
- 同時に処理できるクライアント接続の数
- 多い場合は、まずは適切な接続の設定や最適化を検討してみよう。
⭐️コラム:DBにおけるスケールアウト
リードレプリカ
- マスターDB(更新用)からレプリケーションされた参照専用DBのこと
- アプリケーション側で使い分けることによりDBの負荷分散を実現する
まとめ
スケーリング戦略は、コストとパフォーマンスを最適化するために不可欠な要素です。
垂直・水平スケーリングの判断基準を理解し、リソースを効率的に管理し、ビジネスの成長に対応できる柔軟なインフラを構築することが可能です。
もちろん、まだ未成熟な部分もあるかもしれませんが、今回紹介したガイドが最適なスケーリング戦略を選択する助けとなれば幸いです。