阿里巴巴在应用性能测试场景设计和实现上的实践

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 提升性能前,先测试摸个底,找到性能瓶颈。 测试前,先设计好应用性能的测试场景,并实现它。 本文是《Performance Test Together》(简称PTT)系列专题分享的第5期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论体系,并提供有例可依的实战。

本文是《Performance Test Together》(简称PTT)系列专题分享的第5期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论体系,并提供有例可依的实战。

该系列专题分享由阿里巴巴 PTS 团队出品,欢迎在文末处加入性能压测交流群,参与该系列的线上分享。

第1期:《压测环境的设计和搭建》

第2期:《性能压测工具选型对比》

第3期:《阿里巴巴在开源压测工具 JMeter 上的实践和优化》

第4期:《并发模式与 RPS 模式之争,性能压测领域的星球大战》

本文将介绍应用性能测试场景的设计和实现,旨在借助阿里巴巴在这方面的沉淀帮助您更准确的找到性能瓶颈,文章将围绕以下:

  • 性能测试的常见分类
  • 应用性能测试场景的设计
  • 应用性能测试场景的设计实践
  • 应用性能测试场景的实现

性能测试的常见分类

负载测试:
一种验证性测试,它的目的是验证预设负载条件下的性能表现是否达到性能目标(可用性、并发数/RPS、响应时间等),在达到性能目标之后不会继续增加负载。

稳定性测试:
负载测试的一个子集,侧重于发现、验证只有经过长时间的运行才会暴露的问题。比如内存泄漏、FGC 等。

压力测试:
一种破坏性测试,尝试探测应用或者基础设施的极限能力。因此压力测试过程中会一直增加负载直到部分性能指标不再符合性能预期。压力测试能发现仅在高负载条件下出现的同步问题、竞争条件、内存泄漏等。通过压力测试我们还可以确定应用服务在什么条件下会变得不可用,不可用的现象,以及可以通过哪些监控指标来监控即将发生的不可用,压测结果通常可以为限流等管控系统提供数据支撑。

容量测试:
往往与容量规划一起进行,是在保证用户体验不受影响(稳定性)的前提下,使有限的资源的利用率最大化(成本)。也可以用它来预估未来用户量增长到某个量级的情况下,需要多少资源(例如处理器、内存、磁盘、网络带宽)来支持。

应用性能测试场景的设计

在了解了相关背景之后,我们开始进入正题。性能场景的设计主要包括:业务场景建模、测试数据准备、监控指标确认三个关键步骤。下面我们用实战的方式说明每个步骤的常见做法。

业务场景建模

确定压测场景范围:
人类是不可预测的,在性能测试中模拟每个用户可能的操作场景基本上是不可能实现的。一般情况下我们必须要关注的性能场景包括但不限于:

  • 高频使用的场景
  • 关键的业务场景
  • 最耗性能的场景
  • 曾经出现过问题的场景
  • ……

在测试具有大量新功能的业务时,往往需要与业务方一起确认预期内有哪些功能点可能会被高频使用,需要与研发人员确认哪些功能虽然使用频率不高,但是存在性能隐患、容易引起雪崩效应;在测试已经上线的功能时,还可以通过业务监控、系统日志来分析现有用户的行为模式,得到更加逼近真实用户行为的业务场景。

业务场景的操作路径:
业务场景的操作路径可以借助一些可视化的工具来描述,这部分工作相对比较简单,不再详细深入。我们详细说明一下比较常见的延时策略。

思考时间:
思考时间模拟的是用户在等待响应、阅读页面内容、表单填写等延迟操作的场景。每个人的阅读速度、输入速度都存在非常大的差异,决定了每个人的思考时间也是不一样的,在性能测试配置中有常见的四种延时模型覆盖了绝大部分的延时场景:

  • 固定时间:顾名思义,设置一个固定的思考时间。
  • 均匀分布:均匀分布在范围的上限和下限之间的随机数。
  • 正态分布:根据中心极限定理,如果一个事物受到多种因素的影响,不管每个因素本身是什么分布,它们加总后,结果的平均值就是正态分布。
  • 负指数分布:该模型将延迟时间的频率强烈地偏向该范围的一端。
  • 双驼峰正态分布:双峰驼正态分布可以模拟第一次访问时把页面说明整个仔细的阅读一遍,但下次访问时直接扫过页面,点击页面深处的操作链接。

