首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java FTP客户端的传输速率会有如此大的差异

为什么Java FTP客户端的传输速率会有如此大的差异
EN

Stack Overflow用户
提问于 2013-01-18 00:08:40
回答 4查看 1.6K关注 0票数 5

也许有人能回答我这个问题。在我最近的工作中,我注意到我的应用程序(通过FTP下载更新)在Linux上使用时非常慢。我是在Mac上开发这些东西的,所以我之前没有注意到这个问题,因为在Mac OS下下载速度并不是很慢。但是,当迁移到Linux时,应用程序的行为就完全不同了。

FTP服务器(在Ubuntu服务器上运行的纯FTP )连接到与客户端相同的LAN,因此不考虑网速问题。由于性能较低,我将Apache FTPClient改为edtFTPj/Free。这些差异仍然显着,但可以接受。作为测试用例,我总是下载相同的文件,其大小约为30MB。然后,我检查了ftp服务器日志,以了解传输速率。

你自己看吧。上面提到的VMWare可以在Mac上运行。除非另有说明,否则Java是Oracle Java 1.7。

Apache Commons Net 2.3

代码如下所示

代码语言:javascript
复制
  FTPClient ftp = new FTPClient();
  ftp.connect("srv0006");
  ftp.login("anonymous", "asd");
  ftp.setFileType(FTP.BINARY_FILE_TYPE);
  File target = new File("/tmp/pub.tar");
  FileOutputStream fos = new FileOutputStream(target);
  ftp.retrieveFile("/pub.tar", fos);
  fos.close();

以下是ftp日志的结果

Mac OS从IntelliJ Idea开始

代码语言:javascript
复制
downloaded  (30452736 bytes, 21200.67KB/sec)

Mac OS从shell启动

代码语言:javascript
复制
downloaded  (30452736 bytes, 21471.75KB/sec)

Windows 7(在VMWare中)

代码语言:javascript
复制
downloaded  (30452736 bytes, 65243.15KB/sec)

运行Oracle Java的OpenSuse (在VMWare中)

代码语言:javascript
复制
downloaded  (30452736 bytes, 5274.56KB/sec)

运行OpenJDK的OpenSuse (在VMWare中)

代码语言:javascript
复制
downloaded  (30452736 bytes, 7663.68KB/sec)

Ubuntu 12.04.1 LTS

在通过千兆以太网连接到同一LAN的另一台PC上运行。其他Ubuntu机器的行为也完全一样。我在20分钟后退出了转接。请参阅传输速率。

代码语言:javascript
复制
downloaded  (7077888 bytes, 6.10KB/sec)

edtFTP4j 2.4.0

在这之后,我搬到了edtFTP4j。结果要好得多。

代码语言:javascript
复制
  FileTransferClient ftp = new FileTransferClient();
  ftp.setRemoteHost("srv0006");
  ftp.setUserName("anonymous");
  ftp.setPassword("asd");
  ftp.connect();
  ftp.downloadFile("/tmp/pub.tar", "/pub.tar");
  ftp.disconnect();

结果发生了显著的变化:

Mac OS从IntelliJ Idea开始

代码语言:javascript
复制
downloaded  (30452736 bytes, 109431.60KB/sec)

Mac OS从shell启动

代码语言:javascript
复制
downloaded  (30452736 bytes, 110333.66KB/sec)

Windows 7(在VMWare中)

代码语言:javascript
复制
downloaded  (30452736 bytes, 91318.64KB/sec)

运行Oracle Java的OpenSuse (在VMWare中)

代码语言:javascript
复制
downloaded  (30452736 bytes, 89312.46KB/sec)

运行OpenJDK的OpenSuse (在VMWare中)

代码语言:javascript
复制
downloaded  (30452736 bytes, 89041.05KB/sec)

Ubuntu12.10(VMWare版)

代码语言:javascript
复制
downloaded  (30452736 bytes, 81154.99KB/sec)

运行在i5笔记本、Wifi上的Ubuntu 12.04.1 LTS (50Mbit/s)

代码语言:javascript
复制
downloaded  (30452736 bytes, 2883.84KB/sec)

运行在i5笔记本、千兆以太网上的Ubuntu 12.04.1 LTS

代码语言:javascript
复制
downloaded  (30452736 bytes, 93822.44KB/sec)

Ubuntu 12.04.1 LTS

在前面提到的PC上运行(传输速率为6.10KB/秒的PC)

代码语言:javascript
复制
downloaded  (30452736 bytes, 11633.38KB/sec)

我不明白这个。谁知道这是怎么回事?

再见托斯腾。

EN

回答 4

Stack Overflow用户

发布于 2013-01-18 01:59:13

从一些代码中找出它的原因太多了。

它可以是您的默认网络数据包大小(MTU)、硬件基础架构、JVM、OS配置等的任何内容。

你需要在更高的水平上玩很多小东西。比如在硬件/操作系统级别检查MTU大小,并将其与API套接字创建的默认设置相对应。您的基础架构是否具有缓冲或窗口缩放功能,或者执行自动病毒检查。

我相信Net Commons缓冲区大小默认为1024,你可以尝试一下。

除此之外,您还需要进入嗅探器,看看发生了什么。可能是交换机配置不正确,使用其中一种API比使用另一种更好。

我希望我能给你一个更好的答案,但当谈到网络性能时,它本身就是一个研究领域……

票数 1
EN

Stack Overflow用户

发布于 2013-01-18 02:19:27

这里的一个罪魁祸首是不同平台上的套接字发送和接收缓冲区大小。在Windows上,这些值被设置为8k,低得离谱,这极大地限制了TCP吞吐量。一些windows服务器版本将这些设置为巨大的值;不要问我是哪一个。Unix和Linux平台的值在43-48k之间。

票数 0
EN

Stack Overflow用户

发布于 2013-01-18 02:55:56

在许多系统上,FTP的被动和主动模式之间也会有很大的区别;特别是当服务器只接受一种模式,而客户端默认情况下试图使用另一种模式时。如果我没记错的话,主动模式比被动模式稍微快一点,但是使用禁止模式可以很容易地减慢传输速度一百倍或一千倍;如果不是这样,那就是简单地阻止传输。

即使这两种模式都被允许,防火墙经常会降低被动模式的速度,而不影响主动模式(或者是相反的模式?)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14383243

复制
相关文章

相似问题

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