在性能测试领域,并发数设置是评估系统承载能力的关键指标。作为从业十余年的测试工程师,我见过太多因为并发设置不当导致的测试结果失真案例。正确的并发数设置就像给系统做"压力体检",需要精准控制"负荷强度"才能得到真实的性能数据。
并发数(Concurrency)严格定义为:单位时间内系统同时处理的活跃事务数量。注意区分它与TPS(每秒事务数)的区别:100个并发用户可能产生500 TPS,这取决于系统响应速度。在JMeter中,我们通过线程组(Thread Group)来模拟这个并发场景。
重要提示:并发用户≠在线用户。10000人在线可能只有500人真正并发操作,这个比例需要通过业务监控数据来确定。
以电商系统为例,我们需要分析以下核心数据:
计算公式:
code复制测试并发数 = 历史峰值QPS × (1 + 增长预期) × 安全系数(建议1.2-1.5)
假设历史峰值1200QPS,预期增长40%,取安全系数1.3:
code复制1200 × 1.4 × 1.3 = 2184 并发
推荐采用如下测试策略:
典型用户场景分类:
建议为不同场景建立独立的线程组,例如:
java复制Thread Group 1: 商品浏览(60%并发)
Thread Group 2: 购物车操作(30%并发)
Thread Group 3: 支付流程(10%并发)
现代分布式系统需要考虑:
推荐使用Ultimate Thread Group插件实现更灵活的并发控制:
code复制Start Threads Count: 初始并发数(建议50)
Initial Delay: 延迟启动时间(秒)
Hold Load For: 持续时间(至少300秒)
Threads Count: 最大并发数
Ramp-Up Period计算:
code复制合理值 = 总线程数 / (目标TPS × 平均响应时间)
例如目标1000TPS,平均响应200ms,10000线程:
code复制10000 / (1000×0.2) = 50秒
循环次数设置:
超时控制:
xml复制<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments"/>
<stringProp name="HTTPSampler.connect_timeout">5000</stringProp>
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
</ConfigTestElement>
当单机无法模拟高并发时:
bash复制jmeter-server -Djava.rmi.server.hostname=192.168.1.10
properties复制remote_hosts=192.168.1.11,192.168.1.12
client.rmi.localport=60000
server.rmi.ssl.disable=true
bash复制top -H -p `pgrep -f jmeter` -d 1
| 指标类别 | 监控工具 | 预警阈值 | 优化方向 |
|---|---|---|---|
| 系统资源 | Grafana+Prometheus | CPU>75%持续5分钟 | 扩容/代码优化 |
| JVM性能 | JConsole | GC时间>1秒/次 | 堆内存调整 |
| 数据库 | Slow Query Log | 查询>500ms | 索引优化 |
| 网络吞吐 | iftop | 带宽利用率>80% | CDN/压缩 |
案例1:数据库连接池耗尽
现象:并发800时出现"Timeout getting connection"
解决:
java复制// 优化Druid配置
spring.datasource.druid.max-active=200
spring.datasource.druid.initial-size=50
spring.datasource.druid.validation-query=SELECT 1
案例2:Redis响应延迟
优化方案:
案例3:线程阻塞
JStack分析示例:
code复制"http-nio-8080-exec-5" #20 daemon prio=5 os_prio=0 tid=0x00007f48740f8000 nid=0x1e03 waiting for monitor entry [0x00007f486b7e6000]
java.lang.Thread.State: BLOCKED (on object monitor)
预热策略:正式测试前先运行20%并发5分钟(特别是JIT编译型语言)
思考时间(Think Time)设置:
json复制{
"type": "UniformRandomTimer",
"range": 3000,
"delay": 1000
}
参数化技巧:
断言优化:避免使用响应大小断言,推荐:
xpath复制//result/code[text()='200']
测试数据隔离:使用__time()函数生成唯一数据
sql复制INSERT INTO orders VALUES('order_${__time(,)}',...)
在金融行业某核心系统测试中,我们通过梯度增加并发数(每次+200),配合APM工具实时监控,最终发现当并发达到1800时,某个微服务的数据库连接出现雪崩效应。这个值远低于硬件理论承载能力,后经排查是连接泄漏问题。这印证了并发测试不仅要关注数字,更要理解数字背后的系统行为。