性能测试场景的设计方法

news2024/11/10 15:41:41

作者|李文,自如-质量中心

来源|自如技术公众号

图片

背景

引用:根据2008年Aberdeen Group的研究报告,对于Web网站,1秒的页面加载延迟相当于少了11%的PV(page view),相当于降低了16%的顾客满意度。如果从金钱的角度计算,就意味着:如果一个网站每天挣10万元,那么一年下来,由于页面加载速度比竞争对手 慢1秒,可能导致总共损失25万元的销售额。

Compuware公司分析了超过150个网站和150万个浏览页面,发现页面响应时间从2秒增长到10秒,会导致38%的页面浏览放弃率。由此可见,网站性能与业务目标有着直接的关系,对网站进行性能测试非常重要。

做性能测试的同学都知道性能执行中有很多场景,每个企业还会有自己定义的场景名词在这里就不列举,我做性能一般使用四个场景(基准场景、容量场景、稳定性场景、异常场景)来覆盖一个性能需求。下面聊一聊这四个场景怎么落地怎么覆盖性能需求。

图片

图片

实际落地

在聊四个场景之前我们先聊下性能测试一般流程,流程就是规则,在孟子-《离娄章句上》:"离娄之明,公输子之巧,不以规矩,不能成方圆"。有这个流程后遇到性能测试就不会乱手脚,就可以按这个流程开展工作。

图片

关于每个动作需要做什么内容,做性能测试的人一看就知道需要做什么内容,在这里就不展开说明具体内容。我们做好前置条件后,就可以开展场景设计与执行,对于性能分析就不在这节课讲解,这里使用 Jmeter 压力工具、 TPS 是指 Jmeter 中Summary Report 组件中的 Throughput 值、后端接口不考虑前端页面js、css等页面元素加载时间,在具体做性能测试中也可以使用其他压力工具做,没有限制用什么压力工具,这里主要讲解场景怎么使用。

图片

基准场景

基准场景就是单个接口进行压测,如果这样讲解谁都知道,那么我们应该怎么做基准场景呢?

  • 环境准备

在互联网企业做性能测试一般都选择在线上进行压测,都知道搭建一套与线上一致的压测环境成本比较高如硬件成本、软件成本、人力成本、维护成本等等所以互联网企业选择线上做压测。 对于不是一线互联网企业或者传统行业一般都是在测试环境中做压测,我待过的银行保险就有自己的压测环境,他们的环境相对来说比较独立,做压测,做调优相对来说比较方便。

在测试环境中压测建议机器配置与线上机器配置一致,应用容器配置也得与线上环境一致,只有这样压测出来的结果才真实,说白了就是压测环境与线上环境需要一致,如果不能一致需要按一定比例做缩容。

  • 数据准备

对于数据准备我们需要考虑压测环境中的铺垫数据量,一般铺垫数据来源脱敏后的真实生存库数据,在压测开始前需要把数据库备份,方便做问题排查,问题定位等等。如果数据量与线上数据量不一致,会导致压测结果不可信,大家可以思考下一个几百条数据库与线上百万,千万条数据库在性能上面根本不是一个级别的事情,所以在压测时候需要考虑压测环境中铺垫数据量。

  • 参数准备

在做性能压测脚本时我们需要准备参数化数据,很多人觉得做性能测试几条数据就够,不需要大量数据做性能测试,这样就会导致压力与真实生存环境不一致,比如,几十条数据操作出千万级乃至亿级业务,这样压测出来的场景可信度就不好说。那么到底多少参数设置合理呢?

要回答这个问题需要确定参数化用在什么场景,因为场景不一样,参数化数据也不一样,假如不考虑场景情况下,100个线程,TPS 为800,系统运行1小时,数据类型、限制条件和数量计算方式如下:

假如把场景考虑进来我们就根据实际业务场景来分析用到什么样的数据,以便计算参数化数据量,这里的数据包括重复与不重复的数据,这里用我司统一登录做举例说明,对于登录业务需要两个参数一个是账号,一个是密码(这不考虑通过验证码登录)账号与密码必须可登录系统的否则不能完成后续业务操作,很显然不同人一定用不同账号登录。

➢ 场景一

我们在做脚本的时候,有多少线程就配置多少个用户,让每个线程用同一用户循环执行业务操作,但是这样的参数配置只能满足特定业务场景,比如早上登录后一直不退出,一直带着 token 操作业务,到下班退出系统,这样的场景我们有多少线程就需要准备多少用户数据。

➢ 场景二

对于一个电商系统按上面参数就不可取,因为一个账号不停购买商品这样的行为完全不符合真实场景,这时候我们应该怎么办呢?在这样的场景中,我们需要考虑TPS 和持续时间,用户数据计算方式参考:

