性能测试中的场景设计和测试执行

假设一个内部系统要求响应时间在 3s 以内,支持最大用户数为4万。根据二八原则,80%用户在20%时间使用系统(4w80%)/(24h20%)≈1.9点击/秒。并发数=TPS(运行时间+思考时间)=1.9(3+0.5+0.3+3+0.5+0.3+0.5+3)=21。

注意:二八原则计算的结果并非是并发数,而是系统要达到的处理能力(吞吐量),初学者容易被误导,拿着这个数据就去设置并发数,这是错误的哦。如果你的系统性能要求更高,也可以选择一九原则或更严格的算法,二八原则比较通用,一般系统性能比较接近这个算法而已,大家应该活用。

基于以上,如果我们通过测试得到的最大吞吐量大于计算出来的吞吐量(TPS≈1.9),且各项性能指标均达标,那么系统就是安全的。如果用户发帖遵循正态分布,那么并发请求数峰值还肯定会大于上述估算的吞吐量(并发数大于吞吐量)

01场景设计

场景编号:001 - 基准测试

目的:验证测试环境、验证脚本,得到系统的性能基准,为后续测试提供参考。

场景编号:002 - 配置测试

目的:优化配置,测试当前软、硬件配置是否能够满足性能指标。

场景编号:003 - 负载测试

目的:分析性能变化趋势,找出性能瓶颈与风险,对系统进行定容定量。

场景编号:004 - 稳定性测试

目的:长时间(>8小时)运行大量负载,确定系统软硬件环境是否运行稳定。

02场景实现

1、单线程组实现测试场景

假设业务比例为 “查看详情(8):登录(6):新建任务(4):(配置任务)2:(删除任务)1”。差不多每3个登录会有4个查看任务,新建2个任务,配置1个任务;每6个登录,删除1个任务。

我们使用 If逻辑控制器 + ${__counter(arg1, arg2)}函数来实现。

  • 新建任务的If控制器条件:登录(3)/新建(2)
    ${__counter(true,i)}%2==1||${__counter(true,i)}%3==0
  • 配置任务的If控制器条件:登录(3)/配置(1)
    ${__counter(true,i)}%3==0
  • 删除任务的If控制器条件:登录(6)/删除(1)
    ${__counter(true,i)}%6==0
  • 查看任务:因为配置和删除操作包含查看的业务,所以单独的登录/查看比为6:(8-2-1),即6:5。
    ${__counter(true,i)}%5!=0||${__counter(true,i)}%6==0

2、多线程组实现测试场景

多线程组的场景设计需要注意的是业务关联关系。比如查看任务可以不需要登录的;新建、配置、删除任务都需要登录且并发数的和大于登录,说明有些场景是登录后执行了多业务的;查看详情的并发数小于登录,所以有部分用户可能是登陆后只查看了详情。

按照 “查看详情(8):登录(6):新建任务(4):(配置任务)2:(删除任务)1” 的比例,以及用户实际使用场景来算,得到如下场景:

  • 登录(2)-新建任务(2)
  • 登录(2)-新建任务(2)-配置任务(2)-查看详情(2)
  • 登录(1)-查看详情(1)-删除任务(1)
  • 登录(1)-查看详情(1)
  • 查看详情(4)

两种脚本实现方式的对比:

03测试执行

场景编号:001 - 基准测试

基准测试采用单用户、单业务场景的执行方式。测试时间尽可能长,尽量执行多次(通常建议3次以上),取相对稳定的结果,目的是统计响应时间的取样更多,测试结果越准确。对于发现的异常,如果不熟悉就请开发团队告诉你有哪些作业任务,这些作业任务的频度是否适中。

基准测试_聚合报告

基准测试_ResponseTime

基准测试_TPS

结论:

满足性能需求3s以内,事务正确率100%,且CPU、内存、磁盘表现正常(局域网不考虑网络影响)。测试环境检查通过,脚本检查通过,可以考虑对系统进一步的测试。

场景编号:002 - 配置测试

先确定配置测试的目标:

  • JVM配置
  • Tomcat线程池配置
  • 数据库连接池配置
  • 数据库的一些配置

配置测试场景一般为混合场景(多个业务同时执行)

  • JVM Heap大小及不同代的大小指定?Heap回收算法的选择?(P316)
  • Tomcat线程数配置?
  • 数据库缓存、临时表空间,大表水平切分,主从结构、读写分离、主从备份、主主备份等?

配置测试_聚合报告

配置测试_ResponseTime

