一:项目的介绍和部署

1.1:轻商城项目介绍

项目背景

轻商城项目是一个现在流行的电商项目,我们需要综合评估该项目中各个关键接口的性能,并给出优化建 议,以满足项目上线后的性能需要。

1.2:项目功能架构

前台商城:购物车,订单,支付,优惠券等

后台管理系统:商品管理,会员管理,商场管理,推广管理等

1.3:项目技术架构

1.4:熟悉数据库设计

作用

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; #如果锁死,先手动杀死死锁的连接