【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

京东云开发者
• 阅读 308

一、前言

性能测试之于软件系统,是保障其业务承载能力及稳定性的关键措施。以软件系统的能力建设为主线,系统能力设计工作与性能测试工作,既有先后之顺序,亦有相互之影响。以上,在性能测试的场景决策,架构分析、流量分析、压测实施和剖解调优等主要环节中,引发对于系统能力底盘夯实和测试策略改进的诸多思考。

在性能测试阶段,剖析系统能力实现及调优方案,探索更优解及性能测试策略的提升空间。

二、热点数据存储模型压测实战及思考

通过性能测试,推测SKU库存预占场景,在不同存储模式下的性能瓶颈及风险。

数据架构升级后,SKU库存预占效率(TPS)提升2300%↑。

测试驱动,结合系统实现,论证缓存预热的必要性,并借助大数据分析,探索科学的缓存预热及保温策略。

结合新业务模式,思考更加科学的测试数据构建思路和测试过程提效方案。

1、压测场景

库存预占,是指在订单接单环节,为单据提供SKU库存短暂预留。物流仓配订单接单环节,会发起SKU维度的库存预占行为。

库存中心通过“库存预占主应用”中的预占接口,对外提供SKU库存预占标准能力。主要通过“库存扣减逻辑管控及数据库层交互”、“缓存层交互”,以及“任务调度”三个关键应用,承载库存逻辑计算及存储层交互能力。

数据模型视角,对预占能力实现分为两种:

▪事业部维度库存预占主要通过Redis缓存层承载。

▪批次库存预占直接由数据库承载。

当大促仓配单量进入爆发期,热点SKU预占请求快速增长,且库存预占请求直达数据库,系统TP99会出现跳点甚至持续升高,严重情况下造成接单超时。

以上,计划针对性构造压测场景及数据模型,确认系统的峰值承载能力及调优策略的有效性。

2、首压及分析

压测目标:“库存预占主应用”下的“预占接口”,在数据库承载热点SKU预占请求模式下,探索目标TP99(≤3000ms)可承载的峰值流量,并验证调优后的峰值承载能力(目标 TP99≤500ms)。

压测方案:单个热点SKU持续发压预占,发压起始QPS=10,并以QPS+10递增,探索可承载请求的性能上限。

压测过程及结论

▪在QPS=50时,系统可稳定支撑库存预占业务(TP99≈100ms)。

▪“库存预占”主应用:CPU使用率≤15%,内存使用率≤35%

▪“库存扣减逻辑管控及数据库层交互”应用:CPU使用率≤18%,内存使用率≤65%

▪数据库:CPU使用率≤7.8%(无慢SQL)

▪基于当前的系统性能体现,具备持续加压的条件。

▪以QPS+10递增加压至60时,TP99在2分钟左右快速增长至7000ms,“库存预占”主应用TPS≤60,预判系统能力达到瓶颈,停止加压。

“库存预占”主应用 TP99+TPS趋势

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

“库存预占”主应用 硬件资源趋势

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

数据库 关键指标(CPU)

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

数据库 关键指标(慢SQL)

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

数据库 关键指标(内存)

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

瓶颈预判:单据维度的库存预占是以先查(可用库存)后写(预占库存)的方式进行,在对热点SKU高频次下单过程中,数据库会对该行记录长时间持续读写,数据库层面会通过行锁机制保证单笔交易的原子性,行级锁引发的锁竞争大概率会导致系统处理能力达到瓶颈,制约系统的执行效率。同时从应用层到存储层,未出现硬件资源瓶颈,排除硬件资源不足的影响。

3、调优及复压

存储层改造(_见 库存中心-库存预占场景 系统架构简图_):经首轮压测及分析,为解决已知性能瓶颈,从数据架构层面,将批次库存预占由数据库直接承载请求压力,升级为由Redis缓存主要承载请求压力。利用Redis高性能吞吐能力,解决并发场景下的数据读写效率问题,由Redis前置承载热点商品的主要流量。

一致性保障(_见 库存中心-库存变化监控机制简图_)

▪为确保缓存层与数据库层数据一致性,在缓存命中的情况下,通过建立调度任务或MQ方式异步回写数据库。

▪在缓存击穿时,通过先读(数据库)后写(Redis)再反馈(API)预占结果,之后异步回写数据库,确保数据一致性。

