Python ftplib最佳块大小?

use*_*820 12 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)
Run Code Online (Sandbox Code Playgroud)

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

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

aro*_*aal 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

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