蚂蚁是如何做全链路压测的

大家好,我是李哥。


进阿里以来一直听说一句话:“没有经过双11峰值验证过的技术都是玩具”。虽然有些夸张,但是不可否认的是,一年一度的双11,是技术最好的孵化器,也是技术同学最向往的阅兵场。


上篇我们以全局的视角聊完了大促:《面试官:如果你是大促技术负责人》。


接下来我们便开始展开技术细节。


今天主要聊一聊:压测



什么是压测?


全链路压测是以全链路业务模型为基础,将前端系统、后端应用、中间适配层、DB等整个系统环境,完整得纳入到压测范围中,以http请求为载体,模拟真实的用户行为,在线上构造出真实的超大规模的访问流量,以全链路压测模型施压,直至达到目标峰值,在压测过程中发现系统瓶颈和验证系统能力。


全链路压测(Loadcenter)为企业提供涵盖性能压测、压测报告输出以及压测风险防控的一站式压测服务。结合公司多年的线上全链路压测经验,历经几代产品打磨,为您提供高仿真、低成本、高风险识别的在线压测体验。


全链路压测支持模板化和自定义两种脚本模式,为您提供灵活、开放的脚本框架,满足不同复杂度的压测需求。另外,该产品还具备自动化压测报告输出、性能基线分析、压测风险防控等业界领先的压测技术能力。
使用全链路压测能够帮助您发现业务系统的性能问题,为企业的系统性能评估、容量规划、性能基线跟踪等提供有力的平台支撑。


为什么要做压测?


1、了解你的系统


  • 系统所能承受最大的压力是什么?
  • 当前系统集群的瓶颈是什么?
  • 系统的核心服务的最大QPS/TPS分别是多少?
  • 核心链路的下游最大QPS/TPS是多少?
  • 当服务在最大QPS/TPS水位线的时候,此时CPU的使用率是多少?磁盘的使用率是多少?
  • 单机最大QPS/TPS是多少?集群最大QPS/TPS是多少?
  • ......


2、保护你的系统优化你的系统保护下游系统


在《了解你的系统》后,你发现你的系统到处都是问题,比如:


  • 压测发现无效的日志打太多导致日志文件实在是太大了
  • 怎么一个接口进行了好几次序列化与反序列化,实在是太浪费cpu了
  • 平时不会出问题的地方,出现了并发问题
  • 发现下游口头提供了1000qps,实际上压测发现就200qps
  • ......


谁去做压测?


一般由:


  • 系统owner
  • 或某项目的技术同学owner或同项目组的技术同学
  • 或大促活动参与者负责压测模块的技术同学
  • ......


什么时候做压测?


一般有:


  • 大促前技术保障
  • 日常压测,性能优化,摸高
  • 新项目上线,接口压测,性能探索
  • ......


如何做压测?


这部分有点东西,请让我们倒一杯咖啡,慢慢聊。


1、了解整体流程



全链路压测的整体流程包含系统改造、数据迁移、模型构建和施压四个核心部分。


1.1、系统改造


系统改造的目的是:让压测流量可以畅通无阻地走通整条链路。


(1)中间件升级到支持压测标传递的版本,当前版本已都支持压测标传递;


(2)部分安全逻辑绕过,压测过程中URL会重复执行多次,针对csrf校验等操作,对压测流量绕过


(3)异步线程切换导致的丢标改造,异步线程切换时,上下文会丢掉,压测标也会随着上下文的丢失而丢失,因此需要在多线程切换中,将线程的上下文拷贝过去,保持压测标传递下去


(4)影子表构建,在DB的库表同步中执行影子表同步即可


1.2、数据迁移


数据迁移是为了将数据从线上表迁移到影子表中,一般首先迁移的是基础数据及其关联信息,比如用户数据,交易数据等,交易中是买家、卖家、商品这三者以及三者的关联,具体迁移分为三步:


(1)数据迁移:将数据从线上表中读出,写入到影子表中


(2)数据关联:被迁移数据,将其表中各个字段数据关联的其它表中的数据也要同步迁移,保障其数据的完整性


(3)数据脱敏:为防止影子数据污染线上数据并保护线上数据安全,会对数据进行脱敏,脱敏的原理是在线上的数据上加上一个很大的值(线上数据增加N年也赶不上的值),总之,这样做的目的是数据隔离,让真实数据与压测数据彻底隔离。


1.3、模型构建


