You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter多线程压测生成重复连续ID问题排查求助

问题诊断

你的ReentrantLock无法阻止多线程重复生成ID,核心原因是每个JMeter线程都会创建独立的ReentrantLock实例——不同线程持有的锁对象不是同一个,锁只在当前线程内有效,完全无法约束其他线程同时读写文件,导致多个线程读取到同一个初始ID值,递增后自然重复。

解决方案

方案1:使用JMeter原生Counter元件(推荐)

完全无需自己实现锁逻辑,JMeter内置的Counter元件天生支持全局线程安全的递增:

  • 添加「配置元件 → Counter」
  • 配置参数:
    • 起始值:90000001(对应你初始文件值90000000的下一个ID)
    • 递增:1
    • 最大值:90048000(对应48000条记录的最终ID)
    • 引用名称:currentDni
    • 取消勾选「每个用户独立的计数器?」(确保全局唯一递增)
  • 在请求中直接生成目标ID:用${__concat(16,${currentDni},)},或通过简单脚本拼接:vars.put("idNumber", "16" + vars.get("currentDni"));

该方案由JMeter内部处理多线程同步,既可靠又避免了文件IO的性能瓶颈。

方案2:修复BeanShell的全局锁问题

如果必须用文件持久化计数,需要让所有线程共享同一个锁对象,修改前置处理器代码如下:

import java.io.*;
import java.util.concurrent.locks.ReentrantLock;

// 用静态变量实现全局锁,确保所有线程共用同一个锁实例
static ReentrantLock lock;
static {
    lock = new ReentrantLock();
}

File counterFile = new File("/Users/rickersilva/Documents/Zenus2Testing/prelive-counter.txt");
int currentDni;
int nextDni;
String idNumber;

lock.lock();
try {
    // 读取当前ID
    BufferedReader reader = new BufferedReader(new FileReader(counterFile));
    currentDni = Integer.parseInt(reader.readLine().trim());
    reader.close();
    
    // 递增并写入文件(强制刷新避免缓存延迟)
    nextDni = currentDni + 1;
    BufferedWriter writer = new BufferedWriter(new FileWriter(counterFile, false));
    writer.write(Integer.toString(nextDni));
    writer.flush();
    writer.close();
    
    // 设置JMeter变量
    idNumber = "16" + Integer.toString(nextDni);
    vars.put("idNumber", idNumber);
} catch (Exception e) {
    log.error("DEV_LOG: Error processing personDni: " + e);
} finally {
    lock.unlock();
}
  • 通过static关键字将锁对象声明为类级静态变量,确保所有线程共享同一把锁,实现跨线程互斥。
  • 添加writer.flush()确保写入操作立即生效,避免缓存导致的计数延迟。

额外建议

  • 高并发压测中尽量避免用文件作为共享计数器,文件IO本身是性能瓶颈,会拖慢压测效率。
  • 如果需要持久化计数(比如压测中断后续跑),可以在压测结束时将Counter的值写入文件,下次启动前读取初始化。

内容的提问来源于stack exchange,提问作者Ricker Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:27:23