在Java中使用单个SFTP连接同时拉取文件-提高SFTP性能



我需要使用Java代码中的单个SFTP连接从远程服务器同时提取文件。

我已经有几个链接可以在单个连接上一个接一个地提取文件。类似:

要使用sftpChannel.ls("Path to dir");,它将返回给定路径中的文件列表作为向量,您必须迭代该向量才能下载每个文件sftpChannel.get();

但我想同时提取多个文件,例如,在单个连接上一次提取2个文件。

谢谢!

ChannelSftp.get方法返回一个InputStream

因此,您可以多次调用get,为每次下载获取一个流。然后继续轮询流,直到所有流都到达文件末尾。

虽然我不明白,但这比顺序下载有什么优势。


如果你想提高性能,你首先需要知道瓶颈是什么。

典型的瓶颈是:

  • 网络速度:如果你的网络速度已经饱和,你就无法提高任何东西。

  • 网络延迟:如果延迟是瓶颈,增加SFTP请求队列的大小可能会有所帮助。使用ChannelSftp.setBulkRequests方法(默认值为16,因此使用更高的数字)

  • CPU:如果CPU是瓶颈,您要么必须提高加密实现的效率,要么将负载分散在CPU核心上。分散单个会话/连接的加密负载是很棘手的,必须在低级SSH实现上得到支持。我不认为JSch或任何其他实现支持这一点。

  • 磁盘:如果磁盘驱动器(本地或远程)是瓶颈(不太可能),则如上所示的并行传输可能会有所帮助,即使在使用单个连接时,如果并行传输各使用不同的磁盘驱动器。

有关更多深入信息,请参阅我对以下内容的回答:

  • 为什么FileZilla SFTP文件传输最大速度限制在1.3MiB/sec,而不是饱和可用带宽?rsync和WinSCP甚至更慢
  • 为什么FileZilla比PSFTP快得多

最新更新