库存中心-库存预占场景 系统架构简图

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

库存中心-库存变化监控机制简图

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

复压结论

▪完成数据架构升级及热点SKU缓存预热后,初始QPS=1100并以100递增,TPS上探至1200时,TP99≈130ms,系统可稳定支撑批次库存预占业务。

▪当TPS上探至1300时,TP99出现明显波动(毛刺≈420ms),且“缓存层交互”应用CPU占用率飙升至90%+,核心链路稳定性劣化,停止加压。

▪相较数据库承载模式,缓存化升级后,TP99满足预期(≤500ms),TPS承载能力大幅提升2300%=(1200-50)/50。

“库存预占”主应用 TP99+TPS趋势

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

“库存预占”主应用 硬件资源趋势

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

数据库 关键指标(CPU)

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

数据库 关键指标(慢SQL)

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

数据库 关键指标(内存)

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

Redis集群 关键指标

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

4、系统健壮性思考

全量缓存的弊端:供应链模式中的不同行业,SKU品类生命周期存在较大差异(如服饰行业≈3个月),全量缓存模式会导致Redis中存在大量无效品类,资源消耗膨胀不可控,增加资源成本,有必要设计更有效的缓存方案。

缓存预热及保温的必要性:缓存命中率,与预热机制和保温策略紧密相关。

▪必要性:常规大促节奏,起售期会触发首次缓存初始化,促销品类与日常销售品类的重合度,决定了首次缓存击穿的概率。目前的Key有效期=7天,大促起售期→开门红→高峰期间隔均大于7天,缺少必要的保温策略,会增加下个促销节点前缓存失效的可能性。

大促开门红至11.11 缓存命中率趋势

系统整体可平稳承载流量,__同时缓存命中率曲线,有一定的提升空间

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

▪预热思路:如何尽可能保持在大促等特定时段的缓存有效性,提升缓存命中率(降低击穿概率),可通过前置的多维度分析调研,包括但不限于基于大数据的大促前集中采购品类分布分析、历次大促及关键节点促销品类密度及分布分析 以及 关键客户促销计划调研等方式,结合技术手段,前置预判、预热及保温。

缓存预热实践:通过对某客户大促前集中采购期及大促节点SKU品类重合度分析,发现以下规律

▪集采入视角:大促集采期SKU品类,相对开门红品类重合度≈69%,相对11.11品类重合度≈75%。

▪销售出视角:起售期SKU品类,相对开门红重合度≈94%,开门红相对11.11品类重合度≈75%。

▪以上数据证明,通过在开门红以及11.11大促等关键促销节点前,将集采期及前一促销期的SKU可用库存数据,进行缓存预热,有助于提升预占请求的缓存命中率。

大促主要环节 SKU品类重合度分析

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

异常场景识别:库存场景对数据三性(准确性、及时性、完整性)要求较高,在数据库与缓存的双向同步过程中,需避免因一致性问题引发的业务异常。

▪超卖异常识别:大促单量峰值期,为保护主数据库安全,通过缓存同步限流减缓主库压力,造成缓存至数据库同步延迟,同一SKU在数据库层未及时扣减,如此时叠加缓存Key到期情况,接口直接返回MySQL数据,可能会引发超卖业务异常。

▪系统优化思路

▪静态方案:单量高峰期期间,延长Key效期,覆盖大促关键环节间隔。

▪动态方案:增加热点SKU缓存效期延时策略,Key到期T-1天,日均预占请求量大于1的SKU,自动延长Key有效期。

5、测试策略改进思考

场景拓展

▪直播电商模式主流化趋势强劲(2023年前三季度全国直播电商销售额达1.98万亿元,增长60.6%,占网络零售额的18.3%,直播电商拉动网零增速7.7个百分点),相较传统电商,其限时促销模式叠加社交传播扩散属性,单品瞬时流量大,不同促销场次品类重合度更低,促销频次高,对系统性能提出了不同的要求。

▪反推性能测试策略,从平台视角出发,需要尽可能提升选用SKU的多样性,同时降低压测单次请求SKU的品类重合度,识别真实复杂场景下的性能隐患。

效率提升:复杂场景的仓配订单性能测试工作,需要前置基础数据的大量储备(商品、库存),以及高复杂度接口请求数据准备。如何确保商品和库存等基础数据快速就绪?同时下单请求的报文体根据SKU密度和复杂度需要,自动化快速构建组装?需要在现有压测框架基础上,开发扩展功能,以支撑从基础数据到复杂单据的一键快速初始化构造能力,降低复杂场景构建难度,提升测试工作效率。

三、无效调用量分析、识别及调优实战

在性能测试的流量分析阶段,结合业务场景调研,前置识别性能瓶颈疑点。

推动排查及调整核心链路调用逻辑后,在标定的业务窗口期,核心接口调用总量降低60%↓。

深入细分业务场景,推演潜在的调优空间。

1、背景

物流系统在订单出库后,由 订单明细查询应用,提供订单及其关联包裹明细信息的对外查询能力。主要由外部系统(Top2量级调用方:接入回传67%、履约回传11%)调用,在单据出库后,输出出库货品的数量和包裹详情等订单基础信息。

关键(Top2)调用方拓扑

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

2、场景调研及疑点识别

场景调研及风险预判(生产流量分析)

▪对“订单包裹明细查询接口”进行调用量趋势分析,取样23年10.12 06:30~23:00(流量分析期),环比最近一次促销同时段(最近一次大促请求高峰期),Top2调用方峰值调用总量激增305%。

▪基于前期调研,从调用量看,常规情况下仓库出库能力均值≈400000单/分钟,仓库出库高峰时段为每日08:00~18:00,仓出库次数:“订单包裹明细查询接口”峰值调用量≈1:10为“常规比例”。

▪通过对10月12日线上数据观测,仓出库次数:“订单包裹明细查询接口”调用峰值(400000/6532200)≈1:16,相较“常规比例”偏差较大。

▪以上,通过生产流量分析工作,识别出在仓库出库高峰时段,“订单包裹明细查询接口” 调用量存在疑点,并进一步深入分析。

最近一次促销期 关键应用调用量

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

2023年10.12 关键应用调用量

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

调用链粗筛

▪仓配出库单据维度,履约回传应用,向订单系统推送出库明细时,会调用仓明细查询接口。

▪接入回传应用,在回传订单信息时,会调用仓明细查询接口。

▪履约状态回传调用峰值 / 接入回传调用峰值 ≈ 1:9,接入回传调用峰值明显偏大,逐步锁定疑点系统(接入回传应用)。

疑点深剖

▪经深入排查,首先确认前期对异常流量和疑点系统的判断基本准确。

▪技术架构层面,接入回传应用在未判断订单状态情况下,调用目标接口。导致单据在未出库且没有出库明细时,发生大量无效调用。

▪同时发现,因AB测试环境别名配置错误,导致生产流量误叠加。

3、调优策略

◦调用逻辑调整

▪“I” 业务场景订单回传阶段,如单据状态为出库前,不发起“订单包裹明细查询接口”调用,剔除无效查询。

▪根据最终的回传内容(是否需要明细信息),判断调用的必要性,剔除非必要查询。

◦调整AB测试环境别名配置,避免测试流量对生产环境产生非必要压力。

优化前接入回传应用逻辑

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

优化后接入回传应用逻辑

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

4、调优效果

◦相对调优前(10.12),“接入回传应用” 调用总量降低60%↓(前:2397252500 后:925890100),峰值调用量降低64%↓(前:5921500 后:2121800)。

下图分别为调整前、后调用量分布,用以对比

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

5、性能风险前置识别

◦压测实施阶段不是发现性能隐患的唯一阶段,如果有能力在流量分析阶段识别性能风险并推动论证,问题发现越早,风控代价(资源)越小,质量风险越低。

6、OpsReview常态化

◦流量异动观测:流量分析及性能风险识别,需要结合实际的生产运营特征,以及接口的关键调用链,定义系统调用量的普遍规律。被调用方有必要不断积累识别调用来源和常规量级,盘点外部调用策略,在调用量出现异动时,排查风险。

◦编码规范:对于接口调用逻辑,有必要抽象为标准方法,避免团队协同开发过程中出现因人而异的Coding差异,降低无效查询发生概率。

◦定制化逻辑排查:系统内非标业务存在较多的定制化逻辑,有必要针对特殊逻辑排查无效查询风险。

7、潜在调优空间推演

◦基于测试经验,经过业务场景梳理,发现 “I场景” 下存在细分的非标定制化流程,以及与 “I场景” 并列的 “P场景” 标准流程。

