在 Cloud Run 中,每个修订版本都会根据处理所有传入请求、实例或 CPU 利用率所需的实例数量自动扩缩。
当修订版本未收到任何流量时,它默认会缩容到零个实例。但是,如果需要,您可以使用实例数下限设置来更改此默认值,以将实例指定为保持空闲或“备用”状态。如果您在请求之外使用 CPU,则应将实例数下限设置为等于 1
。
安排的实例数除了受到传入请求或事件的速率或 CPU 利用率的影响之外,还受以下因素的影响:
Cloud Run 自动扩缩器每 5 秒评估一次这些内容。
始终分配 CPU 并自动扩缩
如果您将 Cloud Run 服务配置为始终分配 CPU,则应注意缩减至零以及从零开始扩容的行为。
从零开始扩容时始终分配 CPU。从零开始扩容只能由请求触发,因此未在处理请求的服务无法从零开始扩容。对于这些工作负载,您可以将实例数下限设置为大于 0,或在设计中添加一个“唤醒请求”,以便在缩减至零后重启处理。
缩减至零时始终分配 CPU。鉴于没有任何实例曾有 0% CPU,因此查看所有 CPU 使用量会导致永远不会缩减至零。这意味着,只能通过检查实例是否正在处理请求来决定从 1 缩减至零。
关于实例数上限
在某些情况下,您可能需要限制可启动的实例总数,以实现成本控制,或者更好地兼容您的服务使用的其他资源。例如,您的 Cloud Run 服务可能会与只能处理一定数量的并发打开连接的数据库交互。
您可以使实例数上限设置来限制可并行启动的实例总数,如设置实例数上限中所述。
超出实例数上限
正常情况下,修订版本创建新实例进行扩容,以处理传入的流量负载。但是,如果您设置了实例数上限,在某些情况下将没有足够的实例来满足流量负载需求。在这种情况下,传入请求会排入队列(待处理),如下所示:
- 如果新实例(例如在横向扩容期间)启动,则请求将至少留出此服务的容器实例的平均启动时间。这包括请求启动横向扩容的时间,例如从零开始横向扩容时。
- 如果启动时间少于 10 秒,则请求将持续长达 10 秒。
- 如果启动过程中没有实例,并且请求未启动横向扩容,则请求将持续长达 10 秒。
在此时间范围内,如果某实例处理完请求,则可以处理队列中的待处理请求。如果在该时间范围内没有实例可用,则请求将失败并显示 429
错误代码。
扩容保证
实例数上限是每个修订版本的实例数上限,这意味着此修订版本的实例数不应超过最大值。
在正常情况下,Cloud Run 能够非常快速地扩容到实例数上限,以处理所有传入请求或事件。但是,设置上限并不意味着您的修订版本在任何给定时刻都能够扩容到指定的实例数量。在异常情况下,Cloud Run 可能会限制扩缩,以确保所有客户都能获得良好的服务。
由于流量高峰导致超出实例数上限
在某些情况下,例如流量快速激增或系统维护时,Cloud Run 在短时间内创建的实例数量可能多于实例数上限设置中指定的数量。启动的新实例可超过待处理实例数上限设置,以替换现有实例并为待处理请求提供宽限期,以便其完成处理。
正常运行时,每周都有几次会超出实例数上限。宽限期通常最多为 15 分钟,或最多为请求超时设置中指定的值。这些额外的实例会在空闲 15 分钟后销毁。
如果需要多次替换,则更新通常会持续几分钟或几小时,但每次替换都会仅在宽限期内产生过多实例。超出实例数上限值的实例通常少于配置的实例数上限的两倍,但对于突然出现的大流量峰值,实例数可能会大得多。
负载测试所遇到的实例数量超出实例数上限设置,因为系统可能会更改流量峰值的出现位置,以保留具有持续负载模式的现有工作负载的容量。
如果您的服务无法承受此暂时性行为,您可能需要考虑安全边际因素,设置一个较低的实例数上限。
流量分配
由于实例数上限是每个修订版本的限制,因此如果服务在多个修订版本之间分配流量,则该服务的实例总数可以超过每个修订版本的实例数上限。您可以通过实例数指标了解这一点。
部署
当您部署新修订版本以处理所有流量时,Cloud Run 会先启动足够的新修订版本实例,然后再将流量定向到该修订版本。这样可以降低新修订版本部署对请求延迟时间的影响,尤其是在处理高流量时。由于实例数上限是每个修订版本的限制,因此在部署期间,服务的实例总数可以超过每个修订版本的实例数上限。您可以通过实例数指标了解这一点。
空闲实例和最大限度地减少冷启动
在实例处理完所有请求后,Cloud Run 不会立即关停实例。为最大限度地降低冷启动产生的影响,Cloud Run 可能会将一些实例保持空闲状态长达 15 分钟。如果突然遇到流量高峰,这些实例可以立即处理请求。
例如,某个实例处理完请求后,可能会在一段时间内保持空闲状态,以防需要处理其他请求。空闲实例可能会保留资源,例如打开的数据库连接。请注意,只有在明确将服务配置为始终分配 CPU 的情况下,才会在处理请求期间分配 CPU。
如需使空闲实例永久可用,请使用 min-instance
设置。请注意,即使服务目前未处理请求,使用此功能也会产生费用。
自动扩缩和待处理请求
- 如果新实例(例如在横向扩容期间)启动,则请求将至少留出此服务的容器实例的平均启动时间。这包括请求启动横向扩容的时间,例如从零开始横向扩容时。
- 如果启动时间少于 10 秒,则请求将持续长达 10 秒。
- 如果启动过程中没有实例,并且请求未启动横向扩容,则请求将持续长达 10 秒。
自动扩缩对支持性服务的影响
随着实例数量的自动增加,您的 Cloud Run 服务可能会遇到支持性服务限制。例如,Cloud SQL 具有 API 配额限制。请确保这些支持性服务具有足够的配额,并且可以处理来自 Cloud Run 服务所有实例的连接。请考虑设置实例数量上限,以避免支持性服务过载。
自动扩缩和 Pub/Sub
Google 建议使用推送订阅来接收 Cloud Run 上 Pub/Sub 主题的消息。推送的消息会像容器发出的 HTTP 请求一样接收,从而触发相同的自动扩缩行为。
自动扩缩和多个容器 (Sidecar)
Cloud Run 会在自动扩缩时考虑实例的 CPU 利用率,其中实例的 CPU 利用率是已分配的 CPU 的使用百分比。
请注意,在容器级别设置 CPU 限制时,您需要分配 CPU。如果您使用每个实例多个容器,则该实例的实际 CPU 分配是您为每个容器设置的 CPU 限制的总和。
后续步骤
- 若要管理 Cloud Run 服务的实例数上限,请参阅设置实例数上限。
- 若要管理每个实例同时处理的请求数量上限,请参阅设置并发。
- 要优化并发设置,请参阅关于调整并发设置的开发提示。
- 如需指定空闲实例继续运行,以便最大限度地缩短处理第一批请求的延迟时间或冷启动时间,请参阅使用
min-instance
启用空闲实例。