2014-07-11 14 views
12

Ich benutze Python ftplib, um viele und viele Daten (~ 100 Dateien X 2 GB) über ein lokales Netzwerk auf einen FTP-Server zu übertragen. Dieser Code läuft unter Ubuntu. Hier ist mein Ruf (Selbst ist mein FtpClient Objekt, das ist ein Wrapper um ftplib Client):Python ftplib Optimale Blockgröße?

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

Meine Frage ist, wie wähle ich eine optimale Blockgröße? Nach meinem Verständnis hängt die optimale Blockgröße von einer Reihe von Dingen ab, nicht zuletzt von Verbindungsgeschwindigkeit und Latenz. Mein Code wird in vielen verschiedenen Netzwerken mit unterschiedlichen Geschwindigkeiten und unterschiedlichen Mengen an Engpässen während des Tages ausgeführt. Im Idealfall möchte ich zur Laufzeit die optimale Blockgröße berechnen.

Wäre die optimale FTP-Übertragungsblockgröße die gleiche wie die optimale TCP-Fenstergröße? Wenn dies der Fall ist und die TCP-Fensterskalierung aktiviert ist, gibt es eine Möglichkeit, die optimale TCP-Fenstergröße vom Kernel zu erhalten? Wie/wann bestimmt der Linux-Kernel die optimale Fenstergröße? Idealerweise könnte ich den Linux-Kernel nach der optimalen Blockgröße fragen, um das Rad nicht neu erfinden zu müssen.

+0

Solange Netzwerk i/o langsamer als Festplatten-I/O, [die Kernel sollte für Sie darum kümmern] (http : //en.wikipedia.org/wiki/Nagle%27s_algorithm). Sie können auch die Option "TCP_CORK" festlegen. – Phillip

+0

Welche Art von Nebenläufigkeit erwarten oder verwenden Sie hier? Soll dies eine Single-Thread-Anwendung sein? Könnten Sie von gemultiplexten asynchronen E/A profitieren? –

Antwort

7

dies eine interessante Frage ist, und ich hatte ein bisschen tiefer tauchen,

) Wie auch immer, hier ist ein gutes Beispiel dafür, wie die MTU bestimmen: http://erlerobotics.gitbooks.io/erle-robotics-python-gitbook-free/content/udp_and_tcp/udp_fragmentation.html

Aber Sie sollten auch darüber nachdenken, die Folgendes: Die MTU ist ein lokales Phänomen und betrifft möglicherweise nur einen Teil Ihres lokalen Netzwerks. Was Sie denken, ist die Path MTU, die minimale MTU über den gesamten Transportweg. http://en.wikipedia.org/wiki/Path_MTU_Discovery Sie müssen also jede MTU jeder beteiligten Komponente kennen. Dies kann ein Problem sein, wenn Sie beispielsweise Jumbo-Frames und einen Switch nicht verwenden, muss der Switch die Frames aufteilen. Ich hatte bereits das Problem, dass ein Switch Jumbo-Frames nicht verstand und die Frames fallen ließ.

Jetzt die interessanteste Frage: die optimale Blockgröße. Viele Python-Funktionen nehmen Argumente wie blocksize oder chunksize. Sie adressieren jedoch nicht die Blockgröße des zugrunde liegenden Transportprotokolls. Die Blockgröße definiert einen Lesepuffer, der die zu sendenden/zu lesenden Daten enthält. Die Standardgröße in ftplib beträgt 8K (8192 Byte). Daher sollte die Anpassung der Blockgröße die Geschwindigkeit der Übertragung nicht wirklich beeinflussen.

Die Steuerung der MTU des zugrunde liegenden Transportprotokolls wird vom Betriebssystem und seinem Kernel übernommen.

Endlich ein paar Worte über ftp. ftp ist ein alter Dinosaurier, der leicht einzurichten und zu benutzen ist, aber auch nicht immer die beste Methode ist, Dateien zu übertragen. Vor allem, wenn Sie viele kleine Dateien übertragen. Ich kenne Ihren Anwendungsfall nicht genau, daher könnte es sinnvoll sein, über andere Übertragungsprotokollalternativen wie rsync oder bbcp nachzudenken. Letzteres scheint die Kopiergeschwindigkeit drastisch zu erhöhen. Sie sollten wirklich einen Blick auf http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html

haben nur meine zwei Cent ...

Verwandte Themen