➢ 场景三

假如一个线程可以循环使用固定参数,在这情况下我们需要根据实际业务判断,比如100 压力线程情况下,我们准备 1000 条数据,我们就可以让每个线程用不同的 10 条数据。这样的场景没固定条数限制,只能根据实践业务判断,但是在配置这个参数之前还需要考虑参数是什么类型,如果是可循环的数据,那么它在真实性能场景非常少,也就是说只使用一条或者几条测试数据真实场景基本没有。

  • 参数化数据

知道参数用多少后,还需要解决参数化数据从什么地方获取,这一步目的是确保参数数据是有效的,一般我们参数化数据来源两个方向,一个是后台数据库存在的,一个是数据库不存在通过压力工具造出来的数据。

总之参数化数据来源需要确保数据的有效性,这些数据需要满足下面两个条件:

✓    满足生产环境数据分布

✓    满足性能场景中数据量的要求

对于一个系统来说,参数化数据是否合理,会直接影响压力测试结果是否有意义。如果压力工具使用的数据量少,那么那么应用服务器、缓存服务器、数据库服务器等都将使用少量的缓存来处理,导致不能把后端各类服务器的缓存占用到真实场景中应该有的大小,所以在这种状态之下是测试不出来真实场景下的压力。

对数据库连接的存储设备来说同样也有影响。如果数据量少,则相应的存储的 I/O 使用就少。参数取得过多,对系统的压力就会大;参数取得过少,不符合真实场景中的数据量,则无法测试出系统真实的压力。

如果参数来源于数据库,我们通常要检查一下数据库中的数据直方图。对于直接从生产上拿的数据来说,数据的分布更为精准。但是对于一些在测试环境中造的数据,则一定要在造数据之后,检查下数据分布是否与生产一致。有上面准备后,就可以开始做基准测试,我们在做基准测试需要注意两个点:

图片

我们在实施中什么时候基准场景结束呢?或者到压到什么情况下就可以结束基准场景呢?一般压测过程中接口调用系统资源使用率到达90%或者完全把系统资源使用完毕就可以停止基准场景,注意遇到性能问题需要调优确保资源充足使用,以达到 TPS 还有响应时间是最合理。

图片

容量场景

对于容量场景来说就是把之前基准场景所有接口按一定比例组合起来一起执行,还有做容量场景的目的是要回答“线上容量最大能达到多少”的问题。这里有个问题就是接口与接口间的比例怎么定?在压力工具中又怎么配置?如果不能解决这些问题我们就没法做容量场景设计,可能有些同学就说,直接把接口全部放到一个场景按1倍、2倍、3倍等倍数直接跑就行,没有必要考虑每个接口比例,直接跑个最大值就行,但是这样场景与实际场景有差距,跑出来的场景脱离真实性,那么我们应该怎么设计呢?还有一个问题就是容量场景什么时候停止?

首先我们可以抽取生产日志,相信每个公司都有日志系统,如果没有日志系统可以使用 awk 命令去抽取日志,还可以使用 ELFK 来抽取日志,有上面数据后,就可以梳理业务逻辑。

我司可以通过 lambda 平台可以获取被压测日志,通过检索条件获取我们想要一段时间的接口数据:

图片

如果没有这样的系统我们可以在 Nginx 日志中获取相关数据, 可以通过写 python 脚本处理也可以使用 shell 命令获取我们想要的数据,我们需要数据格式为:

这样我们就可以知道,每个时间段内每个请求的数量,也就可以得到相应的业务比例了。

如果是 ELFK 抽出生存日志大家可以自己安装一个这样的环境配置后,设置相关条件抽出上面数据对应关系的数据类型。

注意:如果出现某个请求的高并发时间点和其他的请求不在同一时间点,就一定要做多个场景来模拟,因为场景中的业务模型会发生变化。

假设我们通过上面步骤就能得出被压测接口的调用量与请求比例,也就可以拿某请求的数量除以总请求数得出每个接口的比例,这里使用一个表格做说明(注意里面数据是假设出来):

这里总结下获取生产数据比例步骤:

图片

请注意,上面的业务场景在实际的项目业务统计过程中可以有多个。这个思路可以解决任何性能场景和生产场景不一致的问题。有业务比例后接下来我们需要梳理业务场景,用场景覆盖业务比例,场景比例应该怎么设计呢,大家可以思考下,设计几个场景能覆盖上面接口业务比例,这里就不讲解,大家自己思考思考。

用 JMeter 里面,会用Throughput Timer来控制TPS。

图片

关于 Throughput Controller  控制器怎么场景比例,大家可以查询资料就能解决。