配置测试_TPS

结论:

随着并发数的增加,响应时间也逐渐增加,但仍然满足3s以内的性能指标;事务正确率100%;查看详情、登录、新建任务、配置任务、删除任务各业务之比接近6:8:4:2:1;TPS未出现明显拐点;CPU、内存、磁盘均正常。性能表现能够满足需求,系统性能瓶颈风险在CPU。

场景编号:003 - 负载测试

负载测试在满足系统性能指标的基础上进行测试,寻找性能的拐点。负载测试分为单场景与混合场景。

  • 单场景有利于分析性能问题,因为排除了其他业务干扰;
  • 混合场景更贴近用户实际使用习惯,是一个综合的性能评估。

建议先做单场景测试,再做混合场景测试

我们一般采用二分法,如总的线程数递增为21/42/84,当发现线程增大后性能降低,再对该区间进行二分尝试,最后对拐点附近精细尝试得到最大吞吐量

负载测试_聚合报告

负载测试_ResponseTime

负载测试_TPS

负载测试_CPU

结论:

执行过程中,CPU首先出现性能瓶颈,利用率接近100%。响应时间开始大于3s,TPS降低,出现失败的事务。此时的内存、磁盘、网络均表现正常。此时应优先解决CPU的瓶颈问题,再反复进行负载测试,直到在没有硬件瓶颈的条件下找到系统的性能拐点。

场景编号:004 - 稳定性测试

稳定性测试在正常性能阀值下尽量加大负载。什么是阀值呢?

比如响应时间要求3s以内,3秒就是阀值;比如CPU利用率70%以下,70%就是阀值。假设满足性能要求的负载是B,那么稳定性测试时负载一般是1.5B~2B。

在此案例中我们满足性能需求的并发量是21,那么在做稳定性测试时,并发量应该是1.521~221即32~42之间。运行时间原则上越长越好,惯例要求不低于8小时。有些隐藏较深的诸如内存溢出的问题是需要长时间运行才能反映出来的。如果各项性能指标都在阀值内,且性能表现平稳,则可以认为通过稳定性测试。

除了分析响应时间、TPS和服务器硬件性能外,我们也要关注JVM内存回收情况,MySQL有无慢查询等。

原文链接:百度安全验证

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习之Clickhouse

Clickhouse-23.2.1.2537 学习 一、Clickhouse概述 clickhouse 官网网址:https://clickhouse.com/ ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 OLTP(联机事务处理系统)例如mysql等关系型数据库,在对于存储小数据量的时候&#xff…

【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法(WOA)原理及实现【附完整Matlab代码】 2.改进点 非线性收敛因子 WOA 主要通过控制系数向量 A 来决定鲸鱼是搜索猎物还是捕获猎物,即系数向量 A 可…

C语言部分复习笔记

1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高,p先和 [] 结合说明p是一个数组,p先和*结合说明p是一个指针 括号保证p先和*结合,说明p是一个指针变量,然后指…

适用于高海拔地区的工业路由器产品

1、西藏背景 西藏,这个位于中国西南部的神秘之地,以其雄伟壮观、神奇瑰丽的自然风光和深厚的文化底蕴,被无数人视为心中的圣地。这里属于高原性气候,具有气温低、气压低,降水少,生态环境十分恶劣。西藏被誉…

Coze搭建《测测你的本命宠物》

前言 本文讲解如何从零开始,使用扣子平台去搭建《测测你的本命宠物》 《测测你的本命宠物》:测测你的本命宠物 - 扣子 AI Bot (coze.cn) 欢迎大家去体验一下!!! 正文 接下来我们开始讲解制作这个bot的流程吧&#…

【后端面试题】【中间件】【NoSQL】MongoDB的优点和分片机制

为什么要用MongoDB 两个关键:灵活性和横向扩展能力 MongoDB是灵活的文档模型,也就是说,如果预计我的数据可以被一个稳定的模型来描述,会倾向于使用MySQL等关系型数据库。而一旦我认为我的数据模型会经常变动,比如我很…

Jenkins接口自动化项目的工程创建

jenkins的下载安装 jenkins下载的官网地址 https://www.jenkins.io/download/ java环境变量的配置下载 jenkins是用java语言编写的所以要配置java环境 需要安装java的JDK 推荐安装JDK17(https://blog.csdn.net/wochunyang/article/details/138520209) JDK17的下载地址 ht…

CS144 Lab3 TCPSender复盘

