2014-07-11 17 views
12

Utilizzo il ftplib di python per trasferire molti e molti dati (~ 100 file X 2 GB) su una rete locale su un server FTP. Questo codice è in esecuzione su Ubuntu. Qui è la mia chiamata (auto è il mio oggetto FtpClient, che è un wrapper client ftplib):Python ftplib Dimensione blocco ottimale?

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

La mia domanda è, come faccio a scegliere una dimensione di blocco ottimale? La mia comprensione è che la dimensione ottimale del blocco dipende da una serie di cose, non ultima la velocità di connessione e la latenza. Il mio codice verrà eseguito su molte reti diverse con velocità diverse e quantità variabili di congestione durante il giorno. Idealmente, vorrei calcolare la dimensione ottimale del blocco in fase di esecuzione.

Le dimensioni ottimali del blocco di trasferimento FTP sarebbero uguali alle dimensioni ottimali della finestra TCP? Se questo è vero, e il ridimensionamento della finestra TCP è attivo, c'è un modo per ottenere la dimensione ottimale della finestra TCP dal kernel? Come/quando il kernel di Linux determina la dimensione ottimale della finestra? Idealmente potrei chiedere al kernel di Linux la dimensione ottimale del blocco, in modo da evitare di reinventare la ruota.

+0

Finché rete I/O è più lento di disco I/O, [il kernel dovrebbero prendersi cura di questo per voi] (http : //en.wikipedia.org/wiki/Nagle%27s_algorithm). Si potrebbe anche considerare di impostare l'opzione 'TCP_CORK'. – Phillip

+0

Che tipo di concorrenza ti aspetti o usi qui? Questa è intesa come un'applicazione a thread singolo? Potresti trarre vantaggio dall'interfaccia I/O asincrono multiplex? –

risposta

7

questa è una domanda interessante e ho dovuto immergersi in un po 'più in profondità;)

In ogni caso, ecco un buon esempio come determinare il MTU: http://erlerobotics.gitbooks.io/erle-robotics-python-gitbook-free/content/udp_and_tcp/udp_fragmentation.html

Ma, si dovrebbe anche pensare al di seguito: il MTU è qualcosa che è un fenomeno locale e forse riguarda solo una parte della rete locale. Quello che pensi è il Path MTU, il MTU minimale sul percorso di trasporto completo. http://en.wikipedia.org/wiki/Path_MTU_Discovery Quindi, dovrai conoscere ogni MTU di ogni componente coinvolto. Questo può essere un problema, ad esempio se stai usando Jumbo Frames e un interruttore no, l'interruttore deve dividere i frame. Ho già avuto il problema che un interruttore non ha capito i jumbo frame e ha abbandonato i frame.

Ora la domanda più interessante: il blocco ottimale. Molte funzioni Python accettano argomenti come blocchi o chunksize. Ma non affrontano il blocco del protocollo di trasporto sottostante. Il blocksize definisce un buffer di lettura che conterrà i dati da inviare/leggere. La dimensione standard in ftplib è 8K (8192 byte). Pertanto, la regolazione del blocco non dovrebbe influire sulla velocità del trasferimento.

Controllare il MTU del protocollo di trasporto sottostante è qualcosa che verrà gestito dal sistema operativo e dal suo kernel.

Infine alcune parole su ftp. ftp è un vecchio dinosauro che è facile da configurare e utilizzare ma non è sempre il metodo migliore per trasferire i file. Soprattutto se trasferisci un sacco di piccoli file. Non conosco esattamente il tuo caso d'uso, quindi pensare ad altre alternative di protocollo di trasferimento come rsync o bbcp potrebbe avere senso. Più tardi sembra aumentare drasticamente la velocità di copia. Si dovrebbe davvero dare un'occhiata al http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html

solo i miei due centesimi ...

Problemi correlati