一、为什么做性能测试
1. for 用户:系统有多快;系统有多稳定
2. for 老板:硬件配置;成本
3. for 开发:系统容量;系统瓶颈;如何调优;架构是否合理
二、什么时候做性能测试
常规会在系统测试结束后开始做性能测试,但实际性能测试应该贯穿始终。需求设计时,pm就需要有预期流量 -> 代码设计时,rd就应该根据性能目标设计框架,包括时延、qps等 -> 开发过程中,rd需要逐个模块验证性能是否符合需求 -> 功能测试时,需要根据性能指标设计。
三、如何做性能测试
1. 识别系统瓶颈(内存、磁盘等),建立测试数据模型(数据量大小),确定测试维度(qps、时延)
2. 设计详细的测试计划,指导测试执行
3. 规划测试环境,避免环境瓶颈(机器环境与线上一致、如依赖上下游复杂,可以mock)
4. 测试工具使用:数据脚本、统计脚本
5. 执行测试环境,获取测试数据
6. 根据测试数据,调整投放的压力,持续测试(绘制曲线,获取极限、最优点)
7. 生成报告
四、性能测试指标
1. 处理速度:qps、tps、pps
2. 响应时间:平响、99值
3. 吞吐:网络、磁盘
4. thinktime:模拟人的操作,增加一定延时
5. 并发数:最高同时在线数 * 有效用户百分比
五、常用工具
1. linux 命令:top、iostat、iotop、vmstat、sar、mpstat
2. ab、jmeter、loadrunner:工具的原理基本相同,均可设置并发数、测试接口、最大响应时间、断言等。其中并发数原理,如ab的并发数是同时建立socket的连接数。1个并发建立1个socket连接,每个socket相当于1个管道,管道间相互独立,发一个请求收到响应后再进行下一个请求。
六、实战示例
【1】web 压测:要求支持300w在线用户。
1. 数据模型:20%用户是活跃用户(28原则或pm给出);晚上7-9点用户活跃;忙时每个用户每分钟平均浏览3个页面;页面平均大小 2kb;用户等待 < 2s
2. 确定压测指标:
qps = 请求数/忙时时长 qps = 300w*20%*3*60/(2*3600)
网络带宽 = qps * 2kb * 8
响应时长 = 2s
3. 执行压测
阶梯式设置压力,例如并发数:10 -> 50 -> 100 -> 500 -> 1000。根据每个并发数下面得到的测试指标(cpu、qps、响应时间等)调整下次压测的压力数。
可能压测结果异常情况示例:内核sys态cpu占用高,可能是因为系统不停调度cpu,锁的力度过大,导致所有线程在等待同样的指令。
【2】mysql 压测
1. 数据模型:20%写请求;80%读请求;日均产生记录2000条;一年备份2次表;读写平均大小200b;响应时长 < 200ms;读tps>1000;写tps>500
2. 确定压测指标:
读写混合,所有响应时间 < 200ms,响应时间99值 < 60ms
数据量:2000*365(至少730w数据完成功能测试)
读tps > 1000,写tps > 500
3. 执行测试:
写请求测试执行 -> 读请求测试执行 -> 综合测试执行(20%写,80%读),关注tps
【3】调度系统压测
大部分服务都不止一个后台,看看上面这个服务,可能的瓶颈在哪呢?嗯,是调度和存储系统,因为是单点。压测类似服务步骤:单独测后台性能极限 -> mock后台,测调度系统的性能极限 -> 存储系统处理能力
七、系统调优
了解系统处理逻辑:多阅读研发的代码,了解代码逻辑
了解系统原理:tcp、内核等
了解测试工具原理:因为工具的设计往往体现了测试思维
多思考,可以参考研发如何分析瓶颈