首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用nfs-客户端包上载/下载文件,在n次迭代后无法工作。

使用nfs-客户端包上载/下载文件,在n次迭代后无法工作。
EN

Stack Overflow用户
提问于 2021-03-15 16:33:56
回答 1查看 571关注 0票数 0

我正在使用NFS -客户机包来实现NFS协议,以连接到linux服务器进行文件上传/下载。基本目的是NFS协议测试。

这是我的样本代码库

代码语言:javascript
复制
import com.emc.ecs.nfsclient.nfs.io.Nfs3File;
import com.emc.ecs.nfsclient.nfs.io.NfsFileInputStream;
import com.emc.ecs.nfsclient.nfs.io.NfsFileOutputStream;
import com.emc.ecs.nfsclient.nfs.nfs3.Nfs3;
import com.emc.ecs.nfsclient.rpc.CredentialUnix;
int thread_count = ctx.getThreadNum();
String lrandom_name = service_name + "_" + replica_id + "_" + thread_count;

public static void uploadFileToNfs() {
        String localDir = "F:\\look\\"+lrandom_name;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            //Create a local file object
            File localFile = new File(localDir);
            //Get the file name of the local file, this name is used to create a file with the same name in the specified directory on the remote Nfs server
            String localFileName = localFile.getName();
            Nfs3 nfs3 = new Nfs3(NFS_IP, NFS_DIR, new CredentialUnix(0, 0, null), 3);
            //Create Nfs file object on remote server
            Nfs3File NfsFile = new Nfs3File(nfs3, "/" + localFileName);
            //Open a file input stream
            inputStream = new BufferedInputStream(new FileInputStream(localFile));
            //Open a remote Nfs file output stream and copy the file to the destination
            outputStream = new BufferedOutputStream(new NfsFileOutputStream(NfsFile));

            //Buffer memory
            byte[] buffer = new byte[1024];
            while ((inputStream.read(buffer)) != -1) {
                outputStream.write(buffer);
            }
            System.out.println("File upload complete!");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

我是从the运行脚本的,但是经过n次迭代(线程方式),我得到了以下错误。从NFS下载文件的类似脚本在线程方式上运行良好。

代码语言:javascript
复制
com.emc.ecs.nfsclient.nfs.NfsException: rpc error, server: 192.168.0.101, RPC error: RPC call is ACCEPTED, but the status is not success, acceptStat=4
        at com.emc.ecs.nfsclient.rpc.RpcWrapper.handleRpcException(RpcWrapper.java:311)
        at com.emc.ecs.nfsclient.rpc.RpcWrapper.callRpcWrapped(RpcWrapper.java:159)
        at com.emc.ecs.nfsclient.nfs.nfs3.Nfs3.wrapped_sendWrite(Nfs3.java:756)
        at com.emc.ecs.nfsclient.nfs.nfs3.Nfs3.wrapped_sendWrite(Nfs3.java:90)
        at com.emc.ecs.nfsclient.nfs.io.NfsFileBase.write(NfsFileBase.java:866)
        at com.emc.ecs.nfsclient.nfs.io.NfsFileOutputStream.writeBufferToFile(NfsFileOutputStream.java:296)
        at com.emc.ecs.nfsclient.nfs.io.NfsFileOutputStream.write(NfsFileOutputStream.java:262)
        at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
        at java.base/java.io.BufferedOutputStream.write(BufferedOutputStream.java:127)
        at java.base/java.io.FilterOutputStream.write(FilterOutputStream.java:108)
        at java_io_FilterOutputStream$write.call(Unknown Source)
        at com.emc.ecs.nfsclient.nfs.io.Script1.run(Script1.groovy:77)
        at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:317)
        at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:71)
        at java.scripting/javax.script.CompiledScript.eval(CompiledScript.java:89)
        at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:217)
        at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:72)
        at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:635)
        at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558)
        at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489)
        at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)
        at java.base/java.lang.Thread.run(Thread.java:834)

基于反馈的更新,而不是一个用于所有线程(用户)的静态文件,现在我已经为每个线程(用户)提供了唯一的文件来上传/下载

更新

