CPU の割り当て(サービス)

デフォルトでは、Cloud Run インスタンスにはリクエストの処理中、コンテナの起動中、シャットダウン時にのみ CPU が割り当てられます(インスタンスのライフサイクルをご覧ください)。この動作を変更すると、受信リクエストがない場合でも CPU が常に割り当て、利用可能な状態にすることができます。CPU を常に割り当てるように設定すると、短期のバックグラウンド タスクやその他の非同期処理タスクの実行に利用できます。

CPU 割り当てモードのイラスト

CPU が常に割り当てられている場合でも、Cloud Run の自動スケーリングは引き続き有効であり、受信トラフィックやリクエスト以外の CPU 使用率の処理に必要ないインスタンスは停止できます。リクエスト処理後 15 分を過ぎるとインスタンスのアイドル状態は解除されます(ただし、最小インスタンス数を使用してアクティブ状態が保持されている場合は除きます)。

CPU に常に多数の最小インスタンスを割り当てると、多数のインスタンスが起動され、CPU リソースへの完全アクセス権が付与されます。これにより、バックグラウンド処理のユースケースが有効になります。このパターンを使用すると、サービスがリクエスト以外で CPU を使用している場合でも、Cloud Run はインスタンスの自動スケーリングを適用します。

ヘルスチェック プローブを使用する場合、CPU はすべてのプローブに割り当てられます。課金の詳細については、コンテナ ヘルスチェック プローブをご覧ください。

料金への影響

リクエストの処理中にのみ CPU を割り当てる場合は、各リクエストでインスタンスがリクエストを処理した場合にのみ課金されます。CPU の常時割り当てを設定すると、インスタンスのライフサイクル全体で料金が発生します。詳細については、Cloud Run の料金表をご覧ください。

Google の Recommender が、過去 1 か月間に Cloud Run サービスが受信したトラフィックを自動的に調べ、料金が安い場合、リクエスト時に割り当てられる CPU から常に割り当てられる CPU に切り替えるよう推奨します。

適切な CPU 割り当てを選択する方法

ユースケースに適した CPU の割り当ては、トラフィック パターン、バックグラウンド実行、コストなど、いくつかの要素によって異なります。以降のセクションでは、これらの要素について説明します。

トラフィック パターンに関する考慮事項

  • 受信トラフィックが散発的か、バーストまたは急増する場合は、リクエストの処理中にのみ CPU を割り当てることをおすすめします。
  • 受信トラフィックが安定して緩やかであれば、CPU を常に割り当てることをおすすめします。

バックグラウンド実行に関する考慮事項

[CPU を常に割り当てる] を選択すると、レスポンスを返した後に短期のバックグラウンド タスクなどの非同期処理を実行できます。次に例を示します。

  • バックグラウンドでの実行が想定される OpenTelemetry などのモニタリング エージェントを利用する。
  • Go の Goroutine、Node.js async、Java スレッド、Kotlin コルーチンを使用する。
  • 組み込みのスケジューリング / バックグラウンド機能に依存するアプリケーション フレームワークを使用する。

アイドル状態のインスタンス(最小インスタンスを使用してウォーム状態を維持したインスタンスを含む)は、いつでもシャットダウンできます。コンテナが終了する前に未処理のタスクを完了する必要がある場合は、SIGTERM をトラップして、インスタンスが停止するまでに 10 秒の猶予期間を設けることができます。

非同期タスクの実行には、Cloud Tasks の使用を検討してください。Cloud Tasks は、失敗したタスクを自動的に再試行し、最大 30 分の実行時間をサポートします。

費用に関する考慮事項

現在、[リクエストの処理中にのみ CPU を割り当てる] を使用していて、次のような場合は、[CPU を常に割り当てる] のほうが経済的です。

  • Cloud Run サービスが、現在の多くのリクエストを一定の速度で処理している。
  • インスタンス数の指標で、アイドル状態のインスタンスが多くない。

料金計算ツールを使うと、費用の差額を見積もることができます。

CPU が常にゼロからスケーリングされて割り当てられる

ゼロからのスケーリングはリクエストによってのみトリガーされるため、リクエストを処理していないサービスはゼロからスケーリングできません。これらのワークロードでは、最小インスタンス数を 0 より大きい値に設定するか、ゼロにスケーリングした後に処理を再開するように設計に「ウェイクアップ リクエスト」を追加します。

CPU が割り当てられる際に常にゼロにスケーリングされる

