作者|庄锦弟
背景
原ZLJ卖场的压测流程,是依托于阿里云PTS工具,团队自身缺乏性能测试能力自建,缺少性能分析和数据沉淀,测试场景单一,只有单接口和多接口压测,缺少场景和链路压测,不能相对合理的评估系统性能承载能力,机器扩容只凭借经验进行增加调整,缺乏评估依据。
什么是全链路压测
当接手ZLJ卖场所有业务性能测试后,重新调整性能测试流程和规范,每个项目进行登记,不再是单一接口压测,都需要制定对应的压测场景,后续在双十一、双十二大促的时候,也把全链路压测场景补充进来。在此之前,自已也有了解过一些大厂的全链路压测相关资料,感觉大同小异,差不多都是根据业务特性进行全场的压测,各场景流量大小配置,数据模型,性能分析等等。
业内通用标准:基于实际的生产业务场景、系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试,并持续调优的过程。
要精准衡量业务承载能力,全链路压测就需要做到保持跟生产环境一样:用户规模、业务场景、业务量级和流量来源,目的是让服务系统提前进行峰值承载能力演练,从而达到精准衡量业务实际处理能力的目标,其关键核心:压测环境、测试数据、压测流量(模型)、流量发起、问题定位、分析并调优。
介入全链路压测的时机
性能测试思路
全链路压测开展
1、环境确认
接到压测需求之后,最关键的是要确认目标压测的环境,这个环节非常重要,因为公司决定使用生产环境进行压测,所以当时确定在生产环境上做性能测试,在后续各种准入条件都是要基于生产环境进行准备。
为什么选择在生产环境做压测?
2、数据准备和链路梳理
链路梳理
数据准备原则
(1)真实性和可用性:可以从生产环境获取完整数据(历史数据),作为压测的基础数据,通过分析历史数据增长趋势,作为预估判断基准
(2)数据脱敏:生产环境的全链路压测,要考虑到不能对生产环境造成影响和不能影响用户体验等,因此在数据准备时,需要进行数据脱敏
(3)数据隔离:不要污染正常数据,梳理数据处理的每一个环节
(4)在链路的基础上,也有很多的分支业务,而这些分支业务有的需要压测,有的不需要压测,如以下业务可考虑不压测:
3、设计数据模型
预估数据模型
通过2/8定律计算吞吐量模型:80%请求数/20%时间=预期TPS
举个例子说明,假设以下数据:
业务量预估模型,根据运营投放的业务量,统计各大促活动阶段的数据模块
QPS预估模型,结合业务预估模型,统计各大促阶段的峰值qps,预估下一阶段大促活动的qps
4、压测平台
(1)jmeter提供分布式压测的方式(压测平台运行模式是调用jmeter内核)、压测数据结合性能监控平台能够实时的收集、可以随时停止压测、一定时间内实时错误率达到阈值自动熔断等。考虑到压测量较大的情况,测试结果异步处理。压测平台提供的能力是发起访问流量。
(2)代码改造:构造白名单用户(压测用户,作为过滤条件),请求打上特殊的标记、随机数等等。因为考虑实际成本问题,没有配置影子库,只能通过特殊标记和压测用户,过滤掉脏数据,以免影响正常运营业务统计。
5、容量规划
双十一、双十二 大促活动,公司的运营活动,专场活动…… 业务场景复杂,推送数据量大等等特点针对业务场景越发复杂化、海量数据冲击下整个业务系统链的可用性、服务能力的瓶颈,让技术更好的服务业务,创造更多的价值
容量规划的目的,主要是让各业务系统能明确知道:什么时候该加机器、什么时候该减机器?双十一,双十二等大促场景需要准备多少机器,既要保障系统稳定性、又要考虑节约成本。容量规划四阶段:
容量初步评估
容量二次评估
6、场景压测-服务承载能力
获取单台机器的服务能力
为了精准地获取到单台机器的服务能力,压力测试都是直接在生产环境进行,这有两个非常重要的原因:单机压测既需要保证环境的真实性,又要保证流量的真实性
ps:在进行压测的同时,实时探测压测机器的系统负载,一旦服务系统负载达到预设的阈值立刻停止压测,同时输出一份压测报告,通过单机压测获取的单机服务能力值也是容量规划一个非常重要的参考依据
计算公式:最小机器数 = 预估的业务流量量 / 单机服务能力
根据业务数据、评估初步容量和经过单机压测的结果,把各业务领域单独进行峰值压测(性能策略和性能测试方案在前期已经准备充分),采用逐步加压,直接并发方式,获取性能拐点,压测过程各方依赖调用量也会逐步呈现明确的数据。测试场景有单独存在的,也有相互依赖的关系,有以下验证场景:
获取链路压测综合能力
根据全链路压测的结果,基本可以明确各业务场景具体的qps峰值,结合业务数据和现有机器数量,进行一系列机器容量扩容。
7、流程注意事项
(1)业务中需要区分流量(正常流量/压测流量)
(2)接收和发送 http / grpc 等请求
(3)依赖模块
(4)不需要参与压测的做 mock 处理
8、性能监控及问题定位分析
(1)监控工具
(2)问题定位分析
调用量调整(限流)
问题现象:压测过程qps出现阶段性下降,响应时间阶段性上升
排查手段:首先排查压测平台发出的请求是否正常,通过运维监控工具分析服务运行、硬件资源等是否正常,被调用方访问量是否有设置限流和流量请求是否正常
例如:商品服务调用scf服务,scf服务设定调用量是8万/分钟,压测300秒,当商品qps达1400/s左右,scf服务出现4次限流,被限流请求走原逻辑(es查询),可以计算出实际调用量为8.4万/s,要确保商品服务请求量在达到峰值不出现被限流的情况,需要把scf调整量提高到10万/分钟。当商品qps需要达到4000/s,那scf服务调用量至少需要调整到25万/分钟。当然调用量不是越大越好,需要考虑被调用方服务实际的承载能力和机器容量情况,如达不到25万调用量承载能力,应当设定限流閥值。
应用降级
问题现象:压测关键业务场景时,发现存在一些边缘业务的接口
排查手段:梳理边缘业务是否会影响关键业务,跟业务,技术负责人确认,把这些边缘业务接口和功能列出来,在入口处做降级处理
例如:app首页,会调用多个接口,其中有4个接口不是关键功能接口(活动弹窗,订单提示,回收提示,客服),在配置中心增加配置项开关,在压测过程开启和关闭,对比压测,当关闭降级开关,可以明确看到接口会占用主入口流量,除了关键接口数据,4个接口非关键功能接口同样请求到服务会把数据返回
开启降级开关,关键接口调用量明显提升,4个接口只是返回空数据,不会请求到服务
降级的作用是在大促高峰时段,保障应用服务能正常运行,且不影响主功能流程,所采用的应急手段
其他问题
优化后:k8s扩容3个实例,重新压测 A服务功能,没有出现响应时间很慢的情况,被调用服务的cpu保持在40-50%之间,没有出现100%的情况
P服务接口,每次请求qps比较低,与研发一同分析代码逻辑,接口每次查询都会查询商列数据,经讨论计划把代码进行改造,把查询商列数据的逻辑业务抽离,再进行对比压测。
老版本接口,逻辑会查询所有商列数据
新版本接口,抽离业务逻辑,商列数据不查询
老版本走老逻辑全部逻辑查询在一个接口实现,新版本抽离部分查询逻辑,新增另外的接口查询,降低接口查询压力
性能问题肯定不止以上几个,还有缓存过期问题,缓存命中率问题,缓存穿透问题,数据库磁盘打满,分布式锁等等,具体的问题就不一一列举啦。
9、数据清理
在数据准备时,已为后续数据隔离和清理做足准备
10、测试结果
经历双十一大促全链路压测,大大小小性能优化近50次,其中关键问题有:服务cpu达100%需要机器扩容,业务逻辑代码改造,增加缓存策略,服务依赖优化,数据库连接异常,dns解析失败,ES查询阻塞等等,其余优化问题不一一列举,性能测试总会遇到意想不到问题,核心问题提前发现并得以解决,也是为下次大促做保障。 而双十二大促压测有了双十一大促压测作为基础,核心问题提前规避和检查,在全链路压测过程中除了存在部分服务cpu占用100%问题和缓存问题,影响核心业务的性能问题基本上没有出现,有的只是边缘业务问题,不影响主业务流程。 对于双十一、双十二这类大促活动,全链路压测必然是保障核心业务稳定性的保障手段之一。
end