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

本文是《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%

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

 

测试数据准备

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

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

确认监控指标

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

应用性能测试场景的实现

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

压测工具选型

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

 

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

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

压测场景配置

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

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

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

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

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

 

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

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

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

 

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

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

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

总结

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


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux-centos7 常用的基本命令--Vim编辑器

一、Vim编辑器 1、什么是 vim? Vim通过一些插件可以实现和IDE一样的功能! Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 简单的来说, vi 是老式的字处理器…

linux-centos7 常用的基本命令--用户账号管理、查看和修改主机名

简介 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们…

领导者必备:三元简化模型,助你加速团队成长

关注成员成长 很早之前,现代管理之父德鲁克提出过一个影响深远的观点,“21世纪的组织,最有价值的资产是组织内的知识工作者和他们的生产力。”现代企业的各位管理者,遇到最大的两类问题就是战略和组织,看不到、想不到…

90% 程序员都吃亏在这门技术上了,你呢!

老李一直怀疑自己是不是年纪大了,脑子跟不上了。作为十几年经验的资深 Java 工程师,维护这公司产品的核心代码的他,现在迭代产品的时候,经常出 Bug 。有时修复一个 Bug 时间,比开发一个需求的时间要长很多,…

车载多传感器融合定位方案:GPS +IMU+MM

导读 高德定位业务包括云上定位和端上定位两大模块。其中,云上定位主要解决Wifi指纹库、AGPS定位、轨迹挖掘和聚类等问题;端上定位解决手机端和车机端的实时定位问题。近年来,随着定位业务的发展,用户对在城市峡谷(高…

linux-centos7 常用的基本命令--用户组管理

用户组管理 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理(开发、测试、运维、root)。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同…

我画了35张图,就是为了让你深入 AQS!

来源 | 程序员cxuan责编 | Carol谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Sem…

Cassandra Java堆外内存排查经历全记录

背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测。压测时候比较容易触发OOM Killer,把cassandra进程干掉。问题是8G这个规格我配置的heap(Xmx)并不高(约6.5g)已经留出了足够的空间给系统。只有可能是Java堆…

数据中台之结构化大数据存储设计

前言 任何应用系统都离不开对数据的处理,数据也是驱动业务创新以及向智能化发展最核心的东西。这也是为何目前大多数企业都在构建数据中台的原因,数据处理的技术已经是核心竞争力。在一个完备的技术架构中,通常也会由应用系统以及数据系统构…

清华硕士爆料:这些才是机器学习必备的数学基础

现如今,计算机科学、人工智能、数据科学已成为技术发展的主要推动力。无论是要翻阅这些领域的文章,还是要参与相关任务,你马上就会遇到一些拦路虎:想过滤垃圾邮件,不具备概率论中的贝叶斯思维恐怕不行;想试…

从求生存到修体系,我在阿里找到了技术人的成长模式

阿里妹导读:做业务就好比打仗,团队是我们的归属。在团队中,我们既要通力协作,又要定义问题,既要业务先赢,又要技术成长。越来越多的前端投身业务研发中。想要有更好的发展,业务理解力非常关键。…

2分钟 Docker 部署 SprinBoot 集成 Flowable 工作流引擎

文章目录一、 简介二、 docker流程引擎部署2.1. jdk安装配置2.2. 下载打包好的tar包2.3. 上传tar包2.4. 在线安装Docker2.5. 检验安装是否成功三、tar转docker镜像3.1. 查看当前镜像3.2. 加载备份的flow-mysql.tar镜像文件3.3. 加载备份的flow-admin.tar镜像文件3.4. 加载备份的…

亿级规模的 Feed 流系统,如何轻松设计?

阿里妹导读:互联网进入移动互联网时代,最具代表性的产品就是各种信息流,像是朋友圈、微博、头条等。这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长。这些产品都是Feed流类型产品,由于Feed流一般是按照时间“从…

linux-centos7 常用的基本命令--磁盘管理(df、du)、进程管理

一、磁盘管理 df(英文全称:disk full):列出文件系统的整体磁盘使用量(类似于windows我的电脑中的显示)du(英文全称:disk used):检查磁盘空间使用量 1、df …

他靠下班后 1 小时,挣到 3 倍工资:赚钱,真的不用拼命

越来越多的人学习编程不再只是为了当程序员,而是为了提升效率,多一份职业技能,正面应对瞬息万变的全球大环境。据麦肯锡全球研究院发布的一份就业报告中显示,到 2030 年,中国预计将有 1200 万~ 1.02 亿人面…

蚂蚁金服褚霸:敲最牛的代码,骑最野的车

你印象中的程序员是怎样的群体?随着全民互联网的发展,程序员这个群体快速走进大众视野,在新闻和影视剧中,他们被贴上各种标签:双肩包、格子衫、拖鞋、秃顶、刻板、木讷、单身……热搜新闻“996.ICU”更是道出了万千程序…

linux-centos7 常用的基本命令--top

1、Linux top 命令 1.1 top 命令基础用法 Linux top命令用于实时显示 process 的动态。 语法 top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]参数说明: d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 sq : 没有任何延迟的显示…

MongoDB副本集同步原理

MongoDB的同步原理,官方文档介绍的比较少,网上资料也不是太多,下面是结合官方文档、网上资料和测试时候的日志,整理出来的一点东西。 因为MongoDB的每个分片也是副本集,所以只需要搞副本集的同步原理即可。 一、Initi…

阿里技术专家告诉你,如何画出优秀的架构图?

作者 | 三画责编 | Carol来源 | 公众号「阿里巴巴云原生」导读:技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改…

解决Linux docker中的mysql区分大小写问题

注:mysql5.7为本例docker中mysql容器的名称。 进入mysql容器: docker exec -it mysql5.7 /bin/bash以root用户登录mysql: mysql -u root -p查看当前mysql的大小写敏感配置: show global variables like %lower_case%;lower_case_file_sys…