本节摘要:线程数、Ramp-up、循环次数这三个参数决定压测怎么跑。本节讲线程调度模型,帮你配出贴近真实场景的负载。
阅读完本节,你应当能够:
例:100 线程、Ramp-up 10 秒、循环 1 次 → 10 秒内每秒启动 10 个线程,每个线程跑 1 轮。

Ramp-up 让线程分批启动,避免瞬间全启动把服务打挂(不是真实场景)。设 0 表示瞬间全启动,只在测"瞬间冲击"时用。
Ramp-up 设多长看场景:
<ThreadGroup> <boolProp name="ThreadGroup.scheduler">true</boolProp> <stringProp name="ThreadGroup.duration">300</stringProp> <!-- 持续 300 秒 --> </ThreadGroup>
两种负载模型:
测"系统能扛多少并发"用并发模型;测"固定 TPS 下响应如何"用吞吐量模型。
⚠️ 常见坑:线程数设几千单机就 OOM——JMeter 每线程占内存,单机一般几百到一两千,再高用分布式。
💡 关键直觉:线程数=并发用户,Ramp-up=分批启动时间(不是等待),循环/持续时间控制跑多久。单机线程数别超 JVM 承受,再高用分布式。
下一节讲结果怎么采集和生成。
JMeter 的执行模型基于 Java 线程:线程组中的每个虚拟用户是一个 Java 线程,按 ramp-up 时间逐步启动。调度参数:线程数(Number of Threads)、启动时间(Ramp-Up Period)、循环次数(Loop Count)。调度器(Scheduler)可设置持续时间与启动延迟,适合稳定性测试的定时启停。
| 参数 | 取值 | 说明 |
|---|---|---|
| 线程数 | 100 | 虚拟用户数 |
| Ramp-Up | 60 秒 | 60 秒内全部启动 |
| 循环次数 | 100 | 每线程执行次数 |
| 持续时间 | 1 小时 | 配合调度器使用 |
线程调度性能受三方面影响:CPU(采样器计算与响应解析)、内存(线程栈与结果缓存)、连接数(目标服务器与压测机两侧)。建议压测机 CPU 使用率不超过 70%,否则结果失真;结果缓存过大时启用结果流式写入(streaming results)避免内存溢出。
一个典型的阶梯加压场景:目标验证系统在 100/200/400 并发下的表现。可用三个线程组分别设 100/200/400 线程、Ramp-Up 均为 60 秒、错开启动时间,或使用 Custom Thread Groups 插件的阶梯模型实现单线程组递增。执行后对比三组结果的响应时间与吞吐量,观察拐点位置,即可判断系统容量边界。
调度器(Scheduler)用于定时控制:设置持续时间(如 1 小时)后,线程按配置并发执行直至时间到,适合稳定性测试与夜间自动化任务;设置启动延迟可让脚本在指定时间开始。注意调度器与循环次数的关系:指定了持续时间时循环次数设置将失效,执行以时长为准。
线程调度中的常见误区:把线程数直接等同于并发数(实际并发取决于 ramp-up 期间已启动线程数);忽略线程组间的执行顺序(JMeter 默认按线程组顺序启动,可调整独立运行开关实现并行);忘记调度器与循环的互斥关系。理解这些细节能避免测试设计与预期不符。
每个线程持有独立的对象:变量副本、cookie 管理器实例、连接池条目。线程数从 100 升到 1000 时,内存占用线性增长,这也是为什么超大并发需要分布式——单机内存与线程调度开销是硬上限。