我们通常可以通过以下方式对思考时间进行建模:

  • 如果是已上线系统,可以从线上日志统计分析出来平均值以及标准方差
  • 没有线上日志,可以从内部人员的使用模式中收集响应的数据
  • 可以计算自己和同事访问的时候,在不同页面停留的时间
  • 如果没有更好的来源,也可以从第三方统计数据获取延时数据

集合点
集合点模拟的是大量的用户在同一时刻一起做同样的操作(加购、付款等),集合的方式通常包括按时间集合和按量集合。一般只有具备秒杀特性的业务才会使用到。虽然直接在压测工具中设置巨大的起步量级看似也能模拟秒杀的行为,但是压测工具一般都存在一个不太稳定的预热的过程,因此不推荐超高的起步量级模拟秒杀。

确定场景的施压参数

施压模式:
常见的施压模式有以下两种, 并发模式与 RPS 模式没有优劣,各自有各自适用的场景。

1、并发模式(虚拟用户模式)
并发是指虚拟并发用户数,从业务角度,也可以理解为同时在线的用户数。如果需要从客户端的角度出发,摸底业务系统各节点能同时承载的在线用户数,可以使用该模式设置目标并发。

2、RPS 模式(吞吐量模式)
RPS(Requests Per Second)是指每秒请求数。RPS 模式即“吞吐量模式”,通过设置每秒发出的请求数,从服务端的角度出发,直接衡量系统的吞吐能力,免去并发到 RPS 的繁琐转化,一步到位。

目标量级:
目标量级往往来自于对项目计划、目标,业务方要求,或者是技术文档的量化。

场景的负载占比:
已上线应用,尽量使用线上的日志、埋点数据结合业务运营的预期目标确保分配比例尽可能的符合实际情况;新上线的应用一般依靠事前预期分配虚拟用户,在测试的执行过程中可以逐步的调整。

测试数据准备

高质量的测试数据应当能真实的反映用户的使用场景。我们一般会选择以线上真实数据作为数据源,经过采样、过滤、脱敏,作为性能测试的测试数据。低质量的测试数据也许能够测试出一些问题,但是更大的可能性是无效的测试结果。压测数据至少包括基础数据和运行时数据两种。
基础数据,主要是应用系统存储的元数据,比如用户信息、产品信息、商品信息等;基础数据的数据量、数据分布应当与线上运行的数据量相当,否则容易引起无效测试。
运行时数据,主要是虚拟用户操作过程中需要使用的表单数据,比如虚拟用户的用户名、密码、搜索关键词等;运行数据的逼真度也是至关重要的。

确认监控指标

在性能测试执行过程中,往往需要实时观察各项指标是否正常,包括客户端指标、应用服务器、数据库、中间件、网络入口等各方面的指标。更重要的是,监控的过程是发现系统瓶颈的过程,监控数据是性能基线管理、容量规划甚至是高可用架构的重要基础。我们通常需要关注的监控指标包括:

  • 业务接口指标,响应时间、RPS、成功率等;
  • 网络指标,数据吞吐量、数据错误率等;
  • 服务器指标,连接数、CPU、内存、I/O、磁盘等;
  • ……

最理想的状态是,这些监控指标能够与性能测试工具集成,在一个操作界面上展示各个维度的监控数据,并能够基于策略来智能化、自动化识别指标异常。这对快速、准确的定位压测过程中可能出现的各种问题是至关重要的。

应用性能测试场景设计的实践

JPetStore 是一个开源的简单的Java语言开发的在线宠物商店,可以从 GitHub 获取到源码。为了方便演示,我们用阿里云 EDAS 部署了一套 JPetStore 宠物购物网站。

业务场景建模

在这次的实战演示中,我们通过实际操作体验的方式来获取所有的业务场景、操作路径、思考时间。我们先用文字的方式来描述场景和操作路径。

  • 用户登录,访问首页->进登录页->登录操作
  • 购买流程1,访问首页->选择产品大类->进入产品列表->进入型号列表->查看型号详情->加购物车->思考(3s-5s)->提交订单->确认订单
  • 购买流程2,访问首页->搜索产品->进入产品列表->进入型号列表->查看型号详情>加购物车->思考(3s-5s)->提交订单->确认订单
  • 购买流程3,访问首页->搜索商品->进入产品列表->进入型号列表->加购物车->思考(3s-5s)->提交订单->确认订单

