【问题标题】:Why is there such a big difference in the transfer rates of the Java FTP Clients为什么 Java FTP 客户端的传输速率差异如此之大
【发布时间】:2013-01-01 05:42:27
【问题描述】:

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

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

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

Apache Commons Net 2.3

代码如下所示

  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 开始

downloaded  (30452736 bytes, 21200.67KB/sec)

Mac OS 从 shell 启动

downloaded  (30452736 bytes, 21471.75KB/sec)

Windows 7(在 VMWare 中)

downloaded  (30452736 bytes, 65243.15KB/sec)

OpenSuse 运行 Oracle Java(在 VMWare 中)

downloaded  (30452736 bytes, 5274.56KB/sec)

OpenSuse 运行 OpenJDK(在 VMWare 中)

downloaded  (30452736 bytes, 7663.68KB/sec)

Ubuntu 12.04.1 LTS

在通过千兆以太网连接到同一 LAN 的另一台 PC 上运行。其他 Ubuntu 机器的行为方式完全相同。我在 20 分钟后退出了转移。查看传输速率。

downloaded  (7077888 bytes, 6.10KB/sec)

edtFTP4j 2.4.0

在此之后,我搬到了 edtFTP4j。结果好多了。

  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 开始

downloaded  (30452736 bytes, 109431.60KB/sec)

Mac OS 从 shell 启动

downloaded  (30452736 bytes, 110333.66KB/sec)

Windows 7(在 VMWare 中)

downloaded  (30452736 bytes, 91318.64KB/sec)

OpenSuse 运行 Oracle Java(在 VMWare 中)

downloaded  (30452736 bytes, 89312.46KB/sec)

OpenSuse 运行 OpenJDK(在 VMWare 中)

downloaded  (30452736 bytes, 89041.05KB/sec)

Ubuntu 12.10(在 VMWare 中)

downloaded  (30452736 bytes, 81154.99KB/sec)

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

downloaded  (30452736 bytes, 2883.84KB/sec)

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

downloaded  (30452736 bytes, 93822.44KB/sec)

Ubuntu 12.04.1 LTS

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

downloaded  (30452736 bytes, 11633.38KB/sec)

我不明白这一点。谁知道这里发生了什么?

再见,托尔斯滕...

【问题讨论】:

    标签: java apache ftp


    【解决方案1】:

    有太多事情要从一些代码中查明它。

    它可以是您的默认网络数据包大小 (MTU)、硬件基础设施、JVM、操作系统配置等。

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

    我相信 Net Commons 缓冲区大小默认为 1024,您可以使用它。

    除此之外,您还需要进入嗅探器,看看发生了什么。可能是开关配置不正确,并且与一个 API 相比,另一个 API 效果更好。

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

    【讨论】:

    • Mike 是对的。stackoverflow.com/questions/14000341/…" >这显示了一些上传速度问题。防火墙可能是个问题。我不确定,但 java 7 必须用它做点什么。你尝试用 java 6 下载吗?我正在尝试使用 Java Ftp 替代方案,并会尽快回复您。
    【解决方案2】:

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

    【讨论】:

    • 结果如何解释?在这个实验中,Unix 和 Linux 的表现比 Windows 差很多
    【解决方案3】:

    在很多系统上,FTP的被动模式和主动模式也会有很大的不同;特别是当服务器只承认一种模式而客户端默认尝试使用另一种模式时。如果我没记错的话,主动模式比被动模式稍快,但使用禁止模式很容易将传输速度减慢一百或一千倍以上;如果不是,则只是阻止。

    即使两种模式都允许,防火墙也经常会减慢被动模式的速度,同时保持主动模式不变(或者相反?)。

    【讨论】:

      【解决方案4】:

      我推测真正的答案是没有人开发出快速复制命令。

      要拥有“最终复制/传输”命令,它需要主动监控事物并适应环境。

      例如。 copy(ref,ref) .. 为了让这个速度更快,你不能使用 C 作为初学者,你需要使用像动态语言这样的东西,它可以选择 C ​​性能。很少有这样的语言存在。

      “ref”是对任何内容的引用,复制命令是 JIT 到机器特定分支,该分支根据源和目标选择适当的路径。

      因此,根据 ref 在运行时的最终结果,实际命令可能是自适应网络传输之间的任何内容,它尝试多个路由 to memcpy to 只是添加一个新的引用(如果 src 是不可变的并且目标在同一个进程中并且 src 可以访问)。

      【讨论】:

        猜你喜欢
        • 2019-11-24
        • 1970-01-01
        • 2019-09-13
        • 2012-11-19
        • 1970-01-01
        • 2012-01-20
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多