1. 压测基本原理介绍
1.1 压力测试定义
压测:模拟海量用户并发使用业务系统的一个或多个功能场景,测试系统性能,保障系统的稳定性。
- 压力测试分类:冒烟测试、负载测试、压力测试、尖峰测试、浸泡测试;
- 模拟海量用户:虚拟用户(Virtual User)、多地域、多ip、行为多样;
- 压力模型:并发模式、RPS模式、脉冲模型;
- 压测用例场景构建:场景编排、单场景压测、多场景混压;
- 系统性能指标:RPS/QPS、TPS、平均时延、错误率、资源负载;
1.1.1 压力测试分类
冒烟测试:最小负载(通常一个并发)验证测试脚本没有错误,保证接口或者脚本能正常使用。
负载测试:评估系统在常规负载下的系统性能表现,会有明确SLA要求。
压力测试:评估系统在极限负载下的系统的可用性和稳定性,探测系统的容量。
尖峰测试:相比压力测试,尖峰测试的负载梯度设置会更加激进,陡增陡降,验证服务稳定性。
浸泡测试:验证系统长时间处于压力情况下(通常60-80%负载、以小时为单位)导致的性能和可靠性问题。
服务等级协议 SLA(Service Level Agreement)是判定压测是否异常的重要依据。比如 失败率超过1%就警告, cpu负载超过70%就警告, 一般云厂商都提供了SLA配置的管理平台
1.1.2 海量用户模拟
通常通过多线程来模拟用户,同时为了用户真实性,还需要带上多地域、多行为多样化等属性;
- 相关要素
压测引擎:用户模拟通过压测引擎利用多线程实现;不同的引擎因为IO模型差异,启动线程模拟用户消耗的资源差异略有不同,这也是导致引擎整体性能差异的原因;
分布式集群:提供资源给压测引擎模拟海量用户,并具备多地域部署、弹性伸缩等能力;
压测数据:海量多样的压测数据保证用户行为多样化;
- 海量用户压测执行时,核心是保障多集群多容器多线程同步执行,状态可控;
- 线程状态同步:所有线程(用户)需要在同一时间开始发压,保证准确模拟用户并发情况,这部分由压测引擎负责;
- 容器状态同步:由于高并发需要大量资源,压测任务会分布在多个pod执行,因此需要保证多个pod中的任务状态同步,这部分由各pod管理者(eks)负责;
- 集群状态同步:由于要支持多地域发压,压测任务会分布在不同地域的集群,因此需要保证多个集群的任务状态同步,这部分由集群的调度服务负责;
为了真实有效的模拟 , 可以采用 流量录制然后重放的方式, 来模拟真实用户,
如果有写的操作, 可以考虑用影子表或影子库来隔离用户数据
如果涉及到状态信息(例如登录token), 在发送流量时, 通过改写token参数,比如不会失效的压测token; 生成一个有效的用户token
1.1.3 压力模型设置
压力模型负责描述海量虚拟用户如何给系统制造请求压力
- 系统压力值两个概念
并发用户数:同时使用系统的用户数量,从用户侧视角描述系统压力值;,(适用于真实用户场景)
系统吞吐量(RPS):系统每秒处理的请求数,从系统侧视角描述系统压力值;(适用于系统组件等场景)
- 压力模型
梯度发压模型:按照设定的虚拟用户数(U)进行发压,可设置用户量梯度上升规则,防止压力突增过高影响系统稳定性;
RPS模型:设置系统吞吐量,通过控制每个用户RPS来达到设定的压测吞吐量目标;
1.1.4 压测场景构建
多种压测编写模式:支持简单低代码模式、脚本语法模式、JMeter原生模式及GoPlugin等多种压测方式。
多场景混压:支持多场景并发压测,通过权重调节发压负载等
多协议支持:http,grpc,tars/taf,websocket等
复杂用例编排:支持复杂场景串联、可通过iffo等语句进行编排场景,高度自定义。
多地域发压:支持北京、广州、深圳、南京等多地发压。
SLA熔断:智能SLA熔断,避免被压服务出现问题时依旧进行大量请求。
流量转压测:录制流量一键转换。
- 根据流量自动构造大量请求数据
- 提升压测数据多样性保证压测数据实时性
作为一个压测平台应当具备以上能力
1.1.5 性能指标采集分析
指标分析通常包括压测过程中SLA监控 & 压测完成后问题分析
压测过程中SLA监控:保障压测过程中不会影响系统稳定性;
压测后问题分析:通过错误率、时延等指标分析提升系统稳定性;全链路压测不仅包含发压端数据,也包括被压服务端数据;
服务拓扑扩散比: 当是微服务的场景下, 每个服务会受到的压力会随着服务的增多而增多, 特别是底层服务, 那在真实流量中, 每个服务的扩散值是多少呢? 这对我们知晓服务瓶颈, 预算服务节点数量有很高的价值
2. 全链路压测介绍
全链路压测是在正式环境模拟真实流量量级的场景化压测,目标是发现系统瓶颈以及容量评估规划。
- 真实的流量场景
- 量级、场景、特征尽可能模拟真实流量
- 真实的环境
- 在线上真实环境进行压测
- 提前进行
- 模拟活动提前实战演练,提前发现问题
- 常态化
- 周期性的小批量性能验证和问题定位
怎么不影响生产流量呢?
- 流量隔离
- 流量可标识, 可透传
- 数据隔离
- 中间件读写隔离
- 过程产生数据的数据隔离
- 业务逻辑隔离
- 压测逻辑和正式逻辑隔离开
- 资源隔离
- 独立划分CPU, 内存等等
在生产环境,一般只会做前两种, 后两种成本较大, 且会一定程度上影响压测效果
2.1 业界实现对比
公司 | 方案描述 | 特点 |
---|---|---|
阿里 | 终端/后台流量录制+自动清洗 流量打标+影子表隔离 统一的RPC框架和中间件支持 | 数据完全隔离,服务资源复用 Java技术栈,统一中间件支持,无业务侵入 输出阿里云压测产品PTS |
头条 | 终端/后台流量录制+自动清洗 流量打标+影子表隔离 不合规框架服务改造 | 数据完全隔离,服务资源复用 多技术栈(go、python、java),有改造成本 统一的中间件体系支持 |
MegaEase | SpringCloud服务网格;ShadowService机制 | Service复制+中间件镜像+金丝雀规则 最高隔离级别 JavaAgent,,无侵入设计 对于复杂业务复制环境代价较大 |