Python ftplib最佳块大小?

时间:2014-07-11 16:38:25

标签: python ftp

我使用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内核询问最佳块大小,以避免重新发明轮子。

1 个答案:

答案 0 :(得分:7)

这是一个有趣的问题,我不得不深入探讨;)

无论如何,这是一个很好的例子,如何确定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

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