负载测试最佳实践

本页面提供了对 Cloud Run 服务进行负载测试的最佳实践,以确定该服务是否在生产使用中成功扩缩,以及发现导致其无法扩缩的任何瓶颈。

在负载测试之前运行的测试

在开发或小型测试环境中识别并解决并发问题,然后再继续进行负载测试。在执行负载测试之前测量容器并发数,并确保您的 Cloud Run 服务可靠启动。

在手动扩缩的运行中使容器测试专注于较小的增量。您可以在 Cloud Run 中进行近似手动扩缩,方法是将实例数上限设置为要扩缩到的值。

如果您刚刚构建了容器映像或最近更改了容器映像,请在执行负载测试之前独立测试该映像。

在运行大规模负载测试之前,您还应检查其他类型的性能问题,例如过度延迟和 CPU 利用率。

正确使用 max instances

Cloud Run 会强制执行实例数上限以限制服务的扩缩。默认的最大实例数为 100。如果您预计负载测试会超过此默认值,请确保与 Google 的客户支持团队合作并设置新的最大值。如果您尚未与客户支持团队建立联系,请与 Google Cloud 销售人员联系

您可以选择的实例数上限取决于您的 CPU 限制内存限制,以及要部署到的区域。

这些限制由配额限制管理,并可以通过增加配额请求来提高。

区域 us-central1 中的负载测试

Google Cloud 区域 us-central1 提供较高的配额限制,因此 Google 建议在 us-central1 中进行负载测试。如果您预计会接近配额限制,请与您的客户支持团队协调并提交包含测试时间和规模详细信息的支持请求。

测试适当的 CPU 利用率和服务初始化配置文件

理想情况下,您应将服务的测试版本部署到 Cloud Run 并直接对其进行负载测试。但是,在某些情况下,您可能无法部署服务的测试版本。例如,您的 Cloud Run 服务可能属于难以在测试环境中复制的复杂生态系统。

在这些情况下,您可以使用具有类似 CPU 使用量和类似初始化时间的更简单的服务来模拟服务,从而估算服务性能。初始化时间对于快速扩缩尤为重要。请注意,使用太简单的内容进行测试也存在问题。例如,避免使用简单的 hello world 服务进行测试,该服务会返回收到的请求,而不进行任何处理。

使用自动化测试框架生成负载

您可以使用自动化测试框架(例如 JMeter)生成导致流量控制高峰的测试负载。您可以使用 JMeter 线程组的数量并在 JMeter 测试中的请求之间延迟来增加负载。

您还可以发送简单的 HTTP 请求,也可以使用 JMeter 记录浏览器会话。借助 Cloud Run,您可以使用开发者身份验证测试服务,而无需访问互联网。这样,就可以在连接到与项目关联的 Virtual Private Cloud 的 Compute Engine 虚拟机上运行的自动化测试框架(如 JMeter)进行访问。

请勿通过无法控制速率和并发的工具生成负载。Pub/Sub 是一种不适合生成负载的工具,因为您无法控制流量的速率和客户端的数量。如果您不知道速率和并发数,则不知道要测试的内容。

通过导出的日志使用详细的日志分析

您需要对事件进行按秒分析,以了解您的 Cloud Run 服务对快速流量高峰的响应情况。为此,您需要进行日志分析,因为监控数据的粒度不够精细。此外,您还可以利用日志分析来调查请求延迟时间较长的原因。

写入日志时,您可以通过直接写入 stdout 而不是使用 Cloud Logging 客户端库来获得更好的日志记录性能。

如需在开始测试之前设置日志导出,请使用目标 BigQuery 和包含项过滤条件创建日志接收器,例如:

resource.type="cloud_run_revision"
resource.labels.service_name="[your app]"

避免虚假冷启动

为了最大限度地减少用户冷启动,请将实例数下限设置为至少 1。

确保服务可以线性横向扩容

在不同负载下重复测试,以确保您的 Cloud Run 服务与负载一起线性横向扩容,并且不会在负载低于您预期的生产负载时达到限制瓶颈。

在 Colab 中分析和直观呈现结果

使用摘要监控图表深入了解结果,以通过导出的日志进行详细日志分析

监控图表可以帮助您发现:

  • 新实例的创建和初始化速度有多快(精确到秒)?
  • 请求在各实例之间的分布均匀程度如何?
  • 不同百分位数的延迟可以多快下降到稳态值?

您可以使用适用于 BigQuery 的 Google Cloud 控制台界面来查看导出的日志架构并预览结果。使用可与 BigQuery、Pandas 和 Matplotlab 集成的 Colab 运行查询并绘制结果。Colab 还可以轻松与丰富的数据可视化工具(如 Seaborn)集成。

找出瓶颈

负载测试可帮助您发现低效代码和扩缩瓶颈的存在。低效代码会导致更高的费用,因为它需要处理更多的流量,但不一定阻止扩缩。例如,对具有表级层锁定的数据库转换的依赖可能会成为瓶颈,导致 Cloud Run 服务无法扩缩,因为一次只能执行一个事务。

检查客户端体验的性能

您可以查询 JMeter 捕获的日志,其中的日志包含客户端测量的延迟时间。但是,由于 JMeter 等服务器测试工具与浏览器或移动客户端不同,因此您可能还需要使用基于浏览器的框架(例如 Selenium Webdriver)或移动客户端测试框架运行测试。请注意,由于 TLS 连接初始化导致的延迟时间太长,可能会导致包含离群值的结果出现偏差。

最佳做法摘要

执行负载测试以确定迁移到 Cloud Run 是否是正确的选择,以及您的服务是否可以扩缩到预期的最大流量。使用 JMeter 等自动化测试框架运行测试。将日志导出到 BigQuery 以进行详细分析。

后续步骤