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

如何用JMeter实现多用户并行SFTP上传(分配线程)

多用户线程分配的可行方案

以下是几种实现多用户按比例分配线程并发执行的方案:

方案1:CSV数据集配置固定分配用户

  • 准备用户信息CSV文件,每行存储一个用户的账号、密码、SFTP主机、远程目录,格式示例:
    user1,pass1,sftp-host-1,/upload-dir-1
    user2,pass2,sftp-host-2,/upload-dir-2
    user3,pass3,sftp-host-3,/upload-dir-3
    user4,pass4,sftp-host-4,/upload-dir-4
    user5,pass5,sftp-host-5,/upload-dir-5
    
  • 添加CSV Data Set Config元件,配置:
    • 文件名:指向上述CSV文件路径
    • 变量名:username,password,sftpHost,remoteDir
    • 分隔符:逗号
    • 循环控制:选择Allocate thread-wise,确保每个线程固定绑定一个用户。10个线程对应5个用户时,每个用户会被分配2个线程
  • 修改JSR223 Sampler代码,替换硬编码的用户信息为变量引用:
    import com.jcraft.jsch.*;
    import java.io.*;
    
    class Monitor implements SftpProgressMonitor{
        private SampleResult result;
        public Monitor(SampleResult result) {
            this.result = result;
        }
        @Override
        public void init(int op, String src, String dest, long max) {}
        @Override
        public boolean count(long count) { return true; }
        @Override
        public void end() {}
    }
    
    def jsch = new JSch()
    def session = jsch.getSession(vars.get("username"), vars.get("sftpHost"), 22)
    session.setPassword(vars.get("password"))
    session.setConfig("StrictHostKeyChecking", "no") // 测试环境临时禁用,生产建议配置known_hosts
    session.connect()
    
    def channel = session.openChannel("sftp")
    channel.connect()
    def channelSftp = (ChannelSftp)channel
    channelSftp.cd(vars.get("remoteDir"))
    
    def f1 = new File("Test.txt")
    channelSftp.put(new FileInputStream(f1), f1.getName() + Math.random(), new Monitor(SampleResult))
    
    channel.disconnect()
    session.disconnect()
    

方案2:Ultimate Thread Group分组配置

  • 在Ultimate Thread Group中添加5个「Thread Group Row」,每个Row配置:
    • 线程数:2
    • 启动延迟:600秒
    • 持续时间:1800秒
  • 给每个Row添加User Defined Variables元件,单独设置该组对应的用户信息(username、password、sftpHost等)
  • 每个Row对应一个用户的2个并发线程,5组合计10个线程,实现用户级别的并行控制

方案3:JSR223前置处理器动态分配用户

  • 添加JSR223前置处理器,通过线程号取模逻辑分配用户:
    // 定义所有用户信息
    def users = [
        ["user1", "pass1", "sftp-host-1", "/upload-dir-1"],
        ["user2", "pass2", "sftp-host-2", "/upload-dir-2"],
        ["user3", "pass3", "sftp-host-3", "/upload-dir-3"],
        ["user4", "pass4", "sftp-host-4", "/upload-dir-4"],
        ["user5", "pass5", "sftp-host-5", "/upload-dir-5"]
    ]
    // 按线程号取模,分配对应用户
    def threadNum = ctx.getThreadNum()
    def userIndex = threadNum % users.size()
    def selectedUser = users[userIndex]
    
    vars.put("username", selectedUser[0])
    vars.put("password", selectedUser[1])
    vars.put("sftpHost", selectedUser[2])
    vars.put("remoteDir", selectedUser[3])
    
  • 在JSR223 Sampler中直接引用上述变量即可,10个线程会自动按每个用户2个线程的比例分配任务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:16:28