有上面业务比例后,我们可以思考下容量场景在什么情况下结束呢?我们在做容量场景时需要确定一个目标,否则就没有结束时间点。大家是否还记得我们在业务比例分配的时候是按一个数据总量分配给每一个接口做比例,这个总量就是我们容量测试的目标。

图片

稳定性场景

我们在前面提到,容量场景是为了看系统所能承受的最大容量,而稳定性场景主要看的是系统提供长时间服务时的性能稳定性,观察系统在长时间运行过程中出现的累积效应。因此,运行时长就是稳定性场景中非常重要的一个指标了。

这里需要明白稳定性运行时长不是固定的,它取决于业务系统的具体应用场景,那么应该怎么计算稳定性时间呢?这里提供一种计算执行时间计算方法。

假设你根据生产系统统计出,在之前的运维周期中,有6千万的业务容量,而在容量场景中得到的最大TPS有1000。那么,我们就可以通过下面这个公式来计算:

稳定性运行时长=6千万(业务累积量)÷1000(TPS)÷3600(秒)≈16(小时)。

不管是什么样的系统,要想运行稳定性场景,都得确定一个业务累积量(一时间业务总量),我们在执行的时候直接用最大TPS来运行,如果一个系统在最大TPS状态下正常运行,才能验证系统能否经得起考验。

图片

异常场景

在异常场景设计中首先针对系统的架构,先分析异常场景中的需求点,再设计相应的案例来覆盖。为什么要分析系统架构呢?因为在一个应用中,我们把功能测试完一遍之后,异常问题通常有两大类:其一是架构级的异常;其二是容量引起的性能异常。而对于架构级的异常,我们只能站在架构的角度进行分析。

从性能技术的角度来说,基本上采用的是宕主机、断网络、宕应用等常用测试手段,现在市场上还有混沌工具,大家也可以采用混沌工具做异常测试,这提供一些通用手段帮助大家做操作:

✓ 主机:断电、reboot、shutdown 等;

✓ 网络:ifdown 命令关网卡、模拟抖动丢包延时重传等;

✓ 应用:kill、stop 等。

这里再谈下异常场景设计的逻辑,第一步把技术架构中的组件全部列出来,并分析可能产生异常的点,第二步根据分析异常点设计对应的场景。在很多时候都是根据感觉走,就会导致异常场景覆盖不全,这里建议参考 FMEA 失效模型来设计异常场景,因为有 FMEA 可以让我们有章可循,这里要注意的是对于任何方法论还有逻辑在实践落地时候都不要过度使用,而是要注意内容的合理性。

这里只是提供一种设计思路,大家在落地的时候把不符合自己公司的或者实践干活的可以去的,希望大家设计一套符合自己系统的异常场景模型。

TesterHome 学堂测开课:

从0到1实现UI自动化测试和框架设计 (Java技术栈)

Python+Appium移动端自动化项目实战

移动测试平台二次开发入门

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

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

相关文章

Unity--互动组件(Toggle Group)||Unity--互动组件(Slider)

Toggle Group 属于同一组的切换开关受到限制,因此一次只能打开其中一个开关,按下其中一个开关时,其他的开关将会自动关闭; Allow Switch Off:(允许关闭) 如果禁用此设置,则按下当前…

Hadoop的概述

1、Hadoop的发展史: Google首先发布三篇文章:GFS(Google File System)、Mapreduce(计算引擎)、Bigtable ,随着时间的推移: hadoop1.0与2.0 的区别是在2.0的版本中出现了yarn,主要是负责资源的调…

【轨道机器人】实现Windows与下位机串口通信(未完成)

方案一:QT,编写类似串口调试助手的APP,连接上硬件,qt有个好像是串口缓存函数,可以防止占用CPU。(缺点qt估计要时间学) 方案二:利用vscode、C,编写一个可执行exe文件&…

面向对象和原型/原型链学习

##构造函数执行的机制 函数的其中一个作用,就是构造函数. ###new关键字 1.创建一个对象; 2.这个对象的原型,可以看到这个Function 3.该对象,实现了这个构造函数的方法. 4.根据一些特定情况,返回: (1)如果没有返回值,就返回一个对象; (2)如果返回一个基本类型,则还是返回…

利用Vue+Echarts完成可视化任务

文章目录 任务一:用柱状图展示消费额最高的省份(一)提出任务(二)准备工作1、利用postman访问接口数据2、安装node.js3、输入更换镜像源为淘宝源4、清除npm缓存5、安装vue脚手架 任务一:用柱状图展示消费额最…

2023.11.15-hivesql之炸裂函数explode练习

