Document
常规开发技巧

常规开发技巧

本指南提供了设计、实现、测试和部署 Cloud Run 服务的最佳做法。如需了解更多提示,请参阅迁移现有服务。 编写高效的服务 本 部分 和 实现 方面 的 一般 。 是指在 HTTP 响应送达后发生的任何活动。如需确定服务中是否存在并不明显的 ,请检查日志以查找在 HT

Related articles

Best Free VPN for Chrome in 2024 [Free Chrome VPN Extensions] Free Rain Cloud Template (Printable PDF) Python Release Python 3.11.4 QuickBooks for Small Business: Which Version Do You Need? Jingubang Stats, Unique Effect, and How to Get

本指南提供了设计、实现、测试和部署 Cloud Run 服务的最佳做法。如需了解更多提示,请参阅迁移现有服务。

编写高效的服务

本 部分 和 实现 方面 的 一般 。

是指在 HTTP 响应送达后发生的任何活动。如需确定服务中是否存在并不明显的 ,请检查日志以查找在 HTTP 请求条目后记录的任何内容。

将 CPU 配置成始终分配以使用

如果您希望在 Cloud Run 服务中支持 ,请将 Cloud Run 服务 CPU 设置为始终分配,以便您可以在请求之外运行 ,并且仍拥有 CPU 访问权限。

如果仅在处理请求期间分配 CPU,请避免进行

如果您需要将服务设置为仅在处理请求期间分配 CPU,则当 Cloud Run 服务处理完请求后,实例对 CPU 的访问将被停用或受到严重限制。如果使用此类型的 CPU 分配,您不应启动在请求处理程序范围之外运行的后台线程或例程。

建议检查您的代码,以确保所有异步操作都会在传送响应之前完成。

使用此类型的 CPU 分配运行后台线程可能会导致出现意外行为,因为对同一容器实例发出的任何后续请求都会恢复任何暂停的 。

删除临时文件

在 Cloud Run 环境中,磁盘存储空间属于内存文件系统。写入磁盘的文件会占用供服务使用的内存,并且可在多次调用之间继续留存。 如果不删除这些文件,最终可能会导致内存不足错误,并且随后容器启动速度缓慢。

报告 is 错误

您需要处理所有异常,防止服务因错误而崩溃。崩溃会导致容器启动缓慢,而流量则需要排队等候某个替换实例。

如需了解如何适当地报告 is 错误 ,请参阅报告 is 错误 指南。

优化性能

本部分介绍性能优化方面的最佳做法。

快速启动容器

因为实例根据需要进行扩缩,所以其启动时间会影响服务的延迟时间。虽然 Cloud Run 会将实例启动和请求处理分离,但请求可能必须等待新实例启动才能处理,尤其是在从零开始伸缩时。

例程 is 包括 以下 :

速度 is 缩短 可以 地 处理 。

使用启动 CPU 加速功能缩短启动延迟时间

您可以启用启动 CPU 加速,在实例启动期间临时增加 CPU 分配,以缩短启动延迟时间。

使用实例数下限缩短容器启动时间

您可以配置实例数下限和并发数,以最大限度地缩短容器启动时间。例如,如果使用实例数下限 1,则表示您的服务已准备好接收为服务配置的并发请求数,而无需启动新的实例。

请注意,等待实例启动的请求将在队列中保持待处理状态,如下所示:

  • 如果新实例(例如在横向扩容期间)启动,则请求将至少留出此服务的容器实例的平均启动时间。这包括请求启动横向扩容的时间,例如从零开始横向扩容时。
  • 如果启动时间少于 10 秒,则请求将持续长达 10 秒。
  • 如果启动过程中没有实例,并且请求未启动横向扩容,则请求将持续长达 10 秒。

谨慎使用依赖项

如果您使用具有依赖项库的动态语言,例如导入 Node.js 模块,则这些模块的加载时间会增加启动延迟时间。

您可以通过以下方式缩短启动延迟时间:

  • 最大限度地减少依赖项的数量和大小,以构建精简服务。
  • 惰性加载不常用的代码(如果您所用的语言支持此方式)。
  • 使用代码加载优化技术,例如 PHP 的 Composer 自动加载器优化技术。

使用

在 中 , 您 is 假设 不 能 会 在 各 之间 保持 不 。 但是 , Run is 使用 会 使用 的 来 处理 , 因此 您 可以 在 范围 内 一个 , 以 允许 使用 。 无法 使用 此 是否 会 让 任何 的 。

如果在每个服务请求中重新创建对象会带来很大的开销,您还可以在内存中缓存对象。将对象从请求逻辑转移到全局范围有助于提升性能。

对全局变量执行延迟初始化

全局变量的初始化始终在启动期间进行,因此这会增加容器启动时间。对不常用的对象使用延迟初始化可以延后其时间成本,缩短容器启动时间。

延迟初始化的一个缺点是,新实例收到的第一个请求的延迟时间会增加。如果您部署的是正在积极处理大量请求的服务的新修订版,这可能会导致过度扩缩和丢弃请求。

使用 其他

使用 其他 可能会使启动时间缩短。

