性能测试实战
记录2018年初,和平台组开发同事开展执行的一次性能测试计划过程。
准备阶段
1.公共区域
图一:配置头信息
图二:银行项目每笔交易都需要唯一的交易流水,通过"${ }"可以引用函数、变量或计数器
图三:每个接口的请求内容均由Comm_req、Sys、Input三部分组成,Input区属于业务区,Comm_req区除了交易流水其他字段基本固定,将Comm_req作为变量方便后续调用
图四:http请求默认值设置,eval()函数引用包含变量的变量
图五:响应文本断言,交易成功的标志是"status":"S"和"erorcd":"0000"
图六:将请求报文区的三部分Comm_req、Sys、Input拼接成变量request,eval()调用
2.业务区域
图一:以开客户号交易举例,添加线程组,设置为单线程
图二:录入请求报文的input区内容,存在两个需要参数化的变量contact_content1和contact_content2得从外部引用
图三:定义变量contact_content1
图四:定义变量contact_content2
图五:给交易的线程组添加http请求,jmeter自动读取公共区域http请求默认值,每个线程组下必须有请求
图六:提取响应结果赋值给变量cust_no,方便后续交易使用
图七:确认响应结果提取成功
3.验证请求结果
图一:请求参数中需要参数化的字段,通过函数、变量或计数器均已正常生成
图二:响应结果包含请求成功的交易码和标识
改进:使用Test Fragment模块化脚本构建
执行测试
略
总结
1.点击jmeter启动按钮,请求发不出去,查询结果树没有响应
原因:服务没有注册或启动,测试过程中存在清库等等,服务有时没有启动
2.4400交易需要已激活的卡号,得在数据库改状态,可以通过jmeter发送jdbc请求,jdbc连接配置中的变量名与jdbc请求中的变量名一致
注:配置过程中尾部一定不要留空格,否则可能报错:Cannot create PoolableConnectionFactory (Access denied for user 'root '@'localhost
3.用计数器生成003301开头的20位卡号,若使用starting value 为1,number format为00330100000000000000,卡号的头两位0会省略掉
解决办法:starting value为00330100000000000001,number format为00000000000000000000
4.混合压测中,可能会因为get("prcscd")而随机取交易码,这样会导致不能按要求实现混合并发
解决办法:将BeanShell PreProcessor添加到每个线程组中并取得具体的交易码,String prcscd = vars.get("prcscd交易码")
5.监控插件使用
参看:http://www.cnblogs.com/Ryana/p/8377356.html
6.慢SQL查询
通过xshell登陆mysql所在的服务器
开启慢查询:set global log_slow_queries = on
查询/设置慢查询参数(查询时间单位:sec):show global variables like 'long_query_time'; set global long_query_time =1;
查询慢查询存放日志:show variables like 'slow_query_log_file';
eg:4400交易慢查询查找
阀值(ms) |
执行时间(ms) |
位置(sql) |
10 |
35 |
TabDpBusiMain.dpa_account.Entity.selectByIndex_odb1 |
10 |
34 |
TabDpBusiMain.dpa_card.Entity.selectByIndex_odb1 |
10 |
39 |
DpAcctQuery.selSubAcctRelateRecord |
10 |
42 |
TabDpInterest.dpa_interest_rate.Entity.selectByIndex_odb1 |
10 |
28 |
DpFroze.selWholeBalFrozeSource |
10 |
36 |
TabDpProtocol.dpb_withdrawl_protect.Entity.selectByIndex_odb4 |
10 |
39 |
DpAcctQuery.selSubAcctRelateRecord |
结果定位
1). DpAcctQuery.selSubAcctRelateRecord [命名sql join on 联表查询]
更多分析:http://blog.jobbole.com/107256/
7.GC指标及调优:
相关知识学习:JVM-GC原理、JVM-GC收集器、监控GC、诊断GC
Minor GC执行迅速(50毫秒以内)
Minor GC执行不频繁(间隔10秒左右一次)
Full GC执行迅速(1秒以内)
Full GC执行不频繁(间隔10分钟左右一次)
【NewRatio=2】老年:新生=2:1
【SuvivorRatio=6】Eden:Survivor=6:1
注:括号内容并非不可变,需要考虑具体的服务
打开appCtrl文件查看CMS收集器参数,开发同事提醒这些参数得小心点改,不然没什么效果,小白弱弱的表示不会改。。。