CPU 使用率が 0% のインスタンスは存在しないため、すべての CPU 使用率を確認してもゼロにスケーリングされることはありません。つまり、1 から 0 へスケーリングすることは、インスタンスがリクエストを処理しているかどうかを確認することによってのみ決定できます。

CPU 割り当ての設定と更新

構成を変更すると、新しいリビジョンが作成されます。明示的に更新しない限り、以降のリビジョンでも、この構成が自動的に設定されます。

CPU の常時割り当てオプションを選択する場合は、512 MiB 以上のメモリを指定する必要があります。

デフォルトでは、各コンテナ インスタンスのリクエストの処理中にのみ CPU が割り当てられます。この設定は、新しいサービスの作成時または新しいリビジョンのデプロイ時に、Google Cloud コンソール、gcloud コマンドライン、YAML ファイルを使用して変更できます。

コンソール

  1. Google Cloud コンソールで、[Cloud Run] に移動します。

    Cloud Run に移動

  2. デプロイ先の新しいサービスを構成する場合は、[サービスを作成] をクリックします。既存のサービスを構成する場合は、サービスをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。

  3. 新しいサービスを構成する場合は、最初のサービス設定のページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックしてサービス構成ページを開きます。

  4. [コンテナ] タブをクリックします。

    画像

    • [CPU の割り当てと料金] で、目的の CPU 割り当てを選択します。インスタンスがリクエストを受信しているときにのみ CPU を割り当てるようにするには、[リクエストの処理中にのみ CPU を割り当てる] を選択します。インスタンスの存続期間全体で CPU を割り当てる場合は、[CPU を常に割り当てる] を選択します。
  5. [作成] または [デプロイ] をクリックします。

コマンドライン

CPU 割り当てを更新できます。特定のサービスに対して常に CPU が割り当てられるように設定するには:

gcloud run services update SERVICE --no-cpu-throttling 

SERVICE は、実際のサービス名に置き換えます。

リクエストの処理中にのみ CPU を割り当てるように設定するには:

gcloud run services update SERVICE --cpu-throttling 

デプロイ中に CPU 割り当てを設定することもできます。CPU を常時割り当てられるように設定するには:

gcloud run deploy --image IMAGE_URL --no-cpu-throttling

リクエストの処理中にのみ CPU を割り当てるように設定するには:

gcloud run deploy --image IMAGE_URL --cpu-throttling

IMAGE_URL は、コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)に置き換えます。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。

YAML

既存のサービス構成をダウンロードして表示するには、gcloud run services describe --format export コマンドを使用します。読みやすく整えられた結果が YAML 形式で出力されます。次に、下記の手順でフィールドを変更し、gcloud run services replace コマンドを使用して変更後の YAML ファイルをアップロードします。必ず説明されているとおりにフィールドを変更してください。

  1. 次のコマンドで、構成を表示してダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml
  2. cpu 属性を更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/cpu-throttling: 'BOOLEAN'
          name: REVISION

    次のように置き換えます。

    • SERVICE は、Cloud Run サービスの名前に置き換えます。
    • リクエスト処理中にのみ CPU を割り当てる場合は BOOLEANtrue に置き換えます。CPU を常時割り当てる場合は false に置き換えます。
    • REVISION を新しいリビジョン名に置き換えるか、削除(存在する場合)します。新しいリビジョン名を指定する場合は、次の条件を満たす必要があります
      • SERVICE- で始まる
      • 小文字、数字、- のみが使用されている
      • 末尾が - ではない
      • 63 文字以内である
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml

Terraform

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

Terraform 構成の template.containers.resourcesgoogle_cloud_run_v2_service リソースに次の内容を追加します。

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-cpu-allocation"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
      resources {
        # If true, garbage-collect CPU when once a request finishes
        cpu_idle = false
      }
    }
  }
}

CPU 割り当て設定を表示する

Cloud Run サービスの現在の CPU 割り当て設定を表示するには:

コンソール

  1. Google Cloud コンソールで、[Cloud Run] に移動します。

    Cloud Run に移動

  2. 目的のサービスをクリックして、[サービスの詳細] ページを開きます。

  3. [変更内容] タブをクリックします。

  4. 右側の詳細パネルの [コンテナ] タブに、CPU 割り当て設定が表示されます。

コマンドライン

  1. 次のコマンドを使用します。

    gcloud run services describe SERVICE
  2. 返された構成で、CPU 割り当ての設定を見つけます。