1. 压测基本原理介绍

1.1 压力测试定义

压测:模拟海量用户并发使用业务系统的一个或多个功能场景,测试系统性能,保障系统的稳定性。

  • 压力测试分类:冒烟测试、负载测试、压力测试、尖峰测试、浸泡测试;
  • 模拟海量用户:虚拟用户(Virtual User)、多地域、多ip、行为多样;
  • 压力模型:并发模式、RPS模式、脉冲模型;
  • 压测用例场景构建:场景编排、单场景压测、多场景混压;
  • 系统性能指标:RPS/QPS、TPS、平均时延、错误率、资源负载;

1.1.1 压力测试分类

冒烟测试:最小负载(通常一个并发)验证测试脚本没有错误,保证接口或者脚本能正常使用。

负载测试:评估系统在常规负载下的系统性能表现,会有明确SLA要求。

压力测试:评估系统在极限负载下的系统的可用性和稳定性,探测系统的容量。

尖峰测试:相比压力测试,尖峰测试的负载梯度设置会更加激进,陡增陡降,验证服务稳定性。

浸泡测试:验证系统长时间处于压力情况下(通常60-80%负载、以小时为单位)导致的性能和可靠性问题。

服务等级协议 SLA(Service Level Agreement)是判定压测是否异常的重要依据。比如 失败率超过1%就警告, cpu负载超过70%就警告, 一般云厂商都提供了SLA配置的管理平台

image.png

性能压测中的SLA,你知道吗?-阿里云开发者社区 (aliyun.com)

1.1.2 海量用户模拟

通常通过多线程来模拟用户,同时为了用户真实性,还需要带上多地域、多行为多样化等属性;

  1. 相关要素
  • 压测引擎:用户模拟通过压测引擎利用多线程实现;不同的引擎因为IO模型差异,启动线程模拟用户消耗的资源差异略有不同,这也是导致引擎整体性能差异的原因;

  • 分布式集群:提供资源给压测引擎模拟海量用户,并具备多地域部署、弹性伸缩等能力;

  • 压测数据:海量多样的压测数据保证用户行为多样化;


  1. 海量用户压测执行时,核心是保障多集群多容器多线程同步执行,状态可控;
  • 线程状态同步:所有线程(用户)需要在同一时间开始发压,保证准确模拟用户并发情况,这部分由压测引擎负责;
  • 容器状态同步:由于高并发需要大量资源,压测任务会分布在多个pod执行,因此需要保证多个pod中的任务状态同步,这部分由各pod管理者(eks)负责;
  • 集群状态同步:由于要支持多地域发压,压测任务会分布在不同地域的集群,因此需要保证多个集群的任务状态同步,这部分由集群的调度服务负责;

为了真实有效的模拟 , 可以采用 流量录制然后重放的方式, 来模拟真实用户,

如果有写的操作, 可以考虑用影子表或影子库来隔离用户数据

如果涉及到状态信息(例如登录token), 在发送流量时, 通过改写token参数,比如不会失效的压测token; 生成一个有效的用户token

1.1.3 压力模型设置

压力模型负责描述海量虚拟用户如何给系统制造请求压力

  1. 系统压力值两个概念

并发用户数:同时使用系统的用户数量,从用户侧视角描述系统压力值;,(适用于真实用户场景)

系统吞吐量(RPS):系统每秒处理的请求数,从系统侧视角描述系统压力值;(适用于系统组件等场景)

  1. 压力模型

梯度发压模型:按照设定的虚拟用户数(U)进行发压,可设置用户量梯度上升规则,防止压力突增过高影响系统稳定性;

RPS模型:设置系统吞吐量,通过控制每个用户RPS来达到设定的压测吞吐量目标;

1.1.4 压测场景构建

多种压测编写模式:支持简单低代码模式、脚本语法模式、JMeter原生模式及GoPlugin等多种压测方式。

多场景混压:支持多场景并发压测,通过权重调节发压负载等

多协议支持:http,grpc,tars/taf,websocket等

复杂用例编排:支持复杂场景串联、可通过iffo等语句进行编排场景,高度自定义。

多地域发压:支持北京、广州、深圳、南京等多地发压。

SLA熔断:智能SLA熔断,避免被压服务出现问题时依旧进行大量请求。

流量转压测:录制流量一键转换。

  • 根据流量自动构造大量请求数据
  • 提升压测数据多样性保证压测数据实时性

作为一个压测平台应当具备以上能力

1.1.5 性能指标采集分析

指标分析通常包括压测过程中SLA监控 & 压测完成后问题分析

  • 压测过程中SLA监控:保障压测过程中不会影响系统稳定性;

  • 压测后问题分析:通过错误率、时延等指标分析提升系统稳定性;全链路压测不仅包含发压端数据,也包括被压服务端数据;

    服务拓扑扩散比: 当是微服务的场景下, 每个服务会受到的压力会随着服务的增多而增多, 特别是底层服务, 那在真实流量中, 每个服务的扩散值是多少呢? 这对我们知晓服务瓶颈, 预算服务节点数量有很高的价值

2. 全链路压测介绍

全链路压测是在正式环境模拟真实流量量级的场景化压测,目标是发现系统瓶颈以及容量评估规划

  1. 真实的流量场景
    • 量级、场景、特征尽可能模拟真实流量
  2. 真实的环境
    • 在线上真实环境进行压测
  3. 提前进行
    • 模拟活动提前实战演练,提前发现问题
  4. 常态化
    • 周期性的小批量性能验证和问题定位

怎么不影响生产流量呢?

  1. 流量隔离
    • 流量可标识, 可透传
  2. 数据隔离
    • 中间件读写隔离
    • 过程产生数据的数据隔离
  3. 业务逻辑隔离
    • 压测逻辑和正式逻辑隔离开
  4. 资源隔离
    • 独立划分CPU, 内存等等

在生产环境,一般只会做前两种, 后两种成本较大, 且会一定程度上影响压测效果

2.1 业界实现对比

公司方案描述特点
阿里终端/后台流量录制+自动清洗
流量打标+影子表隔离
统一的RPC框架和中间件支持
数据完全隔离,服务资源复用
Java技术栈,统一中间件支持,无业务侵入
输出阿里云压测产品PTS
头条终端/后台流量录制+自动清洗
流量打标+影子表隔离
不合规框架服务改造
数据完全隔离,服务资源复用
多技术栈(go、python、java),有改造成本
统一的中间件体系支持
MegaEaseSpringCloud服务网格;ShadowService机制Service复制+中间件镜像+金丝雀规则
最高隔离级别
JavaAgent,,无侵入设计
对于复杂业务复制环境代价较大