◦联动研发深入分析 “I场景” 中的非标定制化流程 以及 “P场景” 中的标准流程,已确认,存在进一步优化空间,并明确优化方案(如下图)。

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

四、总结

性能测试作为系统能力巩固升级的关键措施,通过对典型案例的陈述和思考,探索系统能力和性能测试策略的提升空间。确保核心系统链路稳定高效承载业务峰值流量,同时从容应对极端场景。

作者:京东物流 刘锐等

来源:京东云开发者社区 自猿其说 Tech 转载请注明来源

点赞
收藏
评论区
推荐文章
GoCoding GoCoding
3年前
Linux 性能相关工具
来自Netflix性能优化大牛BrendanGregg的整理。观测分析测试调优参考
面试字节跳动Java工程师该怎么准备?值得收藏!
性能调优影响MySQLServer性能的相关因素1.商业需求对性能的影响2.系统架构及实现对性能的影响3.Query语句对系统性能的影响4.Schema设计对系统的性能影响5.硬件环境对系统性能的影响MySQL数据库锁定机制1.MySQL锁定机制简介2.各种锁定机制分析3.合理利用锁机制优化MySQLMySQL数据库Que
Stella981 Stella981
3年前
JVM性能调优详解
前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备。这篇文章带领大家学习JVM性能调优的知识。性能调优性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下
软件测试之怎样做好系统测试
一套软件做完了,在给客户上线之前,我们自己要进行完整的系统测试,这个工作听起来好像没什么,但其实是很不好做的,这要求测试人员要熟悉业务、熟悉系统的各个功能项、还要有一套完整的测试方法。我们软件销售部从开始做系统分析工作,现在又开始担当系统测试的角色了,没办法,公司人手不够,只能担当多种角色了。不过对于我们来说也有一定好处,系统分析设计是我们做的,现在做好的系
京东云开发者 京东云开发者
5个月前
研发视角浅谈R2流量回放测试
一、背景测试小伙伴们在2023年保障了团队线上系统0问题,这简直就是一项了不起的壮举!这得益于咱们测试组同事对工作的细致投入、风险把控、以及严格遵循流程规范进行测试用例评审、自动化建设、联调推动、回归验证、常态化压测、大促高保真压测、引流回放等多重保险策略
京东云开发者 京东云开发者
2个月前
测试聊并发-入门篇
作者:京东保险张新磊背景在现代软件测试的广阔领域中,我们的工作不仅限于确保功能符合产品和业务需求的严格标准。随着用户对应用性能的期望水涨船高,性能测试已成为衡量软件质量的关键指标。特别是在服务端接口的性能测试中,我们面临的挑战不仅仅是处理单个请求的效率,更
京东云开发者 京东云开发者
2星期前
小小的日志,大大的坑
作者:京东零售王军1.背景压测过程中优化线程池以后单机qps存在性能瓶颈,优化过程中发现默认线程池及日志对性能存在严重的影响所以引发了一系列对日志优化的整理2.哪些场景可能导致性能问题在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据
司马炎 司马炎
2年前
【MindStudio训练营第一季】MindStudio 专家系统随笔
简介专家系统(MindstudioAdvisor)是用于聚焦模型和算子的性能调优Top问题,识别性能瓶颈,重点构建瓶颈分析、优化推荐模型,支撑开发效率提升的工具。专家系统当前已经支持针对推理、训练、算子场景的瓶颈分析模型,包括内部团队开发的模型&
测试技术的重要性与应用:现状、方法和未来展望
在软件开发领域,测试技术扮演着至关重要的角色。测试技术是通过系统性的验证和评估来检查软件系统的正确性、可靠性和性能的过程。它旨在发现潜在的缺陷、错误和漏洞,并提供反馈和建议给开发团队,以便及时修复和改进。测试技术的目标是确保软件系统能够按照预期的方式工作,并满足用户的需求和期望。
京东云开发者 京东云开发者
5个月前
万字长文浅谈系统稳定性建设
1.背景京东的期中考试:618即将到来,各个团队都在进行期中考试前的模拟考试:军演压测,故障演练,系统的梳理以检测系统的稳定性以应对高可用,高性能,高并发。我们知道系统的稳定性建设是贯穿整个研发流程:需求阶段,研发阶段,测试阶段,上线阶段,运维阶段;整个流