Python ftplib 最优块大小?
我正在使用Python的ftplib库,通过本地网络把大量数据(大约100个文件,每个文件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 个回答
这是个有趣的问题,我深入研究了一下;)
不过,这里有个不错的例子来帮助你理解如何确定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函数会有像块大小(blocksize)或块大小(chunksize)这样的参数,但它们并没有涉及到底层传输协议的块大小。块大小定义了一个读取缓冲区,用来存放要发送或读取的数据。在ftplib中,标准大小是8K(8192字节)。所以,调整块大小其实不会对传输速度产生太大影响。
控制底层传输协议的MTU是由操作系统及其内核来处理的。
最后说说ftp。ftp是个老古董,设置和使用都很简单,但并不总是传输文件的最佳方法,特别是当你需要传输很多小文件时。我不太清楚你的具体使用场景,所以考虑一下其他传输协议的替代方案,比如rsync或bbcp,可能会更合适。后者似乎能大幅提高复制速度。你真的应该看看这个链接:http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html
这只是我的一点看法...