执行环境简介

默认情况下,Cloud Run 服务在第一代执行环境中运行,该环境具有冷启动时间快和能够模拟大多数但不是全部操作系统调用的特点。最初,这是 Cloud Run 中的服务唯一可用的执行环境。

第二代执行环境提供完整的 Linux 兼容性,而不仅是系统调用模拟。此执行环境提供:

  • 更高的 CPU 性能
  • 更高的网络性能,尤其是在数据包丢失的情况下
  • 完整的 Linux 兼容性,包括支持所有系统调用、命名空间和 cgroup
  • 网络文件系统支持

虽然第二代执行环境在持续负载下的执行速度通常较快,但对大多数服务来说,它的冷启动时间比第一代执行环境更长。

您可以在部署新服务或服务的新修订版本时,为 Cloud Run 服务指定执行环境。如果您未指定执行环境,则默认使用第一代。

如何选择执行环境

如果存在以下任一情况,则应使用第一代执行环境:

  • 您的 Cloud Run 服务具有突发流量,并且需要快速横向扩容到许多容器实例,或者您的服务对冷启动时间敏感。
  • 您的 Cloud Run 服务的流量较低,导致系统频繁地从零开始横向扩容。
  • 您希望使用的内存少于 512 MiB。第二代执行环境至少需要 512 MiB 的内存。

如果以下任意一项适用于您的 Cloud Run 服务,则应使用第二代执行环境:

  • 您的服务需要使用仅受第二代执行环境支持的网络文件系统。
  • 您的服务具有相当稳定的流量,并且能够容忍较慢的冷启动。
  • 您的服务具有 CPU 密集型工作负载。
  • 您的服务可以受益于更高的网络性能。
  • 由于未实现的系统调用,您的服务需要使用在第一代执行环境中运行时存在问题的软件。
  • 您的服务需要 Linux cgroup 功能。

使用第二代执行环境时的最佳实践

建议您的容器安装 SIGTERM 处理程序,特别是在使用 CPU 按需结算模型时。

处理 SIGTERM 可使容器有机会在退出之前执行任何必要的清理任务,例如刷新日志。如果您的容器未捕获 SIGTERM,您仍将需要 10 秒来执行这些任务;这 10 秒是计费的。

如何检查容器是否处理 SIGTERM

要确定您的容器是否安装了 SIGTERM 处理程序,请执行以下操作:

  1. 启动 Cloud Shell。 您可以在所查看文档页面的标题中找到 激活 Cloud Run 按钮 激活 Cloud Shell。您可能需要授权并等待它预配。或者,也可以启动独立会话

  2. 在 Cloud Shell 中本地运行容器:

    docker run IMAGE_URL

    IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest

  3. 在 Cloud Shell 中打开另一个标签页,并获取在当前 Cloud Shell 会话中运行的容器列表:

    docker container ls

    您需要找到从命令返回的容器 ID。

  4. 使用容器 ID,向容器发送 SIGTERM 信号

    docker kill -s SIGTERM CONTAINER_ID
  5. 返回到调用 docker run 的标签页,查看容器是否已退出(停止)。如果 SIGTERM 信号导致容器退出,则您的容器正在处理 SIGTERM。

如何处理 SIGTERM

如果您的容器不处理 SIGTERM,则添加 SIGTERM 处理程序的最简单方法是使用 tini 封装您的服务。这样做使您的服务作为 tini 的子进程运行,该进程采用容器 init 进程的角色。如需了解相关说明,请参阅 Docker 说明

或者,您可以将应用更改为直接处理 SIGTERM

后续步骤