1. 什么是性能?
定义:性能就是软件质量属性中的“效率”特性,包括时间特性和资源特性。时间特性表示系统处理用户请求的响应时间;资源特性表示系统运行过程中,系统资源的消耗情况,包括cup、内存、磁盘等。
2. 什么是性能测试?
定义:使用自动化工具,模拟不同的场景,对软件各项性能指标进行测试和评估过程。
3. 性能测试的作用是什么?
评估当前系统能力;寻找性能瓶颈,优化性能;评估软件是否能够满足未来的需求
4. 性能测试的流程有哪几个步骤?
性能测试需求分析
性能测试计划和方案
性能测试用例设计
性能测试执行:建立测试环境、编写测试脚本、配置性能监控指标、执行测试脚本
性能测试分析和调优
性能测试报告总结
5. 性能测试的指标
定义:指标是一组数据,该数据用来量化衡量某种操作的性能好坏。
常见指标:响应时间、并发数、吞吐量、错误率、资源利用率
响应时间:指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的结果,整个过程所耗费的时间;包括服务器处理时间+网络传输时间
并发数:单位时间内发送给服务器的请求数
吞吐量:单位时间内处理的客户端请求数量(直接体现软件系统的性能承载能力);TPS(Transactions Per Second),每秒事务数,控制服务器每秒处理的事务请求的数量;RPS(Request Per Second),每秒请求数,控制服务器每秒处理指定请求的数量。
错误率:系统在负载情况下,失败业务的概率,错误率=(失败业务数/总业务数)
资源使用率:系统各种资源的使用情况,一般用“资源的已使用量/总的资源可用量”,形成资源利用率的数据;资源指标通常情况下的要求:cpu不高于75%-80%、内存不高于80%、磁盘IO不高于90%、网络不高于80%
6. 如何获取性能需求指标?
一、当需求直接给出时,可以直接将其作为性能测试的指标依据
二、根据历史运营数据分析:1)提取进行性能测试的功能模块:业务维度提取,技术维度提取;2)获取各功能的实际业务量;3)性能指标计算:正常场景TPS=(请求数*0.8)/(运行时间*0.2)(28原则);峰值场景TPS=峰值请求数*系数/峰值时间
三、竞品分析,获取同类型软件的性能指标/历史运营数据
7. 负载测试
概念:测试系统所能够承受的最大负载量(压力)是否满足产品设计要求。
怎么做:1)逐步增加系统负载;2)满足系统的性能指标;3)测试系统所能够承受的最大负载量
8. 性能测试工具Jmeter与Loadrunner对比
相同点:都可以模拟大量用户;都能支持多协议;都有监控及分析报表功能
不同点:1)模拟用户量L比J多;2)分析报表:L精确到秒,J是分钟;3)IP欺骗:L支持IP欺骗,J不支持;4)L收费,J免费;5)软件大小:L大,J小;6)可扩展性:L不能扩展,J由扩展组件
9. Jmeter的元件与组件
元件:多个类似功能组件的容易(类似于类)
取样器:发送请求
逻辑控制器:控制语句的执行顺序
前置处理器:对请求参数进行预处理
后置处理器:对响应结果进行提取
断言:检查接口的返回结果是否与预期结果一致
定时器:设置等待
测试片段:封装一段代码,供其他脚本调用
配置元件:测试数据的初始化配置
监听器:查看Jmeter脚本的运行结果
组件:实现独立的某个功能(类似于方法)
10. Jmeter发送HTTP请求
HTTP请求取样器:
作用:想服务区发送http请求
位置:线程组--取样器--http请求
发送GET请求(请求参数在路径中):
取样器:请求URL:协议、服务器域名或者IP、端口、方法GET、路径、编码格式
请求参数:1)在路径还添加请求参数;2)在参数列表中添加请求参数
消息体管理器:请求头:请求头名称、值
发送POST请求(请求参数在消息体数据中):
取样器:请求URL:协议、服务器域名或IP、端口、方法POST、路径、编码格式
请求参数:1)在消息体数据中添加请求体(form/json);2)在参数列表中添加参数(form)
消息体管理器:请求头:请求头名称、值
11. 响应结果出现乱码
1)找到JMETER安装目录下的bin目录
2)找到jmeter.properties文件修改sampleresult.default.encoding=UTF-8
3)重启JMETER
12. JSON断言
作用:对HTTP请求的JSON格式的响应结果进行断言
位置:HTTP请求--断言--JSON断言
需填写参数:Assert JSON Path exists(填写:实际结果-json路径)
Additionally assert value 勾选
Expected Value 填写(期望结果)
13. 响应断言
作用:对HTTP请求的任意格式的响应结果进行断言
位置:HTTP请求--断言--响应断言
断言设置:测试字段(要检查的项,实际结果)
模式匹配规则(比较方式)
测试模式(预期结果)
14. 聚合报告-监控性能指标
聚合报告可以收集性能测试结束后,系统的各项性能指标。包括:响应时间、吞吐量、错误率
15. 第三方插件下载
首先要下载插件管理器:1)下载包管理工具jar包;2)将包管理工具jar包添加到Jmeter放入到lib\ext目录下;3)重启Jmeter
然后就可以安装第三方插件了:1)工具栏点击选项,选择Plugins Manager插件管理器;2)选择Available Plugins;3)选择所需插件下载
16. PerfMon组件监控资源指标
作用:用于监控服务端的性能资源指标的工具,包括cpu、内存、磁盘、网络等性能数据
原理:需要在服务器端安装监听服务程序,启动并收集资源指标,使用PerfMon总资源指标并展示
监控服务器资源指标步骤:
1)下载安装包ServerAgent,链接:http://github.com/undera/perfmon-agent;
2)上传到服务器上,并解压ServerAgent;
3)启动,如果是windows运行startAgent.bat,如果是linux运行startAgent.sh
【可选】指定端口运行:java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 4444 --tcp-port 4444
4)启动这个工具后,jmeter的插件jpgc-PerfMon Metrics Collector就可以收集服务端的资源使用率,并在jmeter中查看了
注:当出现以下情况,可能是你的ServerAgent没有启动
17. 线程组参数说明
作用:线程组就是控制Jmeter执行测试的一组用户,可以模拟多人操作
18. 性能测试环境搭建特点
1)独占性
2)尽量保证性能测试环境与真实生产环境的一致性:
硬件环境(找运维):包括服务器配置、网络环境等;当硬件环境不足时,需要进行数据的等比缩放
软件环境(找开发):版本一致性和配置一致性,包括操作系统、数据库、被测应用程序、第三方软件
使用场景的一致性(测试自己准备):基础业务数据的一致性;业务操作模式的一致性:尽量模拟真实场景下用户的使用情况
19. 构造性能测试数据
重要性:测试数据尽量与生产环境中数据量一致,才能更真实的模拟用户的实际业务场景
构造方式(python):导包pymysql--连接数据库--创建游标--执行SQL语句--关闭游标--关闭连接
import pymysql
connect = pymysql.Connect(host='localhost',port=3306,user='root',password='',database='tinyshop',charset='utf8')
cursor = connect.cursor()
sql = "INSERT INTO `tinyshop`.`tiny_user`(`id`, `name`, `password`, `email`, `head_pic`, `validcode`, `status`) VALUES ({}, '{}@qq.com', 'ab7bac8728f1346bcb834d825749d5ca', '{}@qq.com', NULL, ',dpMNE<~', 1);"
for i in range(1,100):
id = '100'+str(i)
name = 'demo'+id
email = 'demo'+id
cursor.execute(sql.format(id,name,email))
cursor.close()
connect.close()
20. 生成随机函数Random
为了模拟不同用户登录系统,需要将登录时的用户名参数化,每次使用不同的用户名登录。
21. Json提取器
作用:对Json格式的响应结果数据进行提取
参数说明:
Name of created variables:存放提取出的值的参数名称,后续引用时:${参数名}
Json Path expressions:Json路径的表达式,$.data.token
Match No:如果Json路径匹配出许多结果,则可以选择哪一个。0表示随机,-1表示所有结果,1表示第一个结果
22. 常数吞吐量定时器
作用:让Jmeter按指定的吞吐量执行,以每分钟为单位
参数介绍:目标吞吐量表示每个用户每分钟发送的请求数
23. 压力测试
在强负载下的测试,查看系统在峰值情况下是否具有功能隐患、系统是否具有良好的容错能力和可恢复能力。
压力测试就是负载测试的延续,在满足系统日常性能指标下,进一步增加负载,已验证峰值情况下的系统处理能力。
24. HTTP请求默认值
作用:高效维护http请求的IP/port信息,对http请求中的公共部分进行统一设置
位置:测试计划--配置元件--HTTP请求默认值
25. 计数器
作用:创建一个计数工具,可循环计数,并且生成的计数值在线程组内可以应用
26. 事务控制器
作用:将多接口串联的场景自动的分类,更易于分类识别整个场景的响应时间
任何添加:1)将所有HTTP请求添加到事务控制器的子节点下;2)勾选‘Generate parent sample’
27. 并发测试
在极短时间内,发送多个请求,来验证服务器对并发的处理能力
28. csv数据文件设置
作用:让不同用户在多次循环时,可以从数据文件中提取到不同的值
29. 同步定时器
作用:阻塞线程,当在规定的时间内到达一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大压力。
参数说明:
模拟用户的数量:表示同时释放的线程数的数量
超时时间:表示多少毫秒之后同时释放制定的线程数;设置为0时,该定时器将会等待线程数达到了设置的线程数才释放,若没达到会一直死等;设置大于0时,那么如果超过Timeout中设置的最大等待时间还没到达设置的线程数,则会不再等待,立即释放已有的线程数。
30. 稳定性测试
在服务器稳定运行(用户正常的业务负载下)的情况下,进行长时间测试,并最终保持服务器能满足线上业务需求。
用户正常的业务负载:1)用户进行的主要业务操作;2)每种业务操作的并发/负载量
31. HTML测试报告
作用:Jmeter支持生成HTML测试报告,以便从测试计划中获得图表和统计信息。
命令:jmeter -n -t [jmx file] -l [result file] -e -o [html report folder]
参数描述:-n:非GUI模式执行Jmeter;-t [jmx file]:测试计划保存路径及.jmx文件名;-l [result file]:保存生成测试结果的文件,jtl文件格式;-e:测试结束后,生成测试报告;-o [html report folder]:存放生成测试报告的路径
注:如果执行命令时,result file和 html report folder已存在,必须先删除。
32. 性能分析和调优
确定问题:测试人员确定是否存在性能问题
确定原因:开发人员对问题进行分析,找出问题产生的原因(服务器资源瓶颈、JVM瓶颈、数据库瓶颈、程序内部实现机制、压测机瓶颈)
给出解决方案:开发人员确定调整目标和解决方案(增加硬件资源配置、修改服务器参数配置、修改代码)
验证问题:测试人员按照给出的解决方案,重新进行回归测试
分析调优结果:开发和测试人员分析问题的性能指标是否有题提升,关注其他指标未下降
33. 服务器资源瓶颈
CPU瓶颈:每个程序运行都需要占用CPU,CPU使用率过高时运行速度会下降。CPU可以分为用户态、系统态和空闲态。用top命令查看
内存瓶颈:内存不足时,操作系统会使用虚拟内存,从虚拟内存读取数据,影响处理速度。用free命令查看内存使用率,用vmstat命令查看虚拟内存使用情况
磁盘I/O瓶颈:磁盘I/O繁忙,导致执行时在I/O出等待。使用iostat命令查看IO等待和IO队列的时间占比
网络瓶颈:网络传输速度对比总带宽占比较大时,就会造成网络传输时间长
34. 数据库瓶颈
慢查询:帮助定位查询速度较慢的SQL语句
查看慢查询参数:show variables like 'slow_query%'; 慢查询日志开启状态
slow_query_log_file:慢查询日志存放位置
long_query_time:慢查询时长设置
开启慢查询并配置:set global slow_query_log='ON'; 开启慢查询日志
set global slow_query_log_file='path'; 设置慢查询日志存放位置
set global long_query_time=1; 设置慢查询时间标准
数据库连接池:负责分配、管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接, 而不是新建一个,这样可以提高对数据库操作的性能
当客户请求数据库连接时的4种情况:1)首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;2)如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没有达到就重新创建一个连接给请求的客户;3)如果达到就按设定的最大等待时间进行等待;4)如果超出最大等待时间,则抛出异常
查看最大连接数:show variables like '%max_connections%';
查询已建立连接数:show status like 'Threads_connected';
数据库死锁:Mysql主要有两种锁:表级和行级。表级锁针对整张表进行加锁,行级锁针对表中的一行记录进行加锁。
死锁是指两个或两个以上的进行在执行过程中,因争夺资源而造成的一种相互等待的现象。若无外力作用,它们都将无法推进下去,此时称为系统处于死锁状态或系统产生了死锁,表级锁不会产生死锁。
初步确定死锁:show processlist;
手动杀死死锁:kill process_id;
35. JVM内存分析
定义:java虚拟机在执行Java程序的过程中所管理的不同的内存数据区域,可分为堆内存和非堆内存。非堆内存是保存虚拟机自己的静态数据,存放加载的Class类级别静态对象,如类、方法等;堆内存是存放new关键字创建的对象,所有对象实例以及数组都在堆上分配。
JVM堆内存管理机制(垃圾回收机制):1)年轻代存储“新生对象”,我们新创建的对象存储在年轻代中;2)当年轻内存占满后,会触发Minor GC,清理年轻代内存空间;3)老年代存储长期存活的对象和大对象,年轻代中存储的对象,经过多次GC后仍存活的对象会移动到老年代中存储;4)老年代空间占满后,会触发Full GC,Full GC是清理整个堆空间,包括年轻代和老年代。
常见问题:1)内存泄漏,内存泄漏是指程序在申请内存后,无法完全释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光;2)内存溢出:内存溢出是指程序在申请内存时,没有足够的内存空间供其使用。内存泄漏最终会导致内存溢出。
36. JVM内存监控
使用本地jvisualvm远程监控服务器:1)添加应用程序启动参数,并启动服务;2)进入本地jdk安装目录bin目录,找到jvisualvm.exe并启动;3)右键“远程”选择“添加远程主机”,并输入主机IP;4)右击主机选择“添加JMX连接”,输入JMX端口
启动参数:java -server -Dfile=UTF-8 -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=服务器IP -Dcom.sun.management.jmxremote.port=10086(端口号) -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar jar包所在目录(litemall-all-0.1.0-exec.jar) &
37. 压测机瓶颈
Jmeter分布式原理:分布式测试时,选择其中一台作为控制机,其他作为代理机。执行时,控制机会把指令下发到每台代理机上;代理机收到指令后开始执行,代理机执行时不需要启动Jmeter界面;执行完成之后,代理机会把结果回传给控制机,控制机会收集所有代理机的信息并汇总。
配置--修改bin/jmeter.properties文件:
代理机:修改服务端口,保证每个代理机都能正常启动,如果是在同一台机器上演示,需要使用不同的端口,将server_port=2999进行修改
将rmi_ssl设置为禁用,server.rmi.ssl.disable=true
控制机:配置代理机远程地址,配置每个代理机的IP+port,多个代理机之间用 ‘,’ 连接,如remote_hosts = 127.0.0.1:8080,127.0.0.1:8081
将rmi_ssl设置为禁用,server.rmi.ssl.diable=true
38. 性能测试报告内容
测试过程回顾--测试目的、测试范围、测试环境、测试使用的工具
测试问题记录及结果分析--性能测试过程中遇到的问题,分析过程和解决方案
测试结论
经验总结和教训
39. grafana监控平台
无界面压测中进行实时监控,grafana+influxdb+jmeter组合
优点:实时、美观、能够存储和对比
原理:1)运行jmeter时,会将数据写入influxdb中;2)influxdb实时存储执行的结果;3)grafana连接influxdb,将数据转成图表形式展示。
安装influxdb及部署:
1)下载并解压
2)修改配置文件:influxdb.conf
修改bind-address="0.0.0.0:8088"
修改[[graphite]]中的 enable=true database="jmeter"
3)启动influxdb
influxd -- config influxdb.conf
查看influxdb的ip地址和接口:influx 即启动influxdb命令
4)使用influxdb创建数据库
create database name
在jmeter脚本中增加后端监听器来连接influxdb
执行无界面压测,并查看jmeter数据库中是否有数据
select * from jmeter
下载安装grafana,打开grafana界面,在Configuration中选择data sources来增加数据源,配置连接的url,之后点击保存,如果出现数据源正在工作,则表示连接成功
之后可以配置仪表盘样式,在Dashboards中选择Browse,点击import,去grafana中选择合适的版本ID,之后即可