# コスト最適化スケーリング戦略

> コスト最適化スケーリング戦略に関する詳細なガイド。垂直および水平スケーリング戦略、判断基準、考慮すべき要素、Google Cloudにおけるリソース管理のベストプラクティスを紹介します。

- 公開日: 2024-09-20
- 更新日: 2024-09-24
- 著者: 青木 陸
- タグ: インフラ
- URL: https://tech.anycloud.co.jp/articles/scaling-strategy

---

Anycloudプロダクトマネージャーの青木です。

システムやアプリケーションのパフォーマンス向上を目指す上で、スケーリング戦略は欠かせない要素です。  
本記事では、垂直スケーリングと水平スケーリングの違い、判断基準、考慮すべき要素をまとめてみました。  
また、Google Cloudにおけるリソース管理のベストプラクティスも交え、コストを最適化しながら柔軟なスケーリングを実現するためのアプローチも解説しています。

## 概要

### スケールアップ / ダウン

#### 垂直スケーリング戦略

-   単一のサーバーにおけるCPUやメモリなどのリソースを増強 / 減弱して性能を向上 / 低下させること

<figure><img src="./image-001.webp" alt="スケールアップ / スケールダウン" width="4000" height="1587"></figure>

### スケールアウト / イン

#### 水平方向のスケーリング戦略

-   複数のサーバーやノードを追加 / 削減してシステム全体の処理能力を向上 / 低下させること

<figure><img src="./image-002.webp" alt="スケールアウト / スケールイン" width="4000" height="1317"></figure>

## 判断基準・考慮すべきこと

### 判断基準（ボトルネックの特定）

#### リソース使用率

-   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 は、インスタンスの起動とリクエストの処理を切り離しますが、リクエストは新しいインスタンスが起動するまで待機してから処理されることがあります。これは特にゼロからスケーリングする場合に起こります。これは「コールド スタート」と呼ばれます。
        
        <div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/run/docs/about-instance-autoscaling?hl=ja" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">Cloud Run サービスでのインスタンスの自動スケーリングについて &nbsp;|&nbsp; Google Cloud Documentation</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-01-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-01-image.webp" alt=""></a></div>
        

## Google Cloud Console 編

### 前提知識

-   パーセンタイル
    -   データを小さい順に並べたとき、初めから数えて全体のパーセントの位置する単位

### Cloud Run（アプリケーションサーバー）

#### リクエスト数

-   1秒間における処理されたリクエスト数。
-   多い場合は、CPU使用率にてリソースの飽和状況や最大同時リクエストの状況を確認してみよう。

#### リクエストのレイテンシ

-   リクエストが発生してからレスポンスが返されるまでの時間。
-   長い場合は、アプリケーション改善やコンテナの最適化を検討してみよう。
    
    <div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/blog/ja/products/gcp/3-ways-optimize-cloud-run-response-times" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">Cloud Run の応答時間を最適化する 3 つの方法 | Google Cloud 公式ブログ</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-02-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-02-image.webp" alt=""></a></div>
    

#### コンテナ インスタンス数

-   存在するコンテナ インスタンスの数 (状態別)。60 秒ごとにサンプリングされます。
-   多い場合は、CPUやメモリ使用率にてリソースの飽和状況、リクエストのパターンやピーク時の負荷状況を確認してみよう。

#### コンテナ CPU使用率

-   すべてのコンテナ インスタンスにおけるコンテナ CPU 使用率の分布。60 秒ごとにサンプリングされます。
-   高い場合は、アプリケーションの改善やCPUの性能増強を検討してみよう。

#### コンテナ メモリ使用率

-   すべてのコンテナ インスタンスにわたるコンテナ メモリ使用率の分布。60 秒ごとにサンプリングされます。
-   高い場合は、メモリリークしていないか等メモリ管理の見直しを検討してみよう。

#### 最大同時リクエスト

-   1 分間に各コンテナ インスタンスによって処理される同時リクエストの最大数の分布。「状態」=「アクティブ」でフィルターすると、アクティブなコンテナ インスタンスの同時実行数のみ取得されます。60 秒ごとにサンプリングされます。
-   多い場合、CPUやメモリ使用率にてリソースの飽和状況、リクエストのレイテンシ状況を確認してみよう。

