为什么Java FTP客户端的传输速率存在很大差异

Tor*_*öhr 5 java apache ftp

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

FTP服务器(在Ubuntu服务器上运行的纯FTP)连接到与客户端相同的LAN,因此不考虑Internet速度问题.由于性能低下,我将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();
Run Code Online (Sandbox Code Playgroud)

以下是ftp日志的结果

Mac OS从IntelliJ Idea开始

downloaded  (30452736 bytes, 21200.67KB/sec)
Run Code Online (Sandbox Code Playgroud)

Mac OS从shell开始

downloaded  (30452736 bytes, 21471.75KB/sec)
Run Code Online (Sandbox Code Playgroud)

Windows 7(在VMWare中)

downloaded  (30452736 bytes, 65243.15KB/sec)
Run Code Online (Sandbox Code Playgroud)

运行Oracle Java的OpenSuse(在VMWare中)

downloaded  (30452736 bytes, 5274.56KB/sec)
Run Code Online (Sandbox Code Playgroud)

运行OpenJDK的OpenSuse(在VMWare中)

downloaded  (30452736 bytes, 7663.68KB/sec)
Run Code Online (Sandbox Code Playgroud)

Ubuntu 12.04.1 LTS

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

downloaded  (7077888 bytes, 6.10KB/sec)
Run Code Online (Sandbox Code Playgroud)


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();
Run Code Online (Sandbox Code Playgroud)

结果发生了显着变化:

Mac OS从IntelliJ Idea开始

downloaded  (30452736 bytes, 109431.60KB/sec)
Run Code Online (Sandbox Code Playgroud)

Mac OS从shell开始

downloaded  (30452736 bytes, 110333.66KB/sec)
Run Code Online (Sandbox Code Playgroud)

Windows 7(在VMWare中)

downloaded  (30452736 bytes, 91318.64KB/sec)
Run Code Online (Sandbox Code Playgroud)

运行Oracle Java的OpenSuse(在VMWare中)

downloaded  (30452736 bytes, 89312.46KB/sec)
Run Code Online (Sandbox Code Playgroud)

运行OpenJDK的OpenSuse(在VMWare中)

downloaded  (30452736 bytes, 89041.05KB/sec)
Run Code Online (Sandbox Code Playgroud)

Ubuntu 12.10(在VMWare中)

downloaded  (30452736 bytes, 81154.99KB/sec)
Run Code Online (Sandbox Code Playgroud)

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

downloaded  (30452736 bytes, 2883.84KB/sec)
Run Code Online (Sandbox Code Playgroud)

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

downloaded  (30452736 bytes, 93822.44KB/sec)
Run Code Online (Sandbox Code Playgroud)

Ubuntu 12.04.1 LTS

在前面提到的PC上运行(具有6.10 KB /秒tx速率的PC)

downloaded  (30452736 bytes, 11633.38KB/sec)
Run Code Online (Sandbox Code Playgroud)

我不明白这一点.谁有线索在这里发生什么?

再见,托斯滕......

Mik*_*ike 1

发生的事情太多,无法从某些代码中查明它。

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

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

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

除此之外,您需要深入嗅探器并查看发生了什么。可能是开关配置不正确,并且使用一种 API 比使用另一种 API 效果更好。

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