4. 测试执行策略:负载模型、并发模型与数据采集
好,咱们进入第四章。这一章讲的是测试执行策略,说白了就是——你打算怎么压?
很多人拿到工具就开跑,结果跑出来的数据自己都解释不了。我见过太多这样的案例了。其实,测试执行不是瞎跑,它有一套成熟的策略体系。今天我就把这套体系拆开,跟你聊聊。
4.1 负载模型:阶梯、突发与恒定
负载模型,就是你的压力施加方式。三种主流模型,各有各的用处。
4.1.1 恒定负载模型
最简单,也最常用。保持固定并发数,跑一段时间。
- 适用场景:稳定性测试、资源泄漏检测
- 优点:结果稳定,容易对比
- 缺点:找不到拐点
我个人习惯,做长时间稳定性测试时,先用恒定负载跑个基线。比如 100 并发跑 2 小时,看看内存和 CPU 是不是一条直线。如果曲线往上走,那大概率有泄漏。
4.1.2 阶梯负载模型
这是我最喜欢的模型。每过一段时间增加一批用户,像爬楼梯一样。
核心价值:找到系统的性能拐点。
当吞吐量不再随并发数增长而增长,甚至开始下降时,那个点就是系统的极限。
我曾经帮一个电商平台做压测,用阶梯模型从 50 并发起步,每 2 分钟加 50。跑到 350 并发时,TPS 突然从 1200 掉到 800。嗯,这就是典型的拐点——数据库连接池满了。
4.1.3 突发负载模型
模拟瞬间大量用户涌入。比如秒杀、抢票、热点新闻。
- 特点:并发数在几秒内从 0 飙升到峰值
- 关注点:系统能否扛住冲击,会不会雪崩
你想想看,双十一零点那一刻,用户不是慢慢进来的,是瞬间涌进来的。这时候用恒定模型测,根本测不出问题。
| 模型 | 压力曲线 | 主要用途 | 典型时长 |
|---|---|---|---|
| 恒定 | 水平直线 | 稳定性、资源泄漏 | 30min ~ 24h |
| 阶梯 | 逐级上升 | 找拐点、容量规划 | 10min ~ 1h |
| 突发 | 陡峭尖峰 | 抗冲击、弹性伸缩 | 1min ~ 5min |
4.2 并发用户数与线程模型
这里有个常见的误区。很多人以为并发用户数 = 线程数。其实不是。
并发用户数,是业务层面的概念。指的是同时在使用系统的用户数量。而线程数,是工具层面的概念。指的是施压机开了多少个线程去发请求。
注意:不要盲目增加线程数。
线程多了,上下文切换的开销会吃掉 CPU。我见过有人开了 2000 个线程,结果施压机自己先挂了,被测系统反而没事。
我的经验是,一个线程能模拟 10~50 个并发用户,取决于你的思考时间和等待时间。举个例子:
- 用户操作间隔 3 秒(思考时间)
- 服务端响应 200ms
- 一个线程每秒能发约 0.3 个请求
- 要模拟 1000 并发用户,大约需要 30~50 个线程
具体怎么算?我一般用这个公式:
线程数 = 目标并发用户数 / (1 + 思考时间 / 响应时间)
当然,这只是估算。实际跑的时候,我会先跑个小规模测试,看看单线程的吞吐量,再反推需要的线程数。
4.3 预热与冷却期
这两个概念,很多人会忽略。但我觉得,它们跟正式测试一样重要。
4.3.1 预热期(Warm-up)
系统刚启动时,很多组件还没准备好。比如:
- JIT 还没编译热点代码
- 数据库连接池还没填满
- 缓存还没命中
这时候测出来的数据,是偏低的。我习惯在正式测试前,先跑 3~5 分钟的预热负载。让系统进入稳定状态,再开始记录数据。
小技巧:预热期的负载量,可以跟正式测试一样,也可以略低。关键是让系统「热起来」。
4.3.2 冷却期(Cool-down)
测试结束后,不要马上停。留 1~2 分钟观察系统的恢复情况。
- 连接数是否回落
- 内存是否释放
- 队列是否清空
我曾经遇到过一个问题:测试时一切正常,但测试结束后,数据库连接数一直居高不下。后来发现是连接池的回收策略有问题。如果没有冷却期的观察,这个问题根本发现不了。
4.4 数据采集点设置
数据采在哪,决定了你能看到什么。
我一般分三层来采集:
- 施压机层:响应时间、TPS、错误率
- 服务端层:CPU、内存、磁盘 IO、网络
- 中间件层:数据库连接数、队列长度、缓存命中率
这三层的数据要能对应起来。比如施压机看到 TPS 下降,服务端 CPU 却不高,那问题可能出在数据库或网络。
采集频率建议:
- 施压机:每秒采集一次
- 服务端:5~10 秒采集一次
- 数据库:10~30 秒采集一次
频率太高会干扰系统,太低又抓不到瞬时波动。这个平衡点,需要根据测试场景调整。
另外,我习惯在关键路径上埋点。比如登录、下单、支付这些核心接口,单独记录它们的耗时分布。这样定位问题时,能快速缩小范围。
4.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个检查清单,每次做测试前,对照着过一遍。
这张图把四个核心要素串在了一起。你每次设计测试方案时,都可以拿它当模板,逐一确认每个环节有没有遗漏。