优化费用:计算、容器和无服务器

Last reviewed 2023-07-12 UTC

Google Cloud 架构框架中的本文档提供了建议,以帮助您优化 Google Cloud 中的虚拟机 (VM)、容器和无服务器资源的费用。

本部分中的指南适用于负责为云端工作负载预配和管理计算资源的架构师、开发者和管理员。

计算资源是云基础架构最重要的部分。在将工作负载迁移到 Google Cloud 时,通常首选 Compute Engine,它可让您在云端高效地预配和管理虚拟机。Compute Engine 提供了各种各样的机器类型,可在全球所有 Google Cloud 区域使用。借助 Compute Engine 的预定义和自定义机器类型,您可以预配具有与本地基础架构类似计算容量的虚拟机,从而加速迁移过程。Compute Engine 具有价格优势,您只需为所用的基础架构付费,并且由于可以凭借持续使用折扣使用更多的计算资源,因此可以显著节省费用。

除了 Compute Engine 之外,Google Cloud 还提供容器和无服务器计算服务。对于并非始终运行的新服务(例如 API、数据处理和事件处理),无服务器方法可能更加经济实惠。

除了一般性建议,本文档还提供了指南来帮助您在使用以下产品时优化计算资源的费用:

  • Compute Engine
  • Google Kubernetes Engine (GKE)
  • Cloud Run
  • Cloud Functions
  • App Engine

一般建议

以下建议适用于本部分讨论的所有 Google Cloud 计算、容器和无服务器服务。

跟踪用量和费用

使用以下工具和方法监控资源使用情况和费用:

控制资源预配

您可以按照以下建议来控制在云端预配的资源数量以及用于创建资源的位置:

  • 为帮助确保资源消耗量和费用不超过预测值,请使用资源配额
  • 在费用最低并且能够满足工作负载延迟时间要求的地区预配资源。如需控制资源的预配位置,您可以使用组织政策限制条件 gcp.resourceLocations

获取承诺使用折扣

承诺使用折扣 (CUD) 非常适合具有可预测资源需求的工作负载。将工作负载迁移到 Google Cloud 后,找到所需资源的基准,并获取承诺使用折扣。例如,购买一年或三年期承诺,并在 Compute Engine 虚拟机价格上享受大幅折扣。

使用标签自动执行费用跟踪

以一致的方式定义和分配标签。以下示例展示了如何使用标签来自动执行费用跟踪:

  • 对于开发者仅在工作时间使用的虚拟机,请指定 env: development 标签。您可以使用 Cloud Scheduler 设置无服务器 Cloud Functions 函数,以便在工作时间结束后关停这些虚拟机,并在必要时重启它们。

  • 对于具有多个 Cloud Run 服务和 Cloud Functions 实例的应用,请为所有 Cloud RunCloud Functions 资源分配一致的标签。识别费用较高的区域,并采取措施降低费用。

自定义结算报告

通过设置所需的过滤条件并根据需要对数据进行分组(例如,按项目、服务或标签),配置 Cloud Billing 报告

宣传节省费用文化

为您的云基础架构培训开发者和操作员。使用传统或在线课程、论坛、对等审核、结对编程和费用节省游戏化等方式创建和推广学习计划。如 Google 的 DORA 研究成果中所述,组织文化是提高绩效、减少返工和倦怠以及优化费用的关键驱动因素。通过让员工了解资源费用,帮助他们根据业务目标和限制条件来安排其优先级和活动。

Compute Engine

本部分提供的指导可帮助您优化 Compute Engine 资源的费用。除了本指南之外,我们还建议您遵循前面讨论的一般性建议

了解结算模式

如需了解 Compute Engine 的结算选项,请参阅价格

分析资源消耗情况

为了帮助您了解 Compute Engine 中的资源消耗情况,请将使用情况数据导出到 BigQuery。查询 BigQuery 数据存储区,以分析项目的虚拟 CPU (vCPU) 使用趋势并确定可回收的 vCPU 数量。如果您已定义每个项目的核心数阈值,请分析使用趋势以发现异常情况并采取纠正措施。

收回空闲资源

按照以下建议来识别和收回未使用的虚拟机和磁盘,例如已降低优先级的概念验证项目的虚拟机:

  • 使用空闲虚拟机 Recommender 根据使用情况指标识别无效虚拟机和永久性磁盘。
  • 在删除资源之前,请评估该操作的潜在影响,并计划在必要时重新创建资源。
  • 在删除虚拟机之前,请考虑截取快照。 在删除虚拟机时,除非您已经选择了保留磁盘选项,否则挂接的磁盘也会被删除。
  • 在可能的情况下,请考虑停止虚拟机而不是删除虚拟机。停止虚拟机时,实例会终止,但磁盘和 IP 地址会保留下来,直到您分离或删除它们。

调整容量以满足需求

安排虚拟机自动启动和停止。例如,如果一个虚拟机每天只使用 8 小时,一周使用 5 天(即一周使用 40 小时),那么可以通过在不使用虚拟机时将其停用(一周停用 128 小时)将费用减少 75%。

使用代管式实例组根据需求自动扩缩计算容量。您可以根据对业务至关重要的参数(例如 CPU 使用率或负载均衡容量)自动扩缩容量。

选择适当的机器类型

使用虚拟机机器类型 Recommender 调整虚拟机的大小,以满足工作负载的计算要求。

对于具有可预测资源要求的工作负载,请使用自定义虚拟机根据需求定制机器类型并节省资金。

对于容错的批处理工作负载,请考虑使用 Spot 虚拟机。可以部署在 Spot 虚拟机上的工作负载示例包括高性能计算 (HPC)、大数据、媒体转码、持续集成和持续交付 (CI/CD) 流水线和无状态 Web 应用。如需查看 Descartes 实验室如何通过使用抢占式虚拟机(Spot 虚拟机的旧版本)处理卫星图像来降低分析费用的示例,请参阅 Descartes 实验室案例研究

评估许可选项

将第三方工作负载迁移到 Google Cloud 时,可以通过自带许可 (BYOL) 来降低费用。例如,如需部署 Microsoft Windows Server 虚拟机,您可以创建并使用自定义 Windows BYOL 映像,而不要使用高级映像,这种方式将使用第三方许可并因而产生额外费用。 然后,您只需为在 Google Cloud 上使用的虚拟机基础架构付费。此策略可帮助您继续从现有第三方许可投资中实现价值。

如果您决定使用 BYOL 方法,我们建议您执行以下操作:

  • 使用自定义机器类型预配独立于内存的所需计算 CPU 核心数量,并将第三方许可费用限制为所需的 CPU 核心数量。
  • 通过停用同时多线程 (SMT),将每个核心的 vCPU 数量从 2 减少到 1,将许可费用降低 50%。

如果您的第三方工作负载需要专用硬件来满足安全或合规性要求,那么可以为单租户节点自带许可。

Google Kubernetes Engine

本部分的指南可帮助您优化 GKE 资源的费用。

除了以下建议之外,另请参阅前面讨论的一般性建议

  • 使用 GKE Autopilot 让 GKE 最大限度地提高集群基础架构的效率。您无需监控节点的运行状况、处理装箱或计算工作负载所需的容量。
  • 使用水平 Pod 自动扩缩器 (HPA)、纵向 Pod 自动扩缩器 (VPA)、集群自动扩缩器 (CA) 或节点自动预配,根据工作负载的需求微调 GKE 自动扩缩。
  • 对于对启动延迟时间不敏感的批处理工作负载,请使用优化利用率自动扩缩配置文件来帮助提高集群利用率。
  • 使用节点自动预配来扩展 GKE 集群自动扩缩器,并基于没有过度预配的待处理 pod 规范高效创建和删除节点池。
  • 使用单独的节点池:用于静态负载的静态节点池,以及包含用于动态负载的集群自动扩缩组的动态节点池。
  • 如果您的 Pod 具有容错能力并且可以在 25 秒内正常终止,则请为 Kubernetes 节点池使用 Spot 虚拟机。此策略与 GKE 集群自动扩缩器结合使用时,有助于确保包含较低费用虚拟机的节点池(在此情况下为包含 Spot 虚拟机的节点池)优先进行扩缩。
  • 选择经济实惠的机器类型(例如 E2N2DT2D),性价比提升 20-40%。
  • 使用 GKE 用量计量按命名空间和标签分析集群的用量概况。确定支出最多的团队或应用、导致用量或费用出现高峰的环境或组件,以及浪费资源的团队。
  • 在多租户集群中使用资源配额可防止任何租户使用超过其分配份额的集群资源。
  • 在工作时间结束后安排开发和测试环境的自动缩减
  • 按照最佳实践在 GKE 上运行费用经过优化的 Kubernetes 应用。

