一:项目的介绍和部署
1.1:轻商城项目介绍
项目背景
轻商城项目是一个现在流行的电商项目,我们需要综合评估该项目中各个关键接口的性能,并给出优化建 议,以满足项目上线后的性能需要。
1.2:项目功能架构
前台商城:购物车,订单,支付,优惠券等
后台管理系统:商品管理,会员管理,商场管理,推广管理等
1.3:项目技术架构
作用
1:熟悉数据库设计结构,便于后期对数据库的性能监控,方便定位问题
2:构造性能测试数据
二:性能测试需求分析
2.1:获取需求
客户方给出(传统行业);根据运营数据来计算(互联网行业);根据竞品分析(新上线的无历史数据)
2.2:提取性能测试点
2.3:确定性能测试目标
三:性能测试计划及方案
四:性能测试用例设计
根据测试点逐条进行细化
性能测试的数据,有明确的要求,需要达到一定的业务量
从接口维度上描述测试步骤
如果接口有关联,放在一个测试用例中
五:性能测试执行
5.1:编写测试脚本
常用测试元件
1:取样器--http请求
2:配置元件-用户定义变量
3:配置元件--http请求默认值
4:后置处理器--json提取器
5:断言--响应断言/json断言
6:监听器--聚合报告/察看结果树
jmeter脚本的基本结构
按照用例去编写脚本信息
5.2:建立测试环境
如何搭建性能测试环境
性能测试环境的特点:
独占性 尽量保持性能测试环境与真实生产环境一致性
硬件环境
包括服务器环境,网络环境等
软件环境
版本一致:包括操作系统,数据库,被测应用程序,第三方软件等
配置一致:包括操作系统,数据库,被测应用程序,第三方软件等
使用场景一致性
基础业务数据的一致
业务操作模式的一致性:尽量模拟真实场景下用户的使用情况
如何构造性能测试数据
目的:压测环境中的数据量尽量与生产环境中数据量一致
方法:为了快速创建大量数据,可以直接操作数据库进行添加
准备插入数据的sql语句
循环执行sql语句来插入数据
导包>>连接数据库>>创建游标>>执行sql语句>>关闭游标>>关闭连接
import pymysql
conn =pymysql.Connect(host='www.litemall360.com',port=3306,user='root',passwd='123456'
,database='litemall',charset='utf8') #建立连接
cursor = conn.cursor() #创建游标
sql11 = "INSERT INTO `litemall`.`litemall_address`(`id`, `name`, `user_id`, `province`, `city`, `county`, `address_detail`, `area_code`, `postal_code`, `tel`, `is_default`, `add_time`, `update_time`, `deleted`) VALUES ({}, {}, {}, '北京市', '市辖区', '东城区', '123123', '110101', '', '13426388766', 0, '2022-09-14 18:20:06', '2022-09-14 18:20:06', 0);"
start_id=4
for i in range(3): start_id= start_id+i
cursor.execute(sql11.format(start_id,start_id,start_id))
conn.commit() #提交
cursor.close() #关闭游标
conn.close() #关闭连接
5.3:性能测试监控
系统指标:响应时间,吞吐量,错误率,并发数
资源指标:cpu,内存,磁盘,网络
5.4:执行测试脚本
登录
进入首页
收索商品
六:性能分析和调优
6.1:性能调优的步骤
1:确定问题:根据性能监控的数据和性能分析的结果,确定性能存在的问题
2:确定原因:确定了问题之后,对问题进行分析,找出问题产生的原因
3:给出解决的方案:确定调整目标和解决方案
4:验证问题:按照给出的解决方案,重新进行测试
5:分析调优结果:分析出问题的性能指标是否有提升,关注其他指标未下降
6.2:性能瓶颈分析
在实际的性能测试中,会遇到各种问题,比如tps压不上去,导致这种现象的原因很多,作为测试人 员应该配合开发人员进行分析尽快找出瓶颈的所在
服务器的资源,jvm--java程序运行的环境,数据库的资源,程序内部实现机制--开发人员编写的代码分 析,压测机
6.2.1:硬件服务器指标
cpu,内存,磁盘,主板,显卡,机箱,电源,散热器等
运行速度上:cpu>>内存>>磁盘
存储空间上 :磁盘>>内存>>cpu
cpu
测试关注点
内存
磁盘IO
磁盘IO瓶颈:影响性能是磁盘的读写速度(Input和Output),不是磁盘的大小
查看磁盘IO使用的命令:iostat -x l l
测试关注点
如果%util接近100%,说明磁盘长时间占用cpu在发送请求,说明磁盘传输速度不足,I/O系统已经满负荷,存在瓶颈
如果%iowait的值过高,说明磁盘io传输数据的任务很多,在等待,表示硬盘存在I/O瓶颈
网络
网络瓶颈:影响性能的是网络的传输速度,与网络的总带宽进行对比,接近总带宽,说明网络存在的瓶颈
查看网络使用的命令:sar -n DEV 1 2
测试关注
实际统计的发送速率(rxKB/s)和接收速率(txKB/s),与网络的总带宽进行对比,查看使用的百分比(如果无限接近100%,说明存在网络性能瓶颈)
补充:宽带和带宽
宽带:用户(业务)维度来描述网络速度的方式,比如:20M(兆)宽带,100M宽带,200M宽带
速率单位:b(bit)/s
带宽:数据在网络中传输的速率,比如下载东西(迅雷),在技术中都是用带宽来描述速率的
速率单位:B(byte)/s
区别:1B=8bit
实际情况:1000M的宽带---对应的带宽速率是1000/8=125M
6.2.2:数据库
数据库瓶颈--慢查询
慢查询的定义:指执行速度低于设置的阀值得sql语句
作用:帮助定位查询速度较慢得sql语句,方便更好得优化数据库系统的性能
show variables like 'slow_query%';
show variables like 'long_query_time';
慢查询开启并配置
set global slow_query_log='ON'; #开启慢查询日志
set global long_query_time=1; #设置慢查询时间标准,设置之后会在下次会话生效
数据库瓶颈--数据库连接池
为什么使用数据库连接池
数据库连接池定义:事先建立连接,负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,节省了sql语句执行前后连接的和关闭的时间
测试关注点
show VARIABLES like '%MAX_CONNECTIONS%'; #查看mysql最大连接数
show status like 'Threads_connected'; #查询当前数据库已建立连接数
执行脚本100个线程组查看建立的连接数的比例
数据库瓶颈--数据库死锁
当一个用户修改数据时,对该数据进行加锁操作,使其他用户不能进行修改
只有当第一个用户修改完成之后,其他用户才能修改
MySQL常见有两种锁:表锁,行锁
表锁:效率低,但是安全性高(不会出现死锁)
行锁:效率高,但是安全性低(会出现死锁)
死锁:是指两个或者两个以上的进程再执行过程中,因争夺资源而造成的一种相互等待的现象
SHOW OPEN TABLES where in_use>=1; #查看当前正在使用的表(可能是锁定的表)
show PROCESSLIST; #查看执行长时间的线程,找到对应的sql
kill process_id; #如果锁死,先手动杀死死锁的连接