定义:
性能测试(Performance Testing):通过模拟真实用户来测试系统的性能是否满足用户的需求
负载测试(Load Testing):通过在被测系统上不断增加压力,直到性能指标超过预定指标或者某种资源使用已达到饱和状态
压力测试(Stress Testing):测试系统资源在一定饱和状态下,系统能够处理的会话能力,以及系统是否会出现错误
配置测试(Configuration Testing):通过对被测系统的软、硬件环境的调整,了解不同环境对系统性能的影响程度,从而找到系统各项资源的最优分配原则
并发测试(Concurrency Testing):模拟用户的并发访问,测试多用户并发访问同一个应用、同一个模块或者数据记录时是否存在锁死等性能问题
稳定性测试(Reliability Testing):通过给系统一定的业务压力的情况下,让应用持续运行一段时间,测试系统在这种条件下能否稳定运行
性能指标:
1)响应时间(Response Time):从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,这个过程所耗费的时间
2)TPS(Transaction Per Second):每秒系统能够处理的交易或事务的数量
3)资源利用率(Resource Utilization):服务器CUP、MEM、网络、磁盘I/O的使用情况
4)成功率(Success Rate):系统成功事务数占总事务数的比例
5)稳定时长:系统可稳定运行的时间
6)总事务数:系统在稳定时长内处理的事务总数
7)波动范围:系统处理事务能力的波动大小,标准偏差/平均值(Std. Deviation/Average)
Loadrunner的4部分:
1)脚本生成器(Virtual User Generator)
2)压力调度和监控系统(Controller)
3)压力生成器(Load Generator)
4)结果分析工具(Analysis)
脚本调优常用方法:
1)添加事物:lr_start_transaction("事务名"); lr_end_transaction("事务名",LR_AUTO); //事务的开始与结束是成对出现的,LR_AUTO指事务的状态由系统自动根据默认规则来判断,结果为PASS/FAIL
2)添加检查点:web_reg_find("Search=Body/Headers/All","Savecount=N","Text=文本内容"); //此函数要写到被检查内容之前,检查事务是否运行成功,Search为检查的范围,Savecount为检查的次数,Text为检查的内容
3)添加集合点:lr_rendezvous("集合点名"); //等达到规定的用户数后再一起执行某个操作,Insert-Rendezvous添加
4)添加关联:web_reg_save_param("response","LB=","RB=","Search=",LAST); //当服务器返回动态值并需要将此动态值应用到后续请求中时才用到关联,此函数返回的值为左边界LB和右边界RB之间的数据,如用到后续请求中时需将动态值替换为{response}
5)参数化:把之后会用到的参数集合起来,以便统一使用,一般使用Unique(唯一)+Each iteration(每次迭代)+Continue in a cyclic manner(循环方式)
常用到的脚本函数:
1)web_url(); //地址请求函数
2)web_submit_form(); //单表单提交函数
3)web_submit_data(); //多表单提交函数
4)web_custom_request(); //多功能表单提交函数
5)lr_think_time(); //思考时间,单位:s
6)lr_output_message(字符串); //打印输出括号内字段
字符串处理函数:
1)lr_save_string("value","name"); lr_save_int("value","name"); lr_save_datetime("value","name"); //将一个字符串、数字、日期写入一个参数保存
2)lr_eval_string("{参数}"); //返回脚本中的一个参数当前的值,返回值类型:char,例如将上一个函数中的name作为参数,即可返回value的值
3)sprintf:类似printf,只是将打印出来的内容变为给变量赋值,sprintf(变量,"%d/s/g",value);
4)strlen:strlen("hello world!");返回字符串的长度12
5)strcat:strcat(a,b);将b字符串连接到a之后,无返回值
6)strcpy:strcpy(a,b); //把b的值复制到a中
7)strcmp:strcmp(str1,str2); //对比str1字符串和str2字符串(区分大小写),若相同返回0,不同则返回非0
8)strchr:strchr(s,'a');字符首次在字符串s中出现的位置的指针,如果不存在则返回NULL,printf("%s",strchr("abcdefg",'c')),输出结果就是cdefg
9)strstr:类似strchr,strstr("abcdefg","cde")字符串首次在字符串中出现的位置的指针,如果不存在则放回NULL,printf("%s",strchr("abcdefg","cde"));输出结果为cdefg
10)atoi(字符串); //将字符串转变为整数int,返回值类型:int,如不能转换成int或者为空字符串,那么将返回0
11)itoa(整形); 将整形转化为字符串类型,返回值类型:char //已被淘汰
12)memset:
13)lr_convert_string_encoding:
性能测试流程:
1)性能测试需求分析:
- 确定测试范围
- 确定测试交易
- 确定测试工具
- 确定测试指标:根据业务指标(二八原则),按照硬件配置同比例缩小
2)编写性能测试方案:
- 测试背景、目的
- 业务场景、测试场景
- 业务指标、测试指标
- 生产环境与测试环境的差异
- 测试基础数据量
- 测试场景(策略):
1.单交易基准测试:单个交易在一个用户下(无压力)获取系统单笔交易的响应时间,为后续交易提供数据依靠
一般为迭代100次,交易之间pacing1s,关注指标:响应时间、成功率
2.单交易负载测试:单交易多并发测试,考察交易自身是否存在并发缺陷,同时考察单交易的最大处理能力
一般为等梯度的4组用户,1vu-10vu的响应时间变化应该不大,关注指标:TPS、响应时间、成功率、资源利用率
3.混合容量测试:按照测试场景配比发起压力,检测系统在给定负载下的性能表现,验证是否达到预期性能指标
一般为通过加入pacing使各交易TPS达到场景配比,计算公式:pacing = 总VU/总TPS - 单用户响应时间(总VU=单交易总占比TPS/单用户TPS,向上进位)
例如:存款交易占比32%,总TPS为100,单交易基准的响应时间为0.2s,则应发起的vu数为100*32%*0.2=6.4,向上进位为7vu,则pacing=7/320.2=0.01875s,此交易关注指标:TPS、响应时间、成功率、资源利用率
4.稳定性测试:按照系统最大的处理能力的80%发起压力,运行较长时间后,检验系统能否稳定运行 一般为执行24H,关注指标:TPS、响应时间、成功率、资源利用率、稳定运行时长、总事务数、波动范围
5.最大并发用户数测试:当并发用户数持续递增,系统资源利用率接近100%、响应时间超过3s、错误率超过0.5%达到其中任一指标时,测试停止,获取系统最大的并发用户数
3)编写测试用例
遵循测试场景的规则编写
4)编写测试脚本及调优
使用常用函数进行脚本编写
5)测试执行
在Controller中,按案例添加场景并执行
6)监控系统
在Linux系统中执行./nmon进入nmom工具
执行./nmom -t -f -s -c -m -s:每隔几秒收集一次 -c:收集次数 -m:+/tmp存放路径
7)统计、分析测试结果
使用Analysis调取测试报告,进行数据分析
常见问题:
增加并发后,TPS基本没有变化,应用和数据库的CPU也都消耗不高
可以先选择一个非登录的交易,最好是查询类交易,做1并发、5并发、10并发,试运行5分钟查看平均响应时间和TPS,如果TPS从5到10并发基本没有变化,应用和数据库的CPU也没大的变化,只是平均响应时间翻倍增加,那么基本可以确定是连接的限制问题,需要让开发查看三个连接数的设置:一个是应用允许的连接数;一个是连接池的限制;一个是数据库允许的连接限制。
切记:一定跟开发确认关闭日志或者为error级别,否则也会存在TPS很低。
应用允许的连接数查看方法,在Linux 系统下查看命令:
netstat -n | grep 23000 | awk '/^tcp/{++S[$NF]} END {for(a in S) print a,S[a]}'
netstat -an|grep 8080|grep timewaited|wc -l
执行该命令,其中23000是应用的端口,发现出现大量的time-wait
此时考虑更改操作系统的核心参数,用户有更改权限,更改配置文件使TCP端口快速回收:
(修改操作系统TCP核心参数 开启TCP复用和快速回收)
通过在/etc/sysctl.conf中增加如下几行参数, 然后/sbin/sysctl -p或重启网卡 使之生效。
连接数:10 timewait不断增加则代表连接数有问题
修改后的核心参数如下:
######################
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_keepalive_time=600
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2
###################
8)编写测试报告
测试概述:测试背景、范围、指标、环境、数据、工具
测试实施:地点、阶段
测试数据:测试目的、场景设置、场景配置、测试结果:
单交易基准测试:记录交易平均响应时间、TPS、成功率
单交易负载测试:记录交易平均响应时间、TPS、成功率,并截取每个梯度的TPS曲线图和资源利用率使用情况(带图)
混合容量测试:记录交易平均响应时间、TPS、总TPS、成功率,并截取每个梯度的TPS曲线图和资源利用率使用情况(带图)
稳定性测试:记录交易平均响应时间、TPS、总TPS、成功率,并截取每个梯度的TPS曲线图和资源利用率使用情况(带图)
结果分析:
单交易负载测试结果分析:Excel中分别作出每个交易的TPS-VU、资源利用率-VU的趋势图,复制到报告中,并叙述TPS、资源利用率、并发用户数之间的关系
混合容量测试结果分析:Excel中分别作出每个交易的TPS-VU、资源利用率-VU的趋势图,复制到报告中,并分析出系统在满足指标的同事其最佳并发用户数
稳定性测试结果分析:分析系统在稳定性测试期间的交易总笔数及成功率