ftpClient传输过慢

上一篇中遇到了ftpClient传输速度慢到让我怀疑网卡设置有问题的事情。最终问题定位在ftpClient的设置问题。

版本说明:
在项目中使用了Apache Commons Net (3.3) 包中的FtpClient作为ftp工具。
代码举例:此处引用一段stackoverflow上可以同样说明问题的代码片段:

    public boolean upload(String host, String user, String password, String directory, 
    String sourcePath, String filename) throws IOException{

        FTPClient client = new FTPClient();
        FileInputStream fis = null;
        try {
            client.connect(host);
            client.login(user, password);
            client.setControlKeepAliveTimeout(500);

            logger.info(\"Uploading \" + sourcePath);
            fis = new FileInputStream(sourcePath);        

             //
            // Store file to server
            //
            client.changeWorkingDirectory(directory);
            client.setFileType(FTP.BINARY_FILE_TYPE);
            client.storeFile(filename, fis);
            client.logout();
            return true;
        } catch (IOException e) {
            logger.error( \"Error uploading \" + filename, e );
            throw e;
        } finally {
            try {
                if (fis != null) {
                fis.close();
            }
            client.disconnect();
            } catch (IOException e) {
            logger.error(\"Error!\", e);
            }
        }
    }      

最近需求中,下载文件的数量级由几十M到了几百M,而且对文件处理的及时性也有要求。之前网络并非处理能力的瓶颈,没有及时发现代码问题。在测试中使用linux自带的ftp命令下载时基本可以达到千兆网卡速度。但使用如上的程序时则不行。最终还是在stackoverflow找到了问题根源。
相应的设置类似于:

client.setBufferSize(1024000);

问题原因为FtpClient中坑爹的将buffsize默认为0,stackoverflow上大家讨论时有人提出在测试中0使用了8192 的buff。所以肯定会死慢。此处的设置需要根据服务器的配置、JVM参数设置进行调整。还有人生免费建议:

不要一次性把这个值设置到最优值,如果现在的吞吐量已经勉强可以满足性能需求时。原因你懂的。毕竟有调优的空间。君不见 为了留余地设置sleep。 而且值越大,吃内存越多.平衡就好了。如果需求满足不要浪费太多的时间调整这个。我们的目标是星辰大海。

此处就不再贴出自己的参数设置了。毕竟公司代码。传说更高版本的net包已经修复了此问题,此处未做测试,这个坑会择期填上。

发表评论

电子邮件地址不会被公开。 必填项已用*标注