Python ftplib最佳块大小?

13

我正在使用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慢,内核应该为您处理。您还可以考虑设置TCP_CORK选项。 - Phillip
你希望或正在使用哪种并发方式?这是一个单线程应用程序吗?你是否可以从多路复用的异步 I/O 中获益? - James Mills
1个回答

8

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

无论如何,以下是一个好的示例,可以确定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。例如,如果您使用Jumbo Frames和交换机不使用,则交换机必须拆分帧。我曾经遇到过一个交换机无法理解巨型帧并丢弃帧的问题。

现在最有趣的问题是最佳块大小。许多Python函数采用块大小或块大小等参数。但是它们并未涉及底层传输协议的块大小。块大小定义了包含要发送/读取的数据的读取缓冲区。ftplib中的标准大小为8K(8192字节)。因此,调整块大小不应真正影响传输速度。

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

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

以上仅供参考...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接