Cloud Run

本部分提供的指南有助于优化 Cloud Run 资源的费用。

除了以下建议之外,另请参阅前面讨论的一般性建议

  • 调整并发设置(默认值:80)以降低费用。Cloud Run 根据 CPU 和内存用量确定要发送到实例的请求数。 您可以通过增加请求并发数来减少所需实例数。
  • 为可以部署的实例数设置限制
  • 使用可计费实例时间指标估算所需实例数。例如,如果指标显示 100s/s,则表示大约安排了 100 个实例。添加 30% 的缓冲区以保留性能;也就是说,使用 130 个实例来实现每秒 100 秒的流量。
  • 为降低冷启动产生的影响,请配置实例数下限。当这些实例处于空闲状态时,它们将按十分之一的价格计费。
  • 跟踪 CPU 使用率并相应地调整 CPU 限制。
  • 使用流量管理来确定费用最优配置。
  • 请考虑使用 Cloud CDN 或 Firebase Hosting 来传送静态资源。
  • 对于全局处理请求的 Cloud Run 应用,请考虑将应用部署到多个区域,因为跨大洲数据传输的费用可能很高。如果您使用负载均衡器和 CDN,则建议采用此设计。
  • 减少实例的启动时间,因为启动时间也会计费。
  • 购买承诺使用折扣,在一年的期限内,最多可节省 17% 的按需价格。

Cloud Functions

本部分提供的指南可帮助您优化 Cloud Functions 资源的费用。

除了以下建议之外,另请参阅前面讨论的一般性建议

  • 观察函数的执行时间。进行实验和基准测试,以设计出仍满足所需性能阈值的最小函数。
  • 如果您的 Cloud Functions 工作负载不断运行,请考虑使用 GKE 或 Compute Engine 来处理工作负载。对于始终运行的工作负载,容器或虚拟机可能是费用较低的选项。
  • 限制可以共存的函数实例的数量
  • 根据函数的工作负载,对 Cloud Functions 编程语言的运行时性能进行基准测试。采用编译语言的程序的冷启动时间较长,但运行速度更快。采用解释语言的程序运行速度较慢,但冷启动开销较低。频繁运行的简短函数在使用解释语言时花费更低。
  • 删除写入本地磁盘的临时文件,该磁盘是内存内文件系统。临时文件会使用分配给您的函数的内存,并且有时会在多次调用之间持续存在。如果不删除这些文件,可能会发生内存不足错误并触发冷启动,这会增加执行时间和费用。

App Engine

本部分提供的指导能够帮助您优化 App Engine 资源的费用。

除了以下建议之外,另请参阅前面讨论的一般性建议

  • 根据您的流量和请求延迟时间设置实例数上限。App Engine 通常根据应用接收的流量扩缩容量。您可以通过限制 App Engine 可以创建的实例数来控制费用。
  • 如需限制应用可用的内存或 CPU,请设置实例类。对于 CPU 密集型应用,请分配更多 CPU。测试一些配置以确定最佳大小。
  • 以多种编程语言对 App Engine 工作负载进行基准测试。 例如,如果使用两种语言对工作负载进行编程,相对于另外一种语言,使用这种语言实现的工作负载能够以更少的实例数和更低的费用按时完成任务。
  • 进行优化以减少冷启动。尽量减少全局范围内发生的 CPU 密集型或长时间运行的任务。尝试将任务分解为多个可以“延迟加载”到请求上下文中的较小操作。
  • 如果您预计会发生突发流量,请配置预热的最小空闲实例数。如果您预计不会有流量,则可以将最小空闲实例配置为零。
  • 要平衡性能和费用,请在两个版本之间拆分流量(每个版本具有不同的配置),以运行 A/B 测试。监控每个版本的性能和费用,根据需要进行调整,然后确定将流量发送到的目标配置。
  • 配置请求并发,并将并发请求数上限设置为高于默认值。每个实例可以并行处理的请求越多,您可以使用现有实例来处理流量的效率就越高。

后续步骤