Cloud Run 实例可以“同时”并发处理多个请求,但不超过可配置的最大并发请求数。这与使用 concurrency = 1 的 Cloud Run functions 不同。

Cloud Run 会自动将并发调整到配置的最大值。

默认的最大并发数为 80,该数值非常适合大多数容器映像。但是,您应该遵循以下准则:

  • 如果 无法 处理 大量 , 该 。
  • 如果 能够 处理 大量 , 该 。

针对您的服务调整并发设置

每个 可以 处理 的 和 所 用 ( 如 和 ) 的 限制 。

如需优化服务以便能够稳定地并发处理尽可能多的请求,请执行以下步骤:

  1. 优化您的服务性能。
  2. 设置您在任何代码级并发配置中的预期并发支持级别。并非所有技术堆栈都要求进行此设置。
  3. 部署您的服务。
  4. 为 您 的 或 任何 的 并 。 如果 没有 , 使用 并 。
  5. 使用支持可配置并发的负载测试工具。您需要确认您的服务在预期的负载和并发数情况下能够保持稳定。
  6. 如果服务运行状况不佳,请转到第 1 步来改进服务,或转到第 2 步来减少并发请求数。如果服务运行状况良好,则返回第 2 步并增加并发请求数。

继续迭代执行上述步骤,直到找到能稳定运行的最大并发请求数。

使内存与并发设置相匹配

您 的 处理 的 每个 请求 is 需要 都 需要 一些 的 。
因此 , 当 您 或 并 时 , 同时 限制 。

避免 的

如果要在并发处理请求的情况下利用可变的全局状态,您需要在代码中执行额外的步骤来确保安全地完成此类操作。您可以将全局变量限制为一次性初始化并重复使用,以最大限度地减少争用(请参阅上文中的性能部分)。

如果在同时处理多个请求的服务中使用可变全局变量,请务必使用锁定或互斥机制,以防出现争用情况。

、 与 费用 is 权衡

调整并发请求数上限设置有助于在服务的吞吐量、延迟时间和费用之间取得平衡。

一般来说,并发请求数上限设置越低,每个实例的延迟时间就越短,吞吐量也会降低。并发请求数量上限越低,争夺每个实例内资源的请求就越少,每个请求的性能就越好。但由于每个实例可以同时处理的请求较少,因此每个实例的吞吐量会较低,且服务需要更多实例来处理相同的流量。

反之,并发请求数上限设置越高,每个实例的延迟时间和吞吐量通常就越高。请求可能需要等待才能访问实例中的 CPU、GPU 和内存带宽等资源,这会导致延迟时间增加。但是,每个实例可以一次处理更多请求,因此服务总体上需要更少的实例来处理相同的流量。

费用注意事项

Cloud Run 结算是按实例时间计算的。如果始终分配 CPU,则实例时间是每个实例的总生命周期。如果不 总是 , 则 是 每个 为 处理 一个 所 的 。

并发请求数上限对结算的影响取决于您的流量模式。如果降低并发请求数上限会带来以下好处,则降低并发请求数上限可以降低账单金额:

  • 实例更快地完成工作
  • 实例关闭速度更快,即使总实例数需求增加

但 相反 的 也 是 可能 的 : 如果 由于 的 而 的 的 没有 被 每个 的 所 , 则 并 可能 会 。

优化计费的最佳方法是通过使用不同的并发请求数上限设置进行负载测试,来确定导致最低计费实例时间的设置,如 container/billable_instance_time 监控指标所示。

容器安全性

许多 通用 安全 做法 is 适用 都 适用 于 。
有些 做法 is 面向 专门 , 或者 的 和 。

您可以通过以下方式提高容器安全性:

  • 使用得到积极维护的安全基础映像,例如 Google 基础映像或 Docker Hub 的官方映像。

    注意:自 2020 年 11 月 1 日起,Docker Hub 速率限制适用于 Docker 免费方案中未经身份验证或经过身份验证的拉取请求。为避免中断并更好地控制软件供应链,您可以将依赖项迁移到 Artifact Registry。

  • 定期重新构建容器映像并重新部署服务,以对您的服务应用安全更新。

  • 仅 在 中 的 。 的 、 和 工具 is 有 都 有 可能 成为 安全 。 了解 的 。

  • 实现包含特定软件和库版本的确定性构建流程。这可防止您的容器中混入未经验证的代码。

  • 使用 语句将容器设置为以 之外的用户身份运行。某些容器映像可能已经配置了特定用户。

  • 使用自定义组织政策来阻止使用预览版功能。

自动执行安全扫描

启用漏洞扫描功能,以便对存储在 Artifact Registry 中的容器映像进行安全扫描。

最 像

大型容器映像可能会包含安全漏洞,因为它们包含的代码数量超出要求。

由于 Run 的 , 的 大小 is 影响 不 会 容器启动时间或请求处理时间。容器映像大小也不会计入容器的可用内存。

如 最 小 的 , 考虑 使用 , 例如 :

Ubuntu 是较大的基础映像,但很常用,可提供更全面的开箱即用服务器环境。

如果 您 的 中 很多 , 使用 多 来 。

如需进一步了解如何创建精简容器映像,请参阅以下资源: