默认情况下,系统仅在请求处理、容器启动和关停期间为 Cloud Run 实例分配 CPU。(请参阅实例生命周期)。您可以更改此行为,以便 CPU 始终会分配并且可用,即使没有传入请求也是如此。设置“始终分配 CPU”有助于运行短期有效的后台任务和其他异步处理任务。
即使始终分配 CPU,Cloud Run 自动扩缩也仍然有效,如果不需要使用实例来处理传入的流量或请求之外的当前 CPU 利用率,则可能会终止实例。实例在处理请求后绝不会保持空闲状态超过 15 分钟,除非使用实例数下限使其保持活跃状态。
将“始终分配 CPU”与实例数下限数值搭配使用,可以让一定数量的实例保持运行并可以完整访问 CPU 资源,从而实现后台处理。使用此模式时,即使服务在任何请求之外使用 CPU,Cloud Run 也会应用实例自动扩缩。
如果您使用健康检查探测,则系统会为每个探测分配 CPU。如需了解结算详情,请参阅容器健康检查探测。
价格影响
如果您选择仅在请求处理期间分配 CPU,则需要按请求付费,并且只能在实例处理请求时付费。 如果您选择“始终分配 CPU”设置,则需要为实例的整个生命周期付费。如需了解详情,请参阅 Cloud Run 价格表。
Google 的 Recommender 会自动查看 Cloud Run 服务在过去一个月内接收的流量,如果发现“始终分配 CPU”更便宜,则会建议将“在请求期间分配 CPU”改为“始终分配 CPU”。
如何选择合适的 CPU 分配方案
根据多种因素为您的使用场景选择适当的 CPU 分配,例如流量模式、后台执行和费用,下面的部分将对每种因素进行介绍。
流量模式注意事项
- 如果传入的流量是零星、突发或峰值,则建议仅在请求处理期间分配 CPU。
- 如果传入流量稳定且缓慢变化,则建议始终分配 CPU。
后台执行注意事项
选择始终分配 CPU 后,您可以在返回响应后执行短期有效的后台任务和其他异步处理工作。例如:
- 利用可能假定能够在后台运行的 OpenTelemetry 等功能来监控代理。
- 使用 Go 的 Goroutine、Node.js 异步、Java 线程和 Kotlin 协同程序。
- 使用依赖于内置调度/后台功能的应用框架。
空闲实例(包括通过实例数下限保持备用状态的实例)可以随时关停。如果您需要在容器终止之前完成未完成的任务,则可以捕获 SIGTERM 以在实例停止之前留出 10 秒的宽限期。
请考虑使用 Cloud Tasks 来执行异步任务。Cloud Tasks 会自动重试失败的任务,并且支持最长 30 分钟的运行时间。
费用注意事项
如果您目前使用的是仅在处理请求期间分配 CPU,那么在以下情况下,始终分配 CPU 可能更经济实惠:
- 您的 Cloud Run 服务以相当稳定的速率处理大量当前请求。
- 在查看实例计数指标时,您不会看到许多“空闲”的实例。
您可以使用价格计算器来估算费用差异。
从零开始扩容时始终分配 CPU
从零开始扩容只能由请求触发,因此未在处理请求的服务无法从零开始扩容。对于这些工作负载,您可以将实例数下限设置为大于 0,或在设计中添加一个“唤醒请求”,以便在缩减至零后重启处理。
缩减至零时始终分配 CPU
鉴于没有任何实例曾有 0% CPU,因此查看所有 CPU 使用量会导致永远不会缩减至零。这意味着,只能通过检查实例是否正在处理请求来决定从 1 缩减至零。
所需的角色
如需获得配置和部署 Cloud Run 服务所需的权限,请让管理员向您授予以下 IAM 角色:
-
Cloud Run 服务的 Cloud Run Developer (
roles/run.developer
) 角色 -
服务身份的 Service Account User (
roles/iam.serviceAccountUser
) 角色
如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色和 Cloud Run IAM 权限。如果您的 Cloud Run 服务与 Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限和管理访问权限。
设置和更新 CPU 分配
任何配置更改都会导致新修订版本的创建。后续修订版本也将自动采用此配置设置,除非您进行了明确更新。
如果您要选择“始终分配 CPU”这一选项,则必须至少指定 512MiB 的内存。
默认情况下,对于每个容器实例而言,只会在处理请求期间分配 CPU。您可以在创建新服务或部署新修订版本时使用 Google Cloud 控制台、gcloud 命令行或 YAML 文件更改此值:
控制台
在 Google Cloud 控制台中,前往 Cloud Run:
如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本。
如果您要配置新服务,请根据需要填写初始服务设置页面,然后点击容器、网络、安全性以展开服务配置页面。
点击容器标签页。
- 在“CPU 分配和价格”下选择所需的 CPU 分配。针对实例选择仅在处理请求期间分配 CPU后,实例只会在收到请求时才会收到 CPU。选择始终分配 CPU 为实例的整个生命周期分配 CPU。
点击创建或部署。
命令行
您可以更新 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。网址的形状为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
。
YAML
如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置:
gcloud run services describe SERVICE --format export > service.yaml
更新
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 服务的名称
- 将 BOOLEAN 替换为
true
(以设置仅在处理请求期间分配 CPU)或false
(以设置始终分配 CPU)。 - 将 REVISION 替换为新的修订版本名称或者将其删除(如果存在)。如果您提供新的修订版本名称,则该名称必须满足以下条件:
- 开头为
SERVICE-
- 仅包含小写字母、数字和
-
- 不以
-
结尾 - 不超过 63 个字符
- 开头为
使用以下命令创建或更新服务:
gcloud run services replace service.yaml
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
将以下内容添加到 Terraform 配置中的 template.containers.resources
下的 google_cloud_run_v2_service
资源中。
查看 CPU 分配设置
如需查看 Cloud Run 服务的当前 CPU 分配设置,请按照以下所述操作:
控制台
在 Google Cloud 控制台中,前往 Cloud Run:
点击您感兴趣的服务以打开“服务详细信息”页面。
点击修订版本标签页。
在右侧的详细信息面板中,“容器”标签页下列出了 CPU 分配设置。
命令行
使用以下命令:
gcloud run services describe SERVICE
在返回的配置中找到 CPU 分配设置。