压测流程总结
一、压测前期准备
- 梳理接口逻辑,与研发、业务方对齐压测背景
- 根据压测背景、接口梳理情况等制定压测方案&目标
- QPS计算:
- 推文活动的QPS计算方法:
从业务方拿到往期推文的打开率、点击率以及本期的推文量
例如:往期推文打开率:2.03%, 往期推文点击率:25%
计划推文量为13000000+98000000+30000000+3000000=144000000
所以QPS =[144000000*2.03%*25% /(30*60)] * (3~5)倍
406*(3~5)=1218~2030QPS
- 现有接口每日正常QPS量+推送量的计算方法:
例如:快手推广活动,快手也用案例详情页接口,正常h5也用案例详情页接口,所以压测量应该为正常请求量+推广量,推广量计划在290/s左右,水滴筹日常高峰期案例详情页流量在700/s左右,按照3倍(290+700)的结果去作为压测目标,故压测目标为3000/s
- 编写压测计划,压测计划必须包含压测背景、压测接口、压测时间安排、监控地址
二、压测脚本&数据准备
1、压测脚本编写
- 脚本编写工具:jmeter
- 创建测试计划
- 创建线程组,压测的接口根据不同的情况可以划分在不同的线程组中
例如:
- 读写接口分开压测,读接口放在一个线程组中,写接口放在另一个线程组中
- 一级页面调用的接口放在一个线程组中,二级页面调用的接口放在另一个线程组中
- 在线程组中添加对应的组件编写接口等
- 编写脚本过程中有些重要的注意点如下:
- 脚本请求方式一定要用java
- 使用压测平台时,压测域名为:服务名.空间名.svc 例如:cf-api.cf.svc
- 内网域名,及平台使用时,网络协议为http;使用外网域名(例如:api.shuidichou.com)和对应服务pod的IP时,网络协议使用https
- 需求要有压测标识PresureTest-------true,使用原因:1、接口请求有写库,为避免造成线上脏数据,需建立影子库,写入压测标识,证明影子库生效 2、接口请求只读,存在报错时,可根据压测标识查询日志,用于定位问题
- 外部文件参数引用,path:1、/jmeter-data/bin/文件名.txt 2、线上token引用:{TOKEN}
2、数据准备
- 准备压测时需要用到的数据,如案例id,token等
准备测试环境&线上的数据,测试环境数据可用来调试脚本,数据文件正确命名并且在脚本中正确引用
- 准备监控看板
- 接口请求量对应SQL:替换接口&服务即可
SQL |
- 接口请求耗时对应SQL:替换接口&服务即可
SQL |
- 存在写库或者redis接口时,提醒研发提前创建影子库
- 在压测平台创建压测计划
- 提前在压测平台申请token
3、脚本调试
在测试环境调试脚本,脚本可成功运行后,在线上环境执行一条数据,查看是否含有压测标识,线上执行通过后,在压测平台进行调试脚本,查看是否存在压测标识
三、执行压测
- 执行压测过程中,实时观测报警和监控,有异常即刻停止压测,配合研发排查
- 压测过程中如果需要扩容,则按照下面的操作方式对项目机器进行扩容,pod需要扩容多大可以根据压测中cpu等情况决定扩容多少
压测完成后,记得将之前扩容的服务进行缩容
四、输出压测结果
- 分析压测结果,评估本次压测是否达到预期,是否发现存在的性能问题
- 输出压测报告,报告中包含压测过程、压测数据、压测结论和后续todo
- 若发现相关性能问题,解决后再重新进行压测
- 沉淀压测经验