把一个容器的多个数据炸裂出单独展示: explode(容器) 需求:将NBA总冠军球队数据使用explode进行拆分&#xff0c;并且根据夺冠年份进行倒序排序。 1.建表 --step1:建表 create table the_nba_championship(team_name string,champion_year array<string> ) row format…

手摸手入门Springboot2.7集成Swagger2.9.2

环境介绍 技术栈 springbootmybatis-plusmysqloracleSwagger 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 REST软件架构风格 REST即表述性状态传递&#xff08;英文&#xff1a;Representational State T…

【informer】 时间序列的预测学习 2021 AAAI best paper

文章目录 前言1.引入2.数据集训练 前言 数据集 https://github.com/zhouhaoyi/ETDataset/blob/main/README_CN.md 代码&#xff1a;https://github.com/zhouhaoyi/Informer2020#reproducibility 21年的paper:https://arxiv.org/pdf/2012.07436.pdf 论文在代码上有连接&#xf…

Promise 重写 (第一部分)

学习关键语句&#xff1a; promise 重写 写在前面 重新学习了怎么重写 promise &#xff0c; 我觉得最重要的就是要有思路&#xff0c;不然有些 A 规范是完全想不到的 开始 重写函数的过程中, 最重要的是有思路 我们从哪里获取重写思路? 从正常的代码中 我们先看正常的代码…

C语言判断水仙花数(ZZULIOJ1027:判断水仙花数)

题目描述 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff0c;他是这样定义的&#xff1a;“水仙花数”是指一个三位数&#xff0c;它的各位数字的立方和等于其本身&#xff0c;比如153135333。 现在要求输入一个三位数&#…

delete 与 truncate 命令的区别

直接去看原文 原文链接:【SQL】delete 与 truncate 命令的区别_truncate和delete的区别-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 1. 相同点 二者都能删除表中的数据…

不敢信,30+岁的项目经理会是这样

大家好&#xff0c;我是老原。 你们知道&#xff0c;每个阶段的项目经理都是什么样的吗&#xff1f; 20多岁时&#xff0c;刚踏入项目管理的你可能是个什么都不懂的职场小白&#xff0c;或者只能在旁边打打下手&#xff1b; 到了30岁&#xff0c;经历了项目的人情冷暖&#…

QT中的鼠标事件

鼠标追踪打开后进去一动就显示

我把微信群聊机器人项目开源

▍PART 序 开源项目地址》InsCode - 让你的灵感立刻落地 目前支持的回复 ["抽签", "天气", "讲笑话", "讲情话", "梦到", "解第", "动漫图", "去水印-", "历史今天", "星座-…

Linux控制---进程程序替换

前言&#xff1a;前面我们学洗了Linux进程退出的相关知识&#xff0c;了解了什么是进程退出&#xff0c;已经进程等待的相关话题&#xff0c;今天&#xff0c;我们来学习Linux中的进程程序替换&#xff0c;进程程序替换在Linux中可以用于实现新程序的启动、程序升级、多进程程序…

k8s-集群升级 2

在每个集群节点都安装部署cir-docker 配置cri-docker 升级master节点 导入镜像到本地并将其上传到仓库 修改节点套接字 升级kubelet 注&#xff1a;先腾空后进行升级&#xff0c;顺序不能搞反&#xff0c;否则会导致严重问题 配置kubelet使用cri-docker 解除节点保护 升级wor…

传统企业如何利用软文营销突破重围

数字经济的发展让企业有了更多发展的可能&#xff0c;通过线下线上齐发展能够助力企业推广品牌&#xff0c;获得不错的销量。传统的线下门店销售在数字化时代下还是有一定的局限性&#xff0c;转型只是时间问题&#xff0c;然而有些企业在面对网络营销的时候却束手无策&#xf…

11.15 知识总结(模板层、模型层)

一、 模板层 1.1 过滤器 1.什么是过滤器&#xff1f; 过滤器类似于python的内置函数&#xff0c;用来把变量值加以修饰后再显示。 2. 语法 1、 {{ 变量名|过滤器名 }} 2、链式调用&#xff1a;上一个过滤器的结果继续被下一个过滤器处理 {{ 变量名|过滤器1|过滤器2 }} 3、有的过…

windows 安装 Oracle Database 19c

目录 什么是 Oracle 数据库 下载 Oracle 数据库 解压文件 运行安装程序 测试连接 什么是 Oracle 数据库 Oracle数据库是由美国Oracle Corporation&#xff08;甲骨文公司&#xff09;开发和提供的一种关系型数据库管理系统&#xff0c;它是一种强大的关系型数据库管理系统…

kubernetes资源管理

资源管理 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;所谓的部署服务&#xff0c;其实就是在kubernetes集…