模型构建的目的,主要是结合业务,设计预测出大促压测模型,然后按照压测模型组织压测数据,构建出可执行的压测流量。模型构建分为两部分:模型设计和流量构建。


模型设计:模型设计的目的主要是将业务进行采集并抽象成可执行的压测模型,并对各个子模型中的元素进行预测和设计,最终产生可以执行的压测模型,模型预测和设计的过程如下图所示。



流量构建:流量构建的过程就是将影子数据按照不同的业务规则进行构建,其中包含优惠、资金、限购、购物车添加、URL构建等,最终的体现是包含各个业务属性的url集合,配置上设定的QPS,形成压测方案。


1.4、施压


压测控制和操作在压测控制台上执行,压测控制台上管理了很多的施压引擎,可提供千万级的压测能力,将压测方案推送至压测控制台后,压测控台会为压测方案进行分配压测引擎、上传数据、登录、施压操作,在压测过程中可自由调节压测量级,灵活方便,准确高效。


施压过程中请持续关注系统告警!观察系统资源使用情况!出现问题请立即执行预案!


2、了解压测执行流程


全链路压测执行的过程,主要分为以下5个步骤:


  1. 压测方案配置
  2. 预跑
  3. 预热
  4. 正式压测
  5. 压测结果



2.1、压测方案配置


压测模型数据构建好后,会给模型中的各个场景按照大促目标配置好QPS,然后推送到压测平台,进行数据上传。
你需要知道:


  • 为什么压测
  • 需要多少压力机资源
  • 压哪些系统,哪些接口
  • 单压还是混压
  • 当前是多少
  • 预期目标是多少
  • 压测过程中出现问题是否有预案
  • 压测策略(逐步加压、脉冲、并发量等)
  • ......


2.2、预跑


预跑一般安排在正式压测前1~2天,按照模型的小比例压测,主要目的是验证模型数据的准确性和当前环境的可用性。


2.3、预热


预热的目的是将当前系统中的本地缓存、分布式缓存、DB缓存等预热到大促态,同时为防止核心应用在流量脉冲进来时,代码还没有编译,需要提前进行jit预热,预热的最终效果是让应用的各级缓存达到热的状态,在大促脉冲的瞬间缓存能稳定运行。


2.4、正式压测


正式压测当天,会按照大促当天进行演练,全天无压测执行,0点脉冲前一个小时执行提前批预案,而后在按照压测策略执行压测,一般会分为下面几步:


1、0点脉冲:系统保持大促态,完全模拟大促峰值流量,0点脉冲值大促目标值,观察各个系统表现


2、摸高:放开限流,将压力抬高当前目标峰值的10%~20%,观察系统的极限值,如果在这个范围内还稳定,可以继续往上加压,一直到有系统扛不住为止


3、限流验证:在摸高达到最高状态后,生效限流,限制会大促目标峰值,查看流量是否准确回到限流值,验证限流效果


4、破坏性测试:在该阶段,维持大促态峰值压测,各业务系统执行其紧急预案,观察这些预案对系统性能影响


2.5、压测结果


整个压测结束后,会组织各系统核心成员,进行压测复盘,讲述当前系统中的瓶颈并给出后续修复计划,所有系统瓶颈及其后续计划复盘完成后,将各个系统数据以及系统瓶颈汇总成压测报告。


3、影子表执行原理


要在线上实现压测,必回涉及到数据的读写,如果使用线上数据压测,总会造成数据污染,为避免该问题,引入影子体系,将压测数据和线上数据隔离,并使压测数据走的业务路径和线上数据一致,保持压测的有效性和真实性。



如上图所示,通过压测标t=1,实现了压测流量和线上流量的区分,影子标t=1通过URL中的biz_loadtest=1映射而来,然后附着在上下文中,在各个中间件中实现传递,最终落库时,通过DB Proxy的判断读写到影子表中。


总结


压测,就像一袋袋沙袋堆积在一个正在行走打工人的肩上。沙袋就是流量模型,逐渐施压,一袋两袋三袋......,施压的过程中你要持续观察这个打工人的身体状况怎么样,到底是肩膀先扛不住?还是腰部先扛不住?还是腿部先受不了?一旦他喊疼,你就要立即卸下这些沙袋,否则可能会影响他走路,也可能会让他摔倒。


好了,今天我们就暂时先到这里了,明天我们换个地方,接着大促这篇聊:限流。敬请期待!感谢阅读~感谢关注~

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章