我们的目的是做压力测试。我们选择 RPS 模式,梯度递增,漏斗模型;

  • 与并发模式相比,RPS 模式可以实现更加精准的流量控制;常见的限流设施都是基于TPS设置阈值的;因此我们首选 RPS 模式。
  • 我们使用手动递增的方式,逐步的逼近系统极限。
  • 在真实的业务中,用户会由于各种原因(网络、库存、不喜欢、付款失败等)而放弃购买,在此我们构造一个漏斗模型,我们假定100个人查看详情之后有30个人加入了购物车,15个人提交订单,最终10个人确认订单,购买成功;在真实的场景中我们可以从线上用户行为中采集到这些信息。

假定用户登录容量足够,不是这次压力测试的重点业务。我们基于线上日志和产品运营分析得出以下结论:

  • 使用购买流程1的用户占比10%
  • 使用购买流程2的用户占比60%
  • 使用购买流程3的用户占比为30%

最终,我们得到的业务模型如下图所示:

lALPDgQ9q7Vq2GfNAyLNBZM_1427_802_png_620x10000q90g

测试数据准备

因为该应用专为测试而生,不用考虑数据污染,我们免去采样、过滤、脱敏步骤,直接使用线上的基础数据作为压测的基础数据。基础数据的结构如下图所示,当然真实系统的基础数据,比这个复杂的多:
lALPDgQ9q7Vq2GjNApvNBO8_1263_667_png_620x10000q90g

常见的压测工具都支持 CSV 格式(可以简单理解为逗号分隔值,但是实际上更加复杂)的数据源。我们构造的用户登录的运行时数据格式如下图所示:
lALPDgQ9q7Vq2GnNAebNAq0_685_486_png_620x10000q90g

确认监控指标

依据我们的应用部署架构图,本次压测过程中需要关注 SLB、ECS、RDS 的基础指标(云监控)和压测引擎提供的 RPS、RT、成功率等接口指标。各项监控指标均有平台可以支撑,在此不做赘述。
lALPDgQ9q7Vq2GvNAo_NBPs_1275_655_png_620x10000q90g

应用性能测试场景的实现

性能场景的实现主要包括:压测工具选型、性能场景配置、施压参数配置三个关键步骤,某些压测工具还提供了监控集成、SLA 等功能,我们稍后也会做一些介绍。

压测工具选型

工欲善其事必先利其器,选择一款高效的压测工具往往能达到事半功倍的效果。然而压测工具选型已经是一个老生常谈的话题了,今天我们换个角度,从场景实现的角度再对比一下,希望对大家做选型有所帮助,如果有哪些方面不太完善的地方,请在文末留言讨论。对比详情,点击这里

lALPDgQ9q7Vq2G3NAiDNAt4_734_544_png_620x10000q90g

下面我们演示怎么在阿里云 PTS 上配置我们设计的压力测试场景,由于操作都比较简单,仅截取关键配置用于演示,大家如果有不明白的地方可以留言讨论或者进入我们的钉钉群中讨论。

下面我们演示怎么在阿里云 PTS 上配置我们设计的压力测试场景,由于操作都比较简单,仅截取关键配置用于演示,大家如果有不明白的地方可以留言讨论或者进入我们的钉钉群中讨论。

压测场景配置

1、高仿真场景编排,完美再现用户行为

压测接口录入:
录入接口信息是一件非常繁琐的事情,接口多,参数多经常容易出错。今天我们用PTS提供的云端录制器来演示怎么快速的梳理和录入所有涉及到的接口。云端录制器的原理是在本地电脑或者手机设备配置网络代理,云端录制器就能获取到所有网络请求的信息。具体的录制步骤如下:

  • 配置网络代理。请参考 PTS 录制器操作文档即可,这里不再赘述。
  • 在浏览器或者 App 中执行业务操作。强烈建议使用域名过滤功能,可以避免录制到干扰请求;每次执行业务操作前先创建一个步骤并备注上业务名称,而不要在所有操作录制完成之后在梳理分类(想象一下从几百个请求中捞出来哪些是登陆相关的请求吧)。
  • 选择录制到的接口信息,导入一个新场景。仍然请参考 PTS 录制器操作文档即可,这里不再赘述。
    lALPDgQ9q7Vq2G_NAijNBSw_1324_552_png_620x10000q90g

