4. 用户模型设计:并发用户数估算、思考时间设置、用户行为比例分配、用户分布模型
用户模型是压力测试的“虚拟用户剧本”。它定义了测试工具如何模拟真实用户的行为特征,包括并发用户数、思考时间、行为比例和分布模型。一个失真的用户模型会导致测试结果与生产表现严重偏离。
4.1 并发用户数估算
并发用户数并非系统注册用户数或日活跃用户数,而是在同一时间窗口内,与服务器保持交互状态的用户数。常用估算方法如下:
| 估算方法 | 公式 / 核心逻辑 | 适用场景 |
|---|---|---|
| 基于TPS与响应时间 | 并发数 = TPS × 平均响应时间(秒) | 已知目标吞吐量,反推并发 |
| 基于在线用户与活跃率 | 并发数 = 在线用户数 × 活跃率(通常 5%–15%) | 运营数据较全的存量系统 |
| 基于业务高峰日志 | 取过去 30 天峰值时段活跃 Session 数 | 已有生产监控,数据驱动 |
| Little's Law 推导 | 并发数 = 到达率 × 平均服务时间 | 排队系统、消息队列场景 |
实践建议: 不要只依赖单一公式。建议用“基于在线用户”估算上限,用“基于TPS”估算基准,取两者交集作为初始并发值,再通过阶梯加压验证。
4.2 思考时间设置
思考时间(Think Time)是用户两次连续操作之间的停顿间隔。没有思考时间的测试会变成“发压机”,导致服务器过载失真。设置策略如下:
- 固定思考时间: 所有虚拟用户使用相同间隔(如 3 秒)。适合基准测试,但缺乏真实性。
- 随机思考时间: 在 [min, max] 区间内均匀或正态分布取值。更贴近真实用户行为。
- 基于日志的思考时间: 从生产日志提取真实操作间隔分布,直接回放。最准确,但数据获取成本高。
- 零思考时间(Pacing 模式): 不等待,连续发请求。用于测试系统极限吞吐,不作为常规模型。
常见误区: 思考时间设置过短(< 1 秒)会导致 CPU 空转在上下文切换上;设置过长(> 30 秒)则无法压出真实瓶颈。建议初始值设为 2–5 秒,根据目标 TPS 动态调整。
4.3 用户行为比例分配
一个业务系统通常包含多种操作(登录、浏览、下单、支付等)。压力测试必须按真实流量占比分配虚拟用户的行为。分配流程如下:
- 采集生产日志,统计各接口/业务的调用次数占比。
- 剔除爬虫与监控探针,保留真实用户流量。
- 归一化比例,确保总和为 100%。
- 映射到测试脚本,通过权重或概率分支控制虚拟用户行为。
示例比例分配表(电商场景):
| 业务操作 | 生产占比 | 测试权重 | 说明 |
|---|---|---|---|
| 商品浏览 | 55% | 55 | 高频读操作 |
| 搜索 | 20% | 20 | 带参数查询 |
| 加入购物车 | 12% | 12 | 写操作,涉及库存 |
| 提交订单 | 8% | 8 | 核心事务,高负载 |
| 支付 | 5% | 5 | 第三方接口依赖 |
4.4 用户分布模型
用户分布模型定义了虚拟用户何时启动、何时退出、如何分组。常见模型如下:
- 阶梯模型: 每隔一段时间增加一批用户,直到目标并发。适合寻找系统拐点。
- 突发模型: 瞬间加载全部用户,模拟秒杀、抢购场景。
- 潮汐模型: 用户数随时间呈正弦曲线变化,模拟早晚高峰。
- 稳态模型: 用户数恒定,持续运行较长时间,用于稳定性测试。
下图展示了四种用户分布模型的加载曲线对比:
4.5 用户模型设计完整流程
将上述四个要素整合为可执行的用户模型,推荐以下步骤:
- 确定目标并发数(基于 TPS 或在线用户估算)。
- 设定思考时间分布(从生产日志提取或按经验设定随机区间)。
- 分配行为比例(按接口调用占比映射到脚本权重)。
- 选择分布模型(阶梯/突发/潮汐/稳态)。
- 编写测试脚本,嵌入思考时间与行为分支逻辑。
- 执行小规模验证,检查 TPS 与响应时间是否符合预期。
- 调整参数,迭代至模型稳定。
关键检查点: 验证阶段务必对比“测试模型产生的 TPS 分布”与“生产 TPS 分布”的相似度。若偏差超过 20%,需重新校准思考时间或行为比例。
下图展示了用户模型从数据采集到脚本落地的完整链路:
4.6 常见陷阱与避坑指南
| 陷阱 | 表现 | 解决方案 |
|---|---|---|
| 思考时间固定不变 | 测试曲线过于平滑,无法暴露突发瓶颈 | 使用正态分布或指数分布模拟真实间隔 |
| 行为比例照搬日志未归一化 | 某些操作权重过高,压垮非核心接口 | 剔除爬虫、归一化、按业务模块分层分配 |
| 并发数估算忽略响应时间变化 | 加压后实际并发远低于预期 | 使用 Little's Law 动态校准 |
| 分布模型与业务场景不匹配 | 测试结果无法解释生产故障 | 根据业务特征选择模型,必要时组合使用 |
最佳实践: 每次迭代保留用户模型参数快照(并发数、思考时间分布、比例权重、模型类型),便于回归对比和问题溯源。