本页面提供了对 Cloud Run 服务进行负载测试的最佳实践,以确定该服务是否在生产使用中成功扩缩,以及发现导致其无法扩缩的任何瓶颈。
在进行负载测试之前要运行的测试
在继续进行负载测试之前,先在开发或小型测试环境中发现并解决并发问题。在执行负载测试之前,请先测量容器并发性,并确保 Cloud Run 服务能够可靠地启动。
在手动扩缩的运行中,将容器测试重点放在小增量计数上。 您可以在 Cloud Run 中进行近似手动扩缩,方法是将实例数上限设置为要扩缩到的值。
如果您刚刚构建了容器映像或最近更改了容器映像,请在执行负载测试之前独立测试该映像。
在运行大规模负载测试之前,您还应检查其他类型的性能问题,例如过高的延迟时间和 CPU 利用率。
合理使用 max instances
Cloud Run 会强制执行实例数上限,以限制服务的扩缩。默认的实例数上限为 100。 如果您预计负载测试会超出此默认值,请务必与您的 Google 客户支持团队联系,并设置新的最大值。如果您尚未与客户支持团队建立联系,请与 Google Cloud 销售人员联系。
您可以选择的最大实例数量取决于您的 CPU 限制和内存限制,以及您要部署到的区域。
这些限制由配额限制管理,并可以通过增加配额请求来提高。
在 europe-west1
区域中进行负载测试
Google Cloud 区域 europe-west1
提供较高的配额限制,因此 Google 建议在 europe-west1
中进行负载测试。如果您预计会接近配额限制,请与您的客户支持团队协调并提交包含测试时间和规模详细信息的支持请求。
测试适当的 CPU 利用率和服务初始化配置文件
在理想情况下,您可以将服务的测试版本部署到 Cloud Run,并直接对其进行负载测试。不过,在某些情况下,您可能无法部署服务的测试版本。例如,您的 Cloud Run 服务可能属于一个复杂的生态系统,很难在测试环境中复制。
对于这些情况,您可以模拟具有类似 CPU 使用率和类似初始化时间的更简单服务,从而近似估计服务的性能。初始化时间对于快速扩缩尤为重要。请注意,使用太简单的内容进行测试也存在问题。例如,避免使用简单的 hello world
服务进行测试,该服务会返回收到的请求,而不进行任何处理。
使用自动化测试框架生成负载
您可以使用 JMeter 等自动化测试框架生成测试负载,从而导致流量出现可控的峰值。您可以使用 JMeter 测试中的 JMeter 线程组数量和请求之间的延迟来增加负载。
您还可以发送简单的 HTTP 请求,或者使用 JMeter 记录浏览器会话。借助 Developer Authentication,Cloud Run 可让您在没有互联网连接的情况下测试服务。这样一来,您就可以从测试框架(例如在连接到与项目关联的虚拟私有云 [VPC] 的 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 服务与负载一起线性横向扩容,并且不会在负载低于您预期的生产负载时达到限制瓶颈。
在 Colaboratory 中分析和直观呈现结果
使用汇总监控图表大致了解结果,以补充使用导出日志进行的详细日志分析。
监控图表可帮助您发现:
- 新实例的创建和初始化速度有多快(精确到秒)?
- 请求在不同实例之间分布的均匀程度如何?
- 不同百分位数的延迟可以多快下降到稳态值?
您可以使用适用于 BigQuery 的 Google Cloud 控制台界面来检查导出的日志架构并预览结果。使用 Colab 运行查询并绘制结果图表,该工具已准备好与 BigQuery、Pandas 和 Matplotlab 集成。Colab 还可方便地与丰富的数据可视化工具(例如 Seaborn)集成。
查找瓶颈
负载测试有助于您发现低效代码和扩缩瓶颈。低效的代码会导致更高的费用,因为它需要处理更多流量,但并不一定会阻止扩缩。例如,对具有表级锁定的数据库事务的依赖可能会成为瓶颈,因为一次只能执行一个事务,从而阻止 Cloud Run 服务进行扩缩。
检查客户端体验到的性能
您可以查询 JMeter 捕获的日志,这些日志包含在客户端测量的延迟时间。但是,由于 JMeter 等服务器测试工具与浏览器或移动客户端不同,因此您可能还需要使用基于浏览器的框架(例如 Selenium Webdriver)或移动客户端测试框架运行测试。请注意,由于 TLS 连接初始化导致的延迟时间太长,可能会导致包含离群值的结果出现偏差。
最佳做法摘要
执行负载测试,以确定迁移到 Cloud Run 是否是正确的选择,以及您的服务是否可以根据预期流量的最大值进行扩缩。 使用 JMeter 等自动化测试框架运行测试。将日志导出到 BigQuery 以进行详细分析。