#### 公式ドキュメント

-   CPU
    
    <div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/run/docs/configuring/services/cpu?hl=ja" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">サービスの CPU 上限を構成する &nbsp;|&nbsp; Cloud Run &nbsp;|&nbsp; Google Cloud Documentation</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-03-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-03-image.webp" alt=""></a></div>
    
    <div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/run/docs/configuring/cpu-allocation?hl=ja" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">サービスの課金設定 &nbsp;|&nbsp; Cloud Run &nbsp;|&nbsp; Google Cloud Documentation</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-04-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-04-image.webp" alt=""></a></div>
    
-   メモリ
    
    <div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/run/docs/configuring/services/memory-limits?hl=ja" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">サービスのメモリ上限を構成する &nbsp;|&nbsp; Cloud Run &nbsp;|&nbsp; Google Cloud Documentation</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-05-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-05-image.webp" alt=""></a></div>
    
-   最大同時リクエスト
    
    <div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/run/docs/about-concurrency?hl=ja" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">サービスの最大同時リクエスト数 &nbsp;|&nbsp; Cloud Run &nbsp;|&nbsp; Google Cloud Documentation</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-06-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-06-image.webp" alt=""></a></div>
    
-   自動スケーリング
    
    <div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/run/docs/about-instance-autoscaling?hl=ja" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">Cloud Run サービスでのインスタンスの自動スケーリングについて &nbsp;|&nbsp; Google Cloud Documentation</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-07-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-07-image.webp" alt=""></a></div>
    

### Cloud SQL（DBサーバー）

#### CPU 使用率

-   DBにおける負荷状況が把握できる
-   高い場合は、まずはスロークエリがないか等のクエリ最適化を検討してみよう。
    
    <div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/sql/docs/postgres/using-query-insights?hl=ja" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">Query Insights を使用してクエリのパフォーマンスを向上させる &nbsp;|&nbsp; Cloud SQL for PostgreSQL &nbsp;|&nbsp; Google Cloud Documentation</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-08-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-08-image.webp" alt=""></a></div>
    

#### 合計メモリ使用量

-   RAM（Random Access Memory: 実行中のプロセスやデータを一時的に格納するためのメモリ）
-   多い場合は、まずはメモリ管理の見直しを検討してみよう。

#### ストレージ使用量

-   格納されているデータの総量
-   多い場合は、まずは不要なデータを削除（データ整理）したり、不要なインデックス削除（インデックス最適化）したりできないかを検討してみよう。

#### アクティブな接続（最大接続数）

-   同時に処理できるクライアント接続の数
-   多い場合は、まずは適切な接続の設定や最適化を検討してみよう。

#### ⭐️コラム：DBにおけるスケールアウト

**リードレプリカ**

-   マスターDB（更新用）からレプリケーションされた参照専用DBのこと
    -   アプリケーション側で使い分けることによりDBの負荷分散を実現する

<div class="link-card-wrap"><a class="link-card" href="https://cloud.google.com/sql/docs/mysql/replication/manage-replicas?hl=ja" target="_blank" rel="noopener noreferrer"><span class="link-card-body"><span class="link-card-title">リードレプリカを管理する &nbsp;|&nbsp; Cloud SQL for MySQL &nbsp;|&nbsp; Google Cloud Documentation</span><span class="link-card-meta"><img class="link-card-favicon" src="./linkcard-09-favicon.ico" alt=""><span class="link-card-domain">cloud.google.com</span></span></span><img class="link-card-image" src="./linkcard-09-image.webp" alt=""></a></div>

## まとめ

スケーリング戦略は、コストとパフォーマンスを最適化するために不可欠な要素です。  
垂直・水平スケーリングの判断基準を理解し、リソースを効率的に管理し、ビジネスの成長に対応できる柔軟なインフラを構築することが可能です。  
もちろん、まだ未成熟な部分もあるかもしれませんが、今回紹介したガイドが最適なスケーリング戦略を選択する助けとなれば幸いです。