尝试在下面的另一个用例中随机地从一个NFS共享文件夹中挑选文件到另一个,同样的问题即将来临。仅怀疑NFS配置有问题

代码语言:javascript
复制
package com.emc.ecs.nfsclient.nfs.io;

import org.junit.Test;
import com.emc.ecs.nfsclient.nfs.NfsSetAttributes;
import com.emc.ecs.nfsclient.nfs.io.Nfs3File;
import com.emc.ecs.nfsclient.nfs.io.NfsFileInputStream;
import com.emc.ecs.nfsclient.nfs.io.NfsFileOutputStream;
import com.emc.ecs.nfsclient.nfs.nfs3.Nfs3;
import com.emc.ecs.nfsclient.rpc.CredentialUnix;
import java.util.Random;


import java.io.IOException;

import org.junit.Test;
String nfs_folder = vars.get("nfs_folder");
String files_folder = vars.get("files_folder");
String NFS_IP = vars.get("server_ip");
String NFS_DIR = "/"+nfs_folder+"/"+files_folder;
String NFS_DIR_ROOT = "/"+nfs_folder;

int thread_count = ctx.getThreadNum();
String service_name = vars.get("Service_Name");
String replica_id = vars.get("Replica_ID");
String lrandom_name = service_name + "_" + replica_id + "_" + thread_count;
int transfer_size = Integer.parseInt(vars.get("transfer_size"))


InputStream inputStream = null;
OutputStream outputStream = null;
try {
  Nfs3 nfs3 = new Nfs3(NFS_IP, NFS_DIR, new CredentialUnix(0, 0, null), 3);
  Nfs3 nfs4 = new Nfs3(NFS_IP, NFS_DIR_ROOT, new CredentialUnix(0, 0, null), 3);
  
  nfsFiles = new Nfs3File(nfs3,"/");
  List<String> children = nfsFiles.list();
  Random randomGenerator = new Random();
  int fileIndex = randomGenerator.nextInt(children.size());
   OUT.println(fileIndex)
  String NfsFileDir = "/"+children.get(fileIndex);
  OUT.println(children.size())
  OUT.println(children.get(fileIndex))
  //Create Nfs file object on remote server
  Nfs3File nfsFile = new Nfs3File(nfs3, NfsFileDir);
  Nfs3File NfsFile = new Nfs3File(nfs4, "/" + lrandom_name);
  //String localFileName = localDir + lrandom_name;
  //Create a local file object
  //File localFile = new File(localFileName);
  //Open a file input stream
  inputStream = new BufferedInputStream(new NfsFileInputStream(nfsFile));
  //Open a remote Nfs file output stream and copy the file to the destination
  outputStream = new BufferedOutputStream(new NfsFileOutputStream(NfsFile));

  //Buffer memory
  byte[] buffer = new byte[transfer_size];

  while (inputStream.read(buffer) != -1) {
      outputStream.write(buffer);
  }
  System.out.println("File copy complete!");
} catch (IOException ex) {
  ex.printStackTrace();
} finally {
  try {
      if (outputStream != null) {
          outputStream.close();
      }
      if (inputStream != null) {
          inputStream.close();
      }
  } catch (Exception e) {
      e.printStackTrace();
  }
}
EN

回答 1

Stack Overflow用户

发布于 2021-03-16 07:26:43

  1. 我不认为您的用例是有效的,因为将同一个文件上传到同一个目标并不是真正的NFS用户要做的事情,所以可能值得考虑使用目录清单Config插件,以便每个虚拟用户都有自己的文件来上传/下载。
  2. 看看NFS RPC RFC,你得到的状态是: GARBAGE_ARGS = 4,/*过程不能解码params */ 因此,再次检查您的JMeter实例是否有足够的空间在JVM设置、CPU、RAM等方面操作,因为看起来您的NFS服务器无法正确解析请求,因此可能是JMeter发送一些垃圾的情况。确保遵循JMeter最佳实践
  3. 基本上与第2点相同,但对于NFS服务器端,可能会出现重载,因此无法正确解析传入的有效请求,检查NFS日志和操作系统日志中是否有任何可疑条目。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66641968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档