本页面提供了对 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 控制台界面来查看导出的日志架构并预览结果。使用 Colab 运行查询并绘制结果,Colab 已与 BigQuery、Pandas 和 Matplotlab 集成。Colab 还可以轻松与 Seaborn 等丰富的数据可视化工具集成。
找出瓶颈
负载测试可以帮助您发现代码效率低下和扩容瓶颈问题。低效代码会导致更高的费用,因为它需要处理更多的流量,但不一定会阻止扩缩。例如,对具有表级锁定的数据库转换的依赖可能会成为瓶颈,导致 Cloud Run 服务无法扩缩,因为一次只能执行一个事务。
检查客户端体验到的性能
您可以查询由 JMeter 捕获的日志,其中日志包含在客户端测量的延迟时间。但是,由于 JMeter 等服务器测试工具与浏览器或移动客户端不同,因此您可能还需要使用基于浏览器的框架(例如 Selenium Webdriver)或移动客户端测试框架运行测试。请注意,由于 TLS 连接初始化导致的延迟时间太长,可能会导致包含离群值的结果出现偏差。
最佳做法摘要
执行负载测试,以确定迁移到 Cloud Run 是否为正确之选,以及您的服务是否可以扩容到预期的最大流量。使用 JMeter 等自动化测试框架运行测试。将日志导出到 BigQuery 以进行详细分析。