一.基础概念 1.TCPSender在TCPSocket中的地位与作用 Lab0中实现了基于内存模拟的流控制-字节流(ByteStream),底层使用std::deque实现,根据最大容量Capacity进行容量控制。个人理解它相当于应用层的输入输出缓存区,用户…

什么是电航空插头插座连接器有什么作用

航空插头概述 定义与功能 航空插头,又称航空连接器,是一种专门用于航空领域的电连接器,因其最初在航空领域得到广泛应用而得名。航空插头的主要功能是实现电源或信号的连接,尤其适用于芯数较多、结构复杂的线束连接,…

QT在VS环境中使用,控件显示中文乱码解决方法

首先来看乱码显示的效果如下: 上图左侧显示内容为中文,控件对应代码如下: QLabel* UserNameLabel new QLabel(QString("用户名:")); QLabel* NameLabel new QLabel(tr("姓名:"));下面我们对QL…

实现高效全自动印刷:直线模组的智能化应用

目前,直线模组被广泛应用于移载、定位、喷涂、夹取、搬运、点胶、涂胶、封胶、移载、装配、检测测量、切割、上下料、钻孔、焊接、等自动化行业中,尤其是自动印刷行业,跟直线模组也是息息相关的。那么,如何利用直线模组实现全自动…

C++进阶 | [4.3] 红黑树

摘要:什么是红黑树,模拟实现红黑树 红黑树 ,是一种 二叉搜索树 ,但 在每个结点上增加一个存储位表示结点的颜色,可以是 Red 或 Black 。 通过对 任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树…

Web端登录页和注册页源码

前言&#xff1a;登录页面是前端开发中最常见的页面&#xff0c;下面是登录页面效果图和源代码&#xff0c;CV大法直接拿走。 1、登录页面 源代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登录</ti…

超详细的 C++中的封装继承和多态的知识总结<2.多态>

引言 小伙伴们我们都知道了&#xff0c;什么是封装和继承&#xff0c;在有了这个的基础上我们接着来看什么是多态。多态从字面上意思我们就可以知道&#xff0c;大概就是一个函数的不同形态&#xff0c;而且&#xff0c;前边我们在学习函数重载的时候我们已经简单的了解了如何用…

企业源代码加密软件丨透明加密技术是什么

在一个繁忙的软件开发公司中&#xff0c;两位员工小李和小张正在讨论源代码安全的问题。 “小张&#xff0c;你有没有想过我们的源代码如果被泄露了怎么办&#xff1f;”小李担忧地问。 “是啊&#xff0c;这是个大问题。源代码是我们的核心竞争力&#xff0c;一旦泄露&#…

最短路算法三

图论三 20240624 算法实用主义&#xff0c;用到再学 1. 大纲&#xff1a; a. 最小生成树都是无向图 难在建图&#xff0c;不考原理&#xff0c;重点记思路&#xff08;是骨头&#xff09;&#xff0c;自己复述一遍&#xff0c;不能死记代码 血肉 类似最短路 prim&#xff08;…

web基础以及http协议

web基础介绍 web&#xff1a;就是我们所说的网页&#xff0c;打开网站展示的页面。&#xff08;全球广域网&#xff0c;万维网&#xff09; world wide web &#xff08;www&#xff09; 分布式图形信息系统 分布式&#xff1a;计算机系统或者是应用程序分布在多台独立的计算…

探索智慧校园人事系统,了解人事合同功能的核心优势

智慧校园人事系统中的人事合同管理功能&#xff0c;是一个高度集成且自动化的模块&#xff0c;专注于优化合同的全生命周期管理&#xff0c;从合同创建、审批、签署到存档及续签提醒&#xff0c;旨在提升人事管理工作的规范性与效率&#xff0c;同时保障学校的法律合规性。 在智…

微信小程序-插槽slot

一.插槽slot 在页面使用自定义组件的时候&#xff0c;如果在自定义组件里面写子组件&#xff0c;子组件的内容无法显示。 <custom01> <text slotslot-top>你好&#xff0c;上方组件</text> 你好&#xff0c;组件 <text slotslot-bottom>你好&#xf…

数据结构 - C/C++ - 栈

目录 结构特性 结构实现 结构容器 结构设计 顺序栈 链式栈 结构特性 栈(stack)是线性表的一种形式&#xff0c;限定仅在表的一端进行插入或者删除的操作。 栈顶 - 表中允许插入、删除的一端称为栈顶(top)&#xff0c;栈顶位置是可以发生变化的。 插入 - 进栈、入栈、压栈…