2.2 执行模型与线程调度


2.2 执行模型与线程调度

本节摘要:线程数、Ramp-up、循环次数这三个参数决定压测怎么跑。本节讲线程调度模型,帮你配出贴近真实场景的负载。

核心问题

阅读完本节,你应当能够:

  1. 理解线程数、Ramp-up、循环的配合
  2. 区分吞吐量定时器和并发用户模型
  3. 避免调度配置的常见坑

概念脉络

一、三个核心参数

  • 线程数(num_threads):模拟的并发用户数
  • Ramp-up(ramp_time):启动所有线程用的秒数
  • 循环次数(loops):每个线程重复执行的次数

例:100 线程、Ramp-up 10 秒、循环 1 次 → 10 秒内每秒启动 10 个线程,每个线程跑 1 轮。

图 2-2 线程调度模型

图 2-2 线程调度模型

二、Ramp-up 的意义

Ramp-up 让线程分批启动,避免瞬间全启动把服务打挂(不是真实场景)。设 0 表示瞬间全启动,只在测"瞬间冲击"时用。

Ramp-up 设多长看场景:

  • 测平稳负载:Ramp-up 设长一点(如 60 秒),逐步加压
  • 测瞬间冲击:Ramp-up 设短或 0
  • 一般经验:每秒启动 5-10 个线程比较平滑

三、循环次数和持续时间

  • 循环次数固定:每个线程跑 L 次后结束,总时长取决于每次耗时
  • 勾选"永远":持续循环,靠调度器(Scheduler)控制持续时间
  • 调度器:设开始时间和持续时间,到点自动停
<ThreadGroup> <boolProp name="ThreadGroup.scheduler">true</boolProp> <stringProp name="ThreadGroup.duration">300</stringProp> <!-- 持续 300 秒 --> </ThreadGroup>

四、并发用户 vs 吞吐量

两种负载模型:

  • 并发用户模型:固定线程数模拟并发用户,靠定时器控制请求间隔
  • 吞吐量模型:用吞吐量定时器(Constant Throughput Timer)固定 TPS,线程数自动调整

测"系统能扛多少并发"用并发模型;测"固定 TPS 下响应如何"用吞吐量模型。

五、常见坑

  • Ramp-up 设 0:瞬间全启动,不真实且可能打挂服务
  • 线程数设太高:超过单机 JVM 承受,JMeter 自己先崩,结果不准
  • 循环次数设 1:只跑一轮,没到稳态就结束,测不到稳态性能

⚠️ 常见坑:线程数设几千单机就 OOM——JMeter 每线程占内存,单机一般几百到一两千,再高用分布式。

💡 关键直觉:线程数=并发用户,Ramp-up=分批启动时间(不是等待),循环/持续时间控制跑多久。单机线程数别超 JVM 承受,再高用分布式。

本章回顾

  • 三参数:线程数(用户)、Ramp-up(启动秒数)、循环次数(每线程轮数)。
  • Ramp-up:分批启动避免瞬间冲击,每秒 5-10 个较平滑,设 0 只在测瞬间冲击。
  • 持续时间:循环次数固定或勾"永远"+调度器控制时长。
  • 负载模型:并发用户模型(固定线程)vs 吞吐量模型(固定 TPS)。
  • 单机上限:每线程占内存,单机几百到一两千,再高用分布式。

下一节讲结果怎么采集和生成。

执行模型详解

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 时,内存占用线性增长,这也是为什么超大并发需要分布式——单机内存与线程调度开销是硬上限。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U