使用Java中的单个SFTP连接并发拉文件 - 提高SFTP性能

时间:2016-04-05 11:44:23

标签: java performance sftp jsch

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

我已经有很少的链接可以在单个连接上逐个拉取文件。 像:

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

ChannelSftp.get method会返回InputStream

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

虽然我没有看到,但这会给你带来顺序下载的优势。

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

典型的瓶颈是:

  • 网络速度:如果您已经使网络速度饱和,则无法改善任何内容。

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

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

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

有关更深入的信息,请参阅我的答案: