阿里双十一是怎么做全链路压测的?
今天主要聊一聊:压测。
什么是压测?
全链路压测是以全链路业务模型为基础,将前端系统、后端应用、中间适配层、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 个步骤:
压测方案配置
预跑
预热
正式压测
压测结果
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 的判断读写到影子表中。
总结
压测,就像一袋袋沙袋堆积在一个正在行走打工人的肩上。沙袋就是流量模型,逐渐施压,一袋两袋三袋......,施压的过程中你要持续观察这个打工人的身体状况怎么样,到底是肩膀先扛不住?还是腰部先扛不住?还是腿部先受不了?一旦他喊疼,你就要立即卸下这些沙袋,否则可能会影响他走路,也可能会让他摔倒......
好了,今天我们就暂时先到这里了,明天我们换个地方,接着大促继续聊:限流。敬请期待!感谢关注~
原文:https://mp.weixin.qq.com/s/rvAm3jdUWVH7p-9xIrwB0w
评论