本文章介绍性能测试的执行与分析。
Quick Guide
性能测试执行
- 人工边执行边分析
- 无人值守执行性能测试:利用业务或者系统空闲时间测试
注意事项
- 如果在线上或者uat,要考虑对业务的影响,跟开发及时沟通测试场景,尽量业务或者系统空闲时间测试
- 记录性能指标(数值和图片):图片还是必须的记录,测试周期长可能存在记录错误或者争论
- 监控请求是否正常,分析失败原因
- 测试总体曲线是否呈现波峰或者随着请求量增大趋于水平
结果分析与调优
结果分析
- 测试结果是否满足性能指标
- 满足,开始写性能报告;不满足,是否受到哪方面限制或者其他因素,跟需求方确实是否需要调优,调优进行下一节初步分析,然后跟架构师和开发确定方案。
注意事项
- 1.测试曲线远离预想
- 可能是被测系统接受的tps不同于实际执行机发出,在被测机器增加日志打印之类方式去统计接受到的需求
- 触发特殊的系统机制
- 2.请求出现较高的错误率
- 查看返回的错误信息
- 检查网络是否稳定
- 检查中间组件异常
- 检查数据库是否重启
- 集群检查每个节点是否正常
- 3.集群测试平均性能小于单机
- 负债均衡组件分发速度是否受到限制,处理太慢
- 分发规则是否对每一台单机发送的请求量大体一致
系统瓶颈分析
整体思路:从前到后,从表象到内部:
- 1.首先排除压力机自身的问题,如CPU、内存,网络,脚本编写等
- 2.监控中间件的访问日志,观察响应时间,大体确定耗时处于哪一段
- 3.排查网络问题,监控压力机到后端服务器的网络,以及各服务器间的网络,是否达到网络上限
- 4.监控服务端所有机器的操作系统负载,如CPU、内存、磁盘、网络是否达到瓶颈
- 5.监控应用服务器的日志,查看是否存在ERROR日志,比如TimeOut或其他类型报错
- 6.监控各中间件的连接数,如nginx、tomcat、mysql等,是否达到上限
- 7.监控应用程序线程状态,使用jstack或jvisualvm查看是否有死锁、阻塞等情况
- 8.监控应用程序的jvm,使用jstat或者jmap查看GC情况,是否内存泄漏等
- 9.使用jprofiler监控应用程序,可以查看耗时比较长的代码方法
10.监控数据库,是否存在慢查询,一般数据库CPU高都是因为SQL语句效率低造成的
在sql语句前加上explain,可以分析这条sql语句的执行情况 explain select * from t_order_loop_refund where name = ‘小明’;
- Type列可能的值
Const:表中只有一个匹配行,用到primary key或unique key Eq_ref:唯一性索引扫描,key的所有部分被连接联接查询使用,且key是unique或primary key ref:非唯一性索引扫描,或只使用了联合索引的最左前缀 Range:索引范围扫描,在索引列上进行给定范围内的检索,如between,in(1,100) Index:遍历索引... All:全表扫描 Prossible key:使用哪个索引能找到行 Keys:sql语句使用的索引 rows:mysql 根据索引选择情况,估算查找数据所需读取的行数
- 联合索引
- 连接数
- 数据库架构优化
- 读写分离,主从配置
- 硬件调优
- Type列可能的值
- 11.检查数据库执行计划,是否有全表扫描,以及索引不生效的情况
- 12.检查系统外部依赖情况,如果外部依赖系统性能差,也会造成本系统性能低
- 13.对于不好定位的问题,可以考虑采用模块隔离法来确定问题
优化方案
- sql
- 在 where 及 order by 涉及的列上建立索引,避免全表扫描,索引不要太多,一个表一般不要
超过4个索引 - 避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
- 查询语句中不要使用 *,减少内存使用
- 尽量减少子查询,使用关联查询(left join,right join,inner join)替代
- 减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代
- or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,
union all会更好) - 合理的增加冗余的字段(减少表的联接查询)
- 建表的时候能使用数字类型的字段就使用数字类型(type,status…),数字类型的字段作为条件查询比字符串的快
- 在 where 及 order by 涉及的列上建立索引,避免全表扫描,索引不要太多,一个表一般不要
- 代码
- 使用对象池减少对重复对象的创建;
- 调整对后端的连接
- 增加本地缓存
- 如果不涉及事务的情况下,考虑使用Nosql进行存储
- 一次请求合并多次操作
- 由串行修改为并行操作
- 同步修改为异步
测试报告与总结
- 测试计划
- 业务流程
- 测试环境
- 测试场景:把测试场景罗列,并放上对于性能结果和资源占用率的图片
- 结果与分析:把测试性能指标与实际结果罗列对比,说明存在哪些问题
- 结论:问题和是否满足标准
- 风险点:存在哪些风险需要考虑,怎么去规避