2014-07-11 120 views
12

我使用python的ftplib跨本地網絡將大量和大量數據(〜100個文件X 2GB)傳輸到FTP服務器。這段代碼在Ubuntu上運行。這裏是我的電話(個體經營是我FtpClient對象,它是圍繞FTPLIB客戶的包裝):Python ftplib最佳塊大小?

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

我的問題是,我該如何選擇一個最佳的塊大小?我的理解是,最佳塊大小取決於許多因素,其中最重要的是連接速度和延遲。我的代碼將在許多不同的網絡上運行,速度不同,全天擁塞不定。理想情況下,我想在運行時計算最佳塊大小。

最佳FTP傳輸塊大小是否與最佳TCP窗口大小相同?如果這是真的,並且打開了TCP窗口縮放,有沒有辦法從內核獲得最佳的TCP窗口大小? Linux內核如何/何時確定最佳窗口大小?理想情況下,我可以向Linux內核請求最佳塊大小,以避免重新發明輪子。

+0

只要網絡I/O比磁盤慢的I/O,[內核應該注意的是你(HTTP ://en.wikipedia.org/wiki/Nagle%27s_algorithm)。你也可以考慮設置'TCP_CORK'選項。 – Phillip

+0

你在這裏期待或使用什麼類型的併發?這是否是一個單線程應用程序?您可以從多路複用異步I/O中受益嗎? –

回答

7

這是一個有趣的問題,我不得不在深一點的潛水;)

不管怎麼說,這是一個很好的例子,如何確定MTU:http://erlerobotics.gitbooks.io/erle-robotics-python-gitbook-free/content/udp_and_tcp/udp_fragmentation.html

但是,你也應該想想以下情況:MTU是一種本地現象,可能只涉及本地網絡的一部分。您想到的是Path MTU,即整個傳輸路徑上的最小MTU。因此,您必須知道每個涉及組件的每個MTU。這可能是一個問題,例如,如果您使用巨型幀和交換機,交換機不得不拆分幀。我已經遇到交換機不瞭解巨型幀並丟棄幀的問題。

現在最有趣的問題:最佳的塊大小。很多python函數都使用塊大小或塊大小等參數。但是他們沒有解決底層傳輸協議的塊大小問題。 blocksize定義了一個讀緩衝區,它將包含要發送/讀取的數據。 ftplib中的標準大小是8K(8192字節)。因此,調整塊大小不應該影響傳輸的速度。

控制底層傳輸協議的MTU是由操作系統及其內核處理的東西。

最後談了一些關於ftp的話。 ftp是一種古老的恐龍,易於安裝和使用,但並不總是傳輸文件的最佳方法。特別是如果你傳輸了很多小文件。我不知道你的使用案例,所以考慮其他傳輸協議替代品,如rsync或bbcp可能是有道理的。後者似乎大大增加了複製速度。你真的應該看看http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html

只是我的兩分錢......