如何用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
相关产品推荐
相关产品推荐

