执行环境简介

默认情况下,Cloud Run 服务未指定执行环境,这意味着 Cloud Run 会根据使用的功能选择执行环境。因此,除非您为服务指定执行环境,否则 Cloud Run 可以选择第一代或第二代环境。

请注意,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。如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

  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

后续步骤