性能测试相关理解---性能测试流程(二)
六、性能测试流程(如何做性能测试?)
根据学习全栈测试博主的课程做的笔记
1、前期准备–
项目初期就开始,业务需求评审时尽量参与,对业务更深刻的认识(确定哪些是核心业务、哪些可能存在并发请求、确定什么地方会出现瓶颈,方便后续性能需求评审时给出建设性建议)
2、性能需求分析、评审(确定性能测试的范围、性能测试的目标是多少)
2.1、确定范围:哪些业务接口
使用多的、核心业务功能
2.2、目标:tps、rt、成功率、资源利用率等
2.3、补充
2.3.1关于需求来源(项目组一起定性能目标)
2.3.1.1迭代项目
1)范围
新增、修改、受影响的功能也是需要放在压测范围内
2)目标
不能低于之前版本的性能
还需要进行容量评估,根据历史数据的请求数据进行统计月增长率是多少
比如现在要做一个容量预估:可以根据增长率(业务、用户增长的情况)预估tps达到多少未来才能满足业务需求,就可以做容量预估
3)业务比例:类似ELK的日志平台来统计
从生产上统计接口的业务比例(其实就是单接口的比例)
这只是统计出接口的比例,但是需要转换成业务比例,评审时就需要将业务比例获取到,最后在jmeter设计场景时要用到。
2.3.2新项目
1)范围:核心业务功能
2)目标值:参考竞品、经验值(产品经理)
若是迭代项目可以和之前的版本性能做对比,也可以通过生产环境的统计日志获得容量tps,新项目就是参考竞品和产品经理的经验。
3)补充:①业务比例(项目组谈论、项目运行后统计)②要测出最大容量Tps,为上线后限流提供参考
迭代项目的业务比例是可以通过类似ELK日志平台拉取数据,看一下压测时间范围内各个接口请求的压测业务比例历史数据统计,新项目没有历史数据,怎么解决?
这种新项目的业务比例只能是项目组进行讨论(不好定的情况,最简单的就是1:1或者就是项目试运行后数据统计比例,少量用户和大量用户使用的tps有差异,业务比例的1偏差不是太大。
对于新项目,一定需要测出最大容量tps,为上线后限流进行提供参考。
3、制定性能测试方案(为后续工作进行指导)
方案很重要(设计相关的、数据的设计、场景的设计、监控的设计等)
3.1、项目背景
描述项目做什么、核心业务什么、出现什么问题,系统架构(用到什么技术栈)
1)背景描述
2)系统架构
了解系统架构、用到什么技术栈、接口的的数据流向、经过了哪些技术栈,才能为后续设计监控提供参考(才知道去监控哪些服务)
3)压测目的
解决当前什么性能问题、还需要测试出系统的最大容量tps(为上线后续的保证服务不挂、限流等)
3.2、术语说明(主要为了避免理解偏差)
1)tps
2)rt
3)并发
4)业务比例
5)单场景
6)容量场景(混合场景)
7)稳定性场景
3.3、测试范围、目标
1)要压测的接口清单以及业务比例
2)各个场景的目标:tps、rt、成功率等
3.4、测试资源
1)人力资源(组织架构)
项目经理(协调压测需要的资源)
性能测试工程师(编写性能测试方案、性能测试脚本、设计压测场景、执行压测、收集监控数据、编写测试报告等)
开发工程师(开发需要配合性能测试进行打对应的压测分支、做性能分析、做性能优化)
运维工程师(配合性能测试部署压测测试环境、协助性能部署测试监控)
2)压测工具(主要是压力端的工具)
jmeter还是loadrunner
压力机(window、linux)
如果对性能要求不高,用window压力机即可,一般用的是linux
3)压测环境:
硬件、软件、部署描述清楚
3.5、压测设计(最重要)
1)数据设计
①参数化数据—数据量–根据业务来
唯一性:tps500,压测时间600s,至少需要30000数据量乘以20%,
非唯一性:tps500,也是时间600s,至少覆盖线上时间被使用到的
如:注册要用不同的用户名,系统要求用户名是唯一,就需要准备不同用户名。
模拟不同的真实用户,发送请求。
参数化数据设计多少?得根据业务来,对数据有唯一性。
若要求tps=500,压测时间10分钟,600s,至少需要30000数据量,但是压力端在发送请求时,不是轮流发请求,假设起了200个线程,jmeter线程关系之间也是有竞争关系,也是要去争夺cpu的执行权限。如果获得cpu的执行权限,就将请求发送出去,可能有的线程获得cpu执行权限多一点,发的请求数也会多,jmeter数据量把,一部分数据分成线程1,线程2,线程3,获得cpu的执行权限不一样,为了避免发的请求更多数据量不够,再算出的数据量再乘以20%或者更多
对数据若没有唯一性。如查询商品,a\bc都可以查询到电脑,商品表有10万个商品,数据量应该设置多少?假设tps=500,压测时间10分钟,600s,至少需要30000数据量,商品表里有10万数据,可以直接用,也可以直接统计线上某一段时间内哪些商品被搜索,再进行参数化,需要与线上覆盖到(实际被使用到的数据)
参数化唯一性数据需要自己造
非唯一性数据在库里存在,若想所有数据都需要参数化数据导出,若想拿某一些热点数据进行参数化,就需要统计线上日志。
②数据库存量
数据库里各个表都存有数据,测时的数据库量级与生产一致,方便复现线上回归压测复现问题,变量太多,尽量保持与生产一致(数据量级、环境差异、软硬配置)
数据库的表和生产量的数据库表的尽量保持一致
2)场景设计(单场景、容量场景、稳定性场景等)
①单场景
单个业务接口进行压测
生产环境有很多的业务功能,一般说系统的tps都是混合容量的tps,为什么还需要对单场景进行压测?单个接口,链路简单,可以发现明显的性能Bug,可以为后续混合场景tps参考(代码逻辑性能Bug、软件配置bug如数据库连接配置,应用代码线程池里的配置)
②容量场景(混合场景)
容量场景一定需要集合业务比例模拟线上真实业务场景,在性能需求评审时不仅要给到目标tps,还需要给到业务比例,因为线上环境,每个接口调用次数不一样。
涉及到有用户登录、查询商品、添加购物差、创建订单接口:若对这些业务做单场景测试,这四个接口就属于压测范围。
单场景就是针对每一个业务(单独的接口)去进行单独指定目标、设计到加压方式、表的数据量,脚本涉及到关键点,以及重点关注相关指标
根据图中的单场景的目标tps是300、500、500、200,一般性能测试中给出的tps都是混合容量的tps。
混合容量tps=800,接口业务占比,可以根据业务比例算出在混合容量场景各个接口的tps。创建订单 业务比例10%,总的tps是800,则创建订单接口的tps为800*10%=80
其他接口也是同样算法:根据混合容量总的tps算出各接口在混合容量场景下的tps
单场景若没有指定目标tps,接口的目标tps至少是需要比混合容量场景中各接口的tps高(有的项目组会告诉单场景的tps,有的项目组则不会告诉单场景的tps,不指定的话根据总混合容量场景tps和业务比例是可以进行算出每个单接口的tps需要达到多少)
图中的业务比例是日志平台统计业务峰值容量tps,分解出来各个接口的比例,在jmeter中设置的时候还需要进行转换(吞吐量控制器)
业务占比用户登录15%,查询商品40%,添加购物车35%,创建订单10%,根据日志平台线上系统进行统计(有并发请求的业务的一个量,后面再根据jmeter的吞吐量控制器进行业务比例转换)
③稳定性场景(防止系统在高峰值时挂)
压测时需要设置一个持续时间,jmter中,循环次数勾选永远,会设置一个持续时间
稳定性压测时间设置多少合理?jmeter中,tps=总请求数/并发时间
并发时间=总请求数/tps
5000万/800=62500s–建议,时间乘以120%
50000万/1000=50000s,建议:时间乘以120%(防止跑到后面后,性能下降后,没有达到5000万的业务量)
稳定性场景的tps用的是混合容量场景测试出来的最大tps1000,用更大的tps跑出更少的时间。
④加压方式
秒杀、抢购----瞬间产生压力
非秒杀、抢购-----逐步阶梯加压
3)监控设计
根据压测接口的链路涉及的技术栈、选择合适的监控工具
比如:链路监控工具是微服务的标配(服务很多,排查问题难)
java项目:通过链路监控工具,进行时间拆分,发现是应用耗时多(对应用接口的调用的方法,通过arthas之类工具看哪个是方法耗时多或者可能是jg在耗时,通过jdk自带的相关命令进行查看,jstack)
系统架构、数据流向、技术栈需要清楚
3.6、测试计划
流程的一个里程碑计划、产出物什么、时间节点、负责人是谁?
3.7、风险评估
根据当前情况罗列出可能的风险(如涉及到外围系统,外围系统也属于外围风险、人力资源缺少、环境差异)
3.8、参考资料
4 、性能测试方案评审
写好后项目组进行评审、性能测试计划、性能测试场景怎么设计的.
根据评审会议的建议进行修改
评审会议通过后需要发送给各项目组的成员
5、申请性能测试环境
简单架构(nginx+2 tomcat +mysql),nginx做反向代理,tomcat容器有两个+mysql,看哪一个服务是影响大的,资源不足的话,对对应的服务等比例缩放进行两次压测,看损耗率。
初步判断,瓶颈在应用层,第一次是一个tomcat,tps是100,两个tomcat的tps是180,此处有20的tps的损耗。换算成损耗率,生产是3个tomcat,预估可以达到多少tps,现在简单架构较少,一般都是复杂架构,复杂架构链路长,涉及的服务多,每一个服务的影响因子性能大小不一样,很难换算。建议项目组进行评估,做好线上的保护,如限流。
大公司一般压测环境不足,一般是直接线上全链路,充分利用线上的资源。
补充:新项目可以直接在线上环境压测
6、性能测试用例编写及评审
性能测试用例设计:一般是对性能测试场景进行设计
对单场景、混合容量场景、长时间稳定性的设计,重点就是各场景里的数值
单场景(目标tps、加压方式、数据量、脚本设计等)混合容量场景(业务比例、目标tps等)
长时间稳定性(总的压测时间、总的目标业务量等)
7、搭建测试环境
参考测试资源压测环境的部署
除了部署应用,还需要部署监控
8 、准备测试脚本、测试数据
8.1、脚本
推荐:开发提供压测环境调通的postman或者jmeter脚本
或者根据接口文档写(swagger)
8.2、场景设计
8.3、准备数据
1)参数化数据
方式,代码生成,从数据库导出
2)数据库存量数据
方式:
复杂表,jmeter跑业务接口
单表:代码,存储过程
9、环境确认测试
9.1、静态测试
确认环境配置(软件、硬件),尽量和生产保持一致
软件(jdbc的配置、线程池的配置等是否和生产保持一致)
9.2、非静态测试
确认环境是否可用(压测的接口是否通、发送请求是否有响应响应结果是否正确等)
10、执行压测并监控
先单场景测试发现明显的性能bug,为容量场景做准备
混合容量场景:模拟真实线上的真实场景
再执行稳定性场景
执行压测监控时,不要一次性打开所有监控,监控也是需要耗费监控资源。先通过jmeter非gui模式下持续阶梯加压跑一下,看一下结果,如不达标后,若是微服务(用skywalking)是哪一个节点耗时多,就着重监控不达标的节点(如果是mysql服务,则将mysql的服务打开),通过mysql监控看是什么问题,若有慢sql,后续就需要出现问题的接口执行的sql,拿出来用explain单独分析sql执行情况
每一步需要哪个监控就开哪个监控
11、分析定位
11.1方法
1)简单架构
查看资源消耗,通过监控发现应用服务器的CPU高,java项目可以进行打栈,看一下线程在做什么,下一步就是代码逻辑。
2)复杂架构
通过分解时间方式(微服务skywalking)
举例:
场景比对:加节点怀疑是服务资源不足,可以进行加节点,
性能提升后就是服务资源不足导致的,服务为什么消耗资源,代码逻辑是否合理。
隔离:这个功能会调另一个功能,先将一个功能去掉后再进行压测。
12、性能优化
13、性能回归
14、编写性能测试报告
14.1、测试过程详情以及对应的分析
14.2、测试问题总结及建议
14.3、问题汇总
14.4、风险评估
14.5、优化清单
相关文章:

性能测试相关理解---性能测试流程(二)
六、性能测试流程(如何做性能测试?) 根据学习全栈测试博主的课程做的笔记 1、前期准备– 项目初期就开始,业务需求评审时尽量参与,对业务更深刻的认识(确定哪些是核心业务、哪些可能存在并发请求、确定什么地方会出现瓶颈,方便后…...

GD32 MCU ADC采样率如何计算?
大家在使用ADC采样的时候是否计算过ADC的采样率,这个问题非常关键! 以下为GD32F303系列MCU中有关ADC的参数,其中ADC时钟最大值为40MHz,12位分辨率下最大采样率为2.86MSPS.如果ADC时钟超频的话,可能会造成ADC采样异常&…...

.mkp勒索病毒:深度解析与防范
引言: 在数字化时代,网络安全问题日益严峻,其中勒索病毒作为一种极具破坏性的恶意软件,严重威胁着个人用户和企业机构的数据安全。在众多勒索病毒家族中,.mkp勒索病毒以其强大的加密能力和广泛的传播方式,成…...

5.opencv深浅拷贝
图像处理的复制操作 深浅拷贝 图像复制分成两种,第一种假复制,从原图片选择一部分图片拿出来观察,此时新生成的图片和原图实际上是同一张图片,即浅拷贝 将图片的一部分复制下来,放到新的内存中,即两张完全…...

C++11中新特性介绍-之(二)
11.自动类型推导 (1) auto类型自动推导 auto自动推导变量的类型 auto并不代表某个实际的类型,只是一个类型声明的占位符 auto并不是万能的在任意场景下都能推导,使用auto声明的变量必须进行初始化,以让编译器推导出它的实际类型,…...

STM32实现看门狗(HAL库)
文章目录 一. 看门狗1. 独立看门狗(IWDG)1.1 原理1.2 相关配置1.3 相关函数 2. 窗口看门狗(WWDG)2.1 原理2.2 相关配置2.3 相关函数 一. 看门狗 单片机在日常工作中常常会因为用户配置代码出现BUG,而导致芯片无法正常工…...

【漏洞复现】网络摄像头——弱口令
声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现其他补充 漏洞描述 主流网络摄像头存在弱口令。 漏洞复现 JAWS 1)信息…...
视觉图像面积计算
在图像处理和计算机视觉中,计算对象面积的常见方法有两种:使用四邻域标记算法和使用轮廓计算。每种方法在不同情况下有各自的优缺点。 四邻域标记算法: 优点: 简单易实现。能够处理带有孔洞的复杂区域(只要孔洞不影响连…...
Vue笔记10-其它Composition API
shallowReactive与shallowRef shallow:浅的,和deep相反 shallowReactive:只处理对象最外层属性的响应式 shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理 如果有一个对象数据,结构比较深&a…...

AI集成工具平台一站式体验,零门槛使用国内外主流大模型
目录 0 写在前面1 AI艺术大师1.1 绘画制图1.2 智能作曲 2 AI科研助理2.1 学术搜索2.2 自动代码 3 AI智能对话3.1 聊天机器人3.2 模型竞技场 4 特别福利 0 写在前面 人工智能大模型浪潮滚滚,正推动着千行百业的数智化进程。随着技术演进,2024年被视为是大…...
北京交通大学学报
《北京交通大学学报》是经新闻出版广电总局批准,由教育部主管,北京交通大学主办的自然科学理论与技术类学术期刊。学报致力于全面反映交通运输和信息与通信领域相关学科的最新研究进展。主要刊登交通运输工程、系统科学、信息与通信工程、控制科学与工程…...
【LinuxC语言】手撕Http之处理POST请求
文章目录 前言声明POST的组成读取POST信息读取消息体长度读取消息体解析消息体How to use?总结前言 在互联网的世界中,HTTP协议无疑是最重要的协议之一。它是Web的基础,支持着我们日常生活中的大部分在线活动。尽管有许多现成的库可以处理HTTP请求,但了解其底层工作原理是…...

以软件定义推动智算中心建设
2024 年 6 月 27 日,由益企研究院和 CDCC 主办、OCTC 开放计算委员会协办、隆高展览承办的"2024 中国智算中心全栈技术大会、第 5 届中国数据中心绿色能源大会暨第 10 届中国(上海)国际数据中心产业展览会”在上海圆满结束。本次大会以&…...

Apache Seata分布式事务原理解析探秘
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 前言 fescar发布已有时日,分布式事务一直是业界备受关注的领域,fesca…...
MySQL-18-mysql source 执行 sql 文件时中文乱码
拓展阅读 MySQL 00 View MySQL 01 Ruler mysql 日常开发规范 MySQL 02 truncate table 与 delete 清空表的区别和坑 MySQL 03 Expression 1 of ORDER BY clause is not in SELECT list,references column MySQL 04 EMOJI 表情与 UTF8MB4 的故事 MySQL 05 MySQL入门教程&a…...

flutter环境安装(Mac+vscode)
以前据说flutter跨平台开发app很牛逼,最近突然想到这个东西,于是想体验一下flutter的开发流程,看看能否适合做独立开发。 我用的是mac,手机也是ios,就开始着手部署mac下的开发环境了。 开发后台的时候,一…...

【题解】—— LeetCode一周小结27
🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结26 2024.7 1.最大化一张图中的路径价值 题目链接:…...
C++后端开发--网络编程基础
目录 一、网络编程基础概念 1.1 网络协议 1.2 IP地址和端口号 1.3 Socket 1.4 TCP协议的三次握手和四次挥手 TCP的三次握手 TCP的四次挥手 整个流程更通俗易懂 TCP 三次握手流程图 TCP 四次挥手流程图 1.5 详细介绍一下http协议 HTTP协议的主要特点 HTTP请求 HTT…...
如何将资源前端通过 Docker 部署到远程服务器
作为一个程序员,在开发过程中,经常会遇到项目部署的问题,在现在本就不稳定的大环境下,前端开发也需要掌握部署技能,来提高自己的生存力,今天就详细说一下如何把一个前端资源放到远程服务器上面通过docker部…...

@react-google-maps/api实现谷歌地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度
1.第一步要加入项目package.json中或者直接yarn install它都可以 "react-google-maps/api": "^2.19.3",2.加入项目中 import AMapLoader from amap/amap-jsapi-loader;import React, { PureComponent } from react; import { GoogleMap, LoadScript, Mar…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...