表单数据的参数化处理
这个步骤实际上是做场景与压测数据的分离。PTS 支持常见的 CSV 格式文件、包含一个 CSV 文件的 ZIP 文件作为场景的数据源。这里演示一下如何使用用户名和密码进行虚拟用户的登录,其他参数的设置与此类似,不在赘述。

第一步,将我们准备的测试数据上传到 PTS,并且给每一列设置变量名。

lALPDgQ9q7VxCmLNAj_NBIU_1157_575_png_620x10000q90g

第二步,编辑登录接口,将 username 变量的值和 password 变量的值设置为文件参数列表中的变量名。
lADPDgQ9q7Vq1_7NAoDNBJg_1176_640_jpg_620x10000q90g

接口间的参数关联处理
这个步骤的主要作用是从前置接口的返回内容中提取出后续接口需要的变量,传递给后续接口使用。在场景编排过程中经常会碰到很复杂的关联方式,比如加密、字符串截取等,可以使用系统函数、数据指令进行加工处理,详见 PTS 操作文档。我们演示一下怎么实现从产品列表中随机选择一个产品进行购买。

第一步,使用正则表达式从产品列表接口的响应中随机提取一个产品 ID ,作为该接口的出参。

lALPDgQ9q7VxCmTNAhXNBKw_1196_533_png_620x10000q90g

第二步,在型号列表接口中,修改参数 productId 的值为上一步导出的变量
lALPDgQ9q7Vq2BTNAfDNBKw_1196_496_png_620x10000q90g

第三步,将 itemId 也用类似的方式配置参数关联,就实现了虚拟用户随机购买商品的需求。操作过程类似,不在赘述了。

检查接口调用是否成功
检查点的作用是保证接口调用是成功的,配置了检查点的接口有业务成功率的监控指标,是发现服务端问题的重要渠道之一。PTS 支持多种复杂的检查点,具体配置请参考 PTS 操作文档。下面演示怎么给产品列表接口添加检查点,检查返回的产品 ID 是否存在。

lALPDgQ9q7Vq2BbNAf7NBI0_1165_510_png_620x10000q90g

2、灵活的施压配置,想怎么压就怎么压

施压参数配置
施压参数主要包括压力来源、压测模式、加压方式、虚拟用户分配等,根据之前设计的场景模型,我们直接配置上去即可。

第一步,配置目标量级、压力来源、压测时长、IP 扩展等信息
lALPDgQ9q7Vq2BnNAhbNBI8_1167_534_png_620x10000q90g

第二步,配置各个业务目标量级的分配占比,这也是漏斗模型的关键
lALPDgQ9q7Vq2BvNAb_NBFY_1110_447_png_620x10000q90g

流量来源定制
PTS 支持 IP 数量定制、国内公网流量的运营商和地域定制,如果有更加复杂的流量定制需求,还可以申请独占资源池,全球流量定制都不是问题。

lALPDgQ9q7Vq2BzNAorNBGA_1120_650_png_620x10000q90g

3、完整实时监控,瓶颈无所遁形

监控集成&SLA监控
PTS 支持添加云监控,用于查看各项指标,更好地保证测试前提,记录相关数据,输出最终结果。如果您使用了阿里云基础服务(ECS、RDS、SLB),均可通过添加监控的方式,在压测及报告中便捷地查看相应的监控数据。若未使用阿里云基础服务,亦可以使用PTS进行施压。

结合我们之前的架构图,我们给 ECS、SLB、RDS 配置云监控集成,利用 PTS 的监控大盘,方便的监控所有监控指标。

lALPDgQ9q7Vq2CDNAgLNBHc_1143_514_png_620x10000q90g

服务等级定义 SLA(Service Level Agreement)是判定服务是否异常的重要依据。压测过程中,通过监控核心服务状态的 SLA 指标数据,可以更直观地了解被压测业务的状态。PTS 支持定义常见的的、关键的 SLA:

  • 业务质量相关指标,RT、RPS、成功率;
  • ECS基础监控指标,CPU利用率、内存利用率、load5;
  • RDS基础监控指标,CPU利用率、连接利用率;
  • SLB基础监控指标,丢弃连接数、后端异常ECS数;

我们给提交订单、确认订单、商品详情、加购物车接口配置 SLA 监控,以及时的发现问题。

总结

本文介绍了性能压测场景设计和实现的常用方法和流程,针对目前几款受众相对较多的性能压测工具给出了场景实现相关的功能对比。与实际需求匹配的方法和工具才是最佳实践,大家可以针对不同需求选取最合适的性能压测工具来实施性能测试。

本文作者:蒋圣富,花名章进,阿里云 PTS 技术专家,2011年加入阿里巴巴,目前从事性能测试和高可用架构领域的相关工作。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
1天前
|
敏捷开发 人工智能 Devops
探索自动化测试的高效策略与实践###
当今软件开发生命周期中,自动化测试已成为提升效率、保障质量的关键工具。本文深入剖析了自动化测试的核心价值,探讨了一系列高效策略,包括选择合适的自动化框架、设计可维护的测试脚本、集成持续集成/持续部署(CI/CD)流程,以及有效管理和维护测试用例库。通过具体案例分析,揭示了这些策略在实际应用中的成效,为软件测试人员提供了宝贵的经验分享和实践指导。 ###
|
23小时前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
1天前
|
Java 测试技术 持续交付
探索自动化测试在软件开发中的关键作用与实践
在现代软件开发流程中,自动化测试已成为提升产品质量、加速交付速度的不可或缺的一环。本文深入探讨了自动化测试的重要性,分析了其在不同阶段的应用价值,并结合实际案例阐述了如何有效实施自动化测试策略,以期为读者提供一套可操作的实践指南。
|
1天前
|
Web App开发 敏捷开发 测试技术
探索自动化测试的奥秘:从理论到实践
【10月更文挑战第39天】在软件质量保障的战场上,自动化测试是提升效率和准确性的利器。本文将深入浅出地介绍自动化测试的基本概念、必要性以及如何实施自动化测试。我们将通过一个实际案例,展示如何利用流行的自动化测试工具Selenium进行网页测试,并分享一些实用的技巧和最佳实践。无论你是新手还是有经验的测试工程师,这篇文章都将为你提供宝贵的知识,帮助你在自动化测试的道路上更进一步。
|
1天前
|
敏捷开发 Java 测试技术
探索自动化测试:从理论到实践
【10月更文挑战第39天】在软件开发的海洋中,自动化测试是一艘能够带领团队高效航行的船只。本文将作为你的航海图,指引你理解自动化测试的核心概念,并分享一段实际的代码旅程,让你领略自动化测试的魅力和力量。准备好了吗?让我们启航!
|
6天前
|
测试技术 API Android开发
探索软件测试中的自动化框架选择与实践####
本文深入探讨了软件测试领域内,面对众多自动化测试框架时,如何依据项目特性和团队需求做出明智选择,并分享了实践中的有效策略与技巧。不同于传统摘要的概述方式,本文将直接以一段实践指南的形式,简述在选择自动化测试框架时应考虑的核心要素及推荐路径,旨在为读者提供即时可用的参考。 ####
|
8天前
|
网络协议 关系型数据库 应用服务中间件
【项目场景】请求数据时测试环境比生产环境多花了1秒是怎么回事?
这是一位粉丝(谢同学)给V哥的留言,描述了他在优化系统查询时遇到的问题:测试环境优化达标,但生产环境响应时间多出1秒。通过抓包分析,发现MySQL请求和响应之间存在500毫秒的延迟,怀疑是网络传输开销。V哥给出了以下优化建议:
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试的边界:从基础到高级的实践之旅
【10月更文挑战第21天】 在当今数字化时代,软件已成为我们生活和工作中不可或缺的一部分。随着技术的快速发展,对软件质量的要求也日益提高。本文旨在通过深入浅出的方式,带领读者踏上一场从基础到高级的软件测试实践之旅。我们将探讨软件测试的基本概念、重要性以及如何有效地进行测试规划和执行。通过具体案例分析,揭示常见错误及其解决方案,同时展望未来软件测试领域的发展趋势。无论你是软件开发新手还是经验丰富的测试工程师,这篇文章都将为你提供宝贵的见解和启发。
34 8
|
16天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
11天前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。

相关产品

  • 性能测试