【问题标题】:Python ftplib Optimal Block Size?Python ftplib 最佳块大小?
【发布时间】:2014-09-02 08:45:56
【问题描述】:

我正在使用 python 的 ftplib 将大量数据(约 100 个文件 X 2GB)通过本地网络传输到 FTP 服务器。此代码在 Ubuntu 上运行。这是我的调用(self 是我的 FtpClient 对象,它是 ftplib 客户端的包装器):

# Store file.      
self.ftpClient.storbinary('STOR ' + destination, fileHandle, blocksize = self.blockSize, callback = self.__UpdateFileTransferProgress)

我的问题是,如何选择最佳块大小?我的理解是,最佳块大小取决于许多因素,其中最重要的是连接速度和延迟。我的代码将在许多不同的网络上以不同的速度和全天不同程度的拥塞运行。理想情况下,我想在运行时计算最佳块大小。

最佳 FTP 传输块大小是否与最佳 TCP 窗口大小相同?如果这是真的,并且打开了 TCP 窗口缩放,有没有办法从内核中获取最佳 TCP 窗口大小? linux内核如何/何时确定最佳窗口大小?理想情况下,我可以向 linux 内核询问最佳块大小,以避免重新发明轮子。

【问题讨论】:

  • 只要网络 i/o 比磁盘 i/o 慢,the kernel should take care of that for you。您也可以考虑设置TCP_CORK 选项。
  • 您期望或在这里使用什么样的并发?这是否打算成为单线程应用程序?您能从多路异步 I/O 中受益吗?

标签: python ftp


【解决方案1】:

这是一个有趣的问题,我不得不深入研究一下;)

无论如何,这是一个如何确定 MTU 的好例子:http://erlerobotics.gitbooks.io/erle-robotics-python-gitbook-free/content/udp_and_tcp/udp_fragmentation.html

但是,您还应该考虑以下几点:MTU 是一种本地现象,可能只涉及您本地网络的一部分。您考虑的是路径 MTU,即完整传输路径上的最小 MTU。 http://en.wikipedia.org/wiki/Path_MTU_Discovery 因此,您必须了解每个相关组件的每个 MTU。这可能是一个问题,例如,如果您正在使用巨型帧而没有使用交换机,则交换机必须拆分帧。我已经遇到了交换机不理解巨型帧并丢弃帧的问题。

现在最有趣的问题是:最佳块大小。很多 python 函数都接受诸如 blocksize 或 chunksize 之类的参数。但它们没有解决底层传输协议的块大小。 blocksize 定义了一个读取缓冲区,它将包含要发送/读取的数据。 ftplib 中的标准大小是 8K(8192 字节)。因此,调整块大小应该不会真正影响传输速度。

控制底层传输协议的 MTU 将由操作系统及其内核处理。

最后是关于 ftp 的一些话。 ftp 是一种古老的恐龙,易于设置和使用,但并不总是传输文件的最佳方法。特别是如果您传输大量小文件。我不完全了解您的用例,因此考虑其他传输协议替代方案(如 rsync 或 bbcp)可能是有意义的。后者似乎大大提高了复制速度。你真的应该看看http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html

只是我的两分钱......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2011-08-03
    • 2016-05-14
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多