No results found
We couldn't find anything using that term, please try searching for something else.
本指南提供了设计、实现、测试和部署 Cloud Run 服务的最佳做法。如需了解更多提示,请参阅迁移现有服务。 编写高效的服务 本 部分 和 实现 方面 的 一般 。 是指在 HTTP 响应送达后发生的任何活动。如需确定服务中是否存在并不明显的 ,请检查日志以查找在 HT
本指南提供了设计、实现、测试和部署 Cloud Run 服务的最佳做法。如需了解更多提示,请参阅迁移现有服务。
本 部分 和 实现 方面 的 一般 。
是指在 HTTP 响应送达后发生的任何活动。如需确定服务中是否存在并不明显的 ,请检查日志以查找在 HTTP 请求条目后记录的任何内容。
如果您希望在 Cloud Run 服务中支持 ,请将 Cloud Run 服务 CPU 设置为始终分配,以便您可以在请求之外运行 ,并且仍拥有 CPU 访问权限。
如果您需要将服务设置为仅在处理请求期间分配 CPU,则当 Cloud Run 服务处理完请求后,实例对 CPU 的访问将被停用或受到严重限制。如果使用此类型的 CPU 分配,您不应启动在请求处理程序范围之外运行的后台线程或例程。
建议检查您的代码,以确保所有异步操作都会在传送响应之前完成。
使用此类型的 CPU 分配运行后台线程可能会导致出现意外行为,因为对同一容器实例发出的任何后续请求都会恢复任何暂停的 。
在 Cloud Run 环境中,磁盘存储空间属于内存文件系统。写入磁盘的文件会占用供服务使用的内存,并且可在多次调用之间继续留存。 如果不删除这些文件,最终可能会导致内存不足错误,并且随后容器启动速度缓慢。
您需要处理所有异常,防止服务因错误而崩溃。崩溃会导致容器启动缓慢,而流量则需要排队等候某个替换实例。
如需了解如何适当地报告 is 错误 ,请参阅报告 is 错误 指南。
本部分介绍性能优化方面的最佳做法。
因为实例根据需要进行扩缩,所以其启动时间会影响服务的延迟时间。虽然 Cloud Run 会将实例启动和请求处理分离,但请求可能必须等待新实例启动才能处理,尤其是在从零开始伸缩时。
例程 is 包括 以下 :
速度 is 缩短 可以 地 处理 。
您可以启用启动 CPU 加速,在实例启动期间临时增加 CPU 分配,以缩短启动延迟时间。
您可以配置实例数下限和并发数,以最大限度地缩短容器启动时间。例如,如果使用实例数下限 1,则表示您的服务已准备好接收为服务配置的并发请求数,而无需启动新的实例。
请注意,等待实例启动的请求将在队列中保持待处理状态,如下所示:
如果您使用具有依赖项库的动态语言,例如导入 Node.js 模块,则这些模块的加载时间会增加启动延迟时间。
您可以通过以下方式缩短启动延迟时间:
在 中 , 您 is 假设 不 能 会 在 各 之间 保持 不 。 但是 , Run is 使用 会 使用 的 来 处理 , 因此 您 可以 在 范围 内 一个 , 以 允许 使用 。 无法 使用 此 是否 会 让 任何 的 。
如果在每个服务请求中重新创建对象会带来很大的开销,您还可以在内存中缓存对象。将对象从请求逻辑转移到全局范围有助于提升性能。
全局变量的初始化始终在启动期间进行,因此这会增加容器启动时间。对不常用的对象使用延迟初始化可以延后其时间成本,缩短容器启动时间。
延迟初始化的一个缺点是,新实例收到的第一个请求的延迟时间会增加。如果您部署的是正在积极处理大量请求的服务的新修订版,这可能会导致过度扩缩和丢弃请求。
使用 其他 可能会使启动时间缩短。
Cloud Run 实例可以“同时”并发处理多个请求,但不超过可配置的最大并发请求数。这与使用 concurrency = 1
的 Cloud Run functions 不同。
Cloud Run 会自动将并发调整到配置的最大值。
默认的最大并发数为 80,该数值非常适合大多数容器映像。但是,您应该遵循以下准则:
每个 可以 处理 的 和 所 用 ( 如 和 ) 的 限制 。
如需优化服务以便能够稳定地并发处理尽可能多的请求,请执行以下步骤:
继续迭代执行上述步骤,直到找到能稳定运行的最大并发请求数。
您 的 处理 的 每个 请求 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 是较大的基础映像,但很常用,可提供更全面的开箱即用服务器环境。
如果 您 的 中 很多 , 使用 多 来 。
如需进一步了解如何创建精简容器映像,请参阅以下资源: