2010-11-17 4 views
7

Le velocità di caricamento SCP sembrano essere notevolmente limitate nella libreria da ciò che l'utilità scp della riga di comando è in grado di eseguire. Capisco che questo è Ruby (1.9.2-p0), ma lo Net :: SCP è circa 8 volte più lento dell'utilità Linux (visto usando file di grandi dimensioni ... vedi sotto). Sono curioso di sapere (ho dato una rapida occhiata al codice) se questo è il modo in cui i socket sono in Ruby, o se è possibile moltiplicare i socket Net :: SCP meglio?Problemi di prestazioni con i trasferimenti Ruby e Net :: SCP (prese)

Ho notato che non importa quale sia lo stile di caricamento che ho provato (caricamento seriale, canali che funzionano in modo asincrono, usando più istanze dell'oggetto scp) Non ho mai potuto superare i 9 megabyte al secondo di velocità di trasferimento su un caricamento SCP. Ora ... mi permetta di spiegare i dettagli della mia indagine:

1) provato diversi algoritmi di crittografia

ho usato diversi tipi di crittografia senza molto significativo cambio di velocità Esempio: ho potuto presentare il mio file di prova da 1 GB utilizzando command line scp (algoritmo di crittografia = arcfour128) e ottiene una velocità di trasferimento di 73,3 megabyte/s sulla mia connessione Gigabit interna. Non ho mai ottenuto più di circa 9 megabyte/s sulla mia connessione Gigabit interna utilizzando la lib di Net :: SCP.upload.

2) Ho provato diversi host/sistemi operativi

ho scoperto che Linux - arrivi> Linux sono stati i più veloci. Il server ssh di SUA (Windows) poteva fornire solo una velocità massima di upload di 13,5 megabit/s (Linux -> Windows, usando la linea di comando arcfour w/scp), mentre Linux -> Linux (usando la linea di comando arcfour, w/scp) era un 73,3 megabyte/s sfolgorante. Devo dire che queste finestre e le macchine Linux sono dello stesso modello esatto, hardware, ecc

3) provato diversi metodi di caricamento SCP

-> usato 2 Carica sincrono! chiama, uno dopo l'altro era finito. -> usato 2 chiamate di upload asincrone, una dopo l'altra era iniziata -> usato 2 oggetti Net :: SCP e inviato il file alla versione non bloccante/asincrona del caricamento (quindi erano in esecuzione in parallelo) Nessuno di questi metodi differenti dare un significativo guadagno in termini di prestazioni, che è un po 'frustrante.

Ecco i risultati del test (testo migliorato per migliorare la leggibilità, ma simile alla output del codice fornito):


Net::SCP 
Done creating channels 
Starting transfer of /home/seth/afpcases/systeme.afp # two upload! calls, one after another 
Finished transfer of /home/seth/afpcases/systeme.afp 
--> Duration: 126.07707 seconds (8.7168903909331 megabytes/s) should show transfer speed of serial uploads 

Starting transfer of /home/seth/afpcases/systeme.afp # two upload calls, one after another, with a wait on both channels after both have started 
Finished transfer of /home/seth/afpcases/systeme.afp 
--> Duration: 122.588784 seconds (8.964931082112699 megabytes/s) should show transfer speed of simultaneous async channels. 

Starting transfer of /home/seth/afpcases/systeme.afp # two upload calls on two separate Net::SCP objects, one after another, with a wait on both channels after both have started 
Finished transfer of /home/seth/afpcases/systeme.afp 
--> Duration: 122.822663 seconds (8.947860054133495 megabytes/s) should show transfer speed of simultaneous SCP instances 

Finished in 371.761262 seconds 

Se si dispone di un file di grandi dimensioni (io ho usato un file ~ 1GB), è possibile utilizzare questi test rspec (in scp_spec.rb) o cambiarli in qualsiasi strumento di test con cui si ha familiarità per vedere questo degrado delle prestazioni.

Se non sai come questa performance potrebbe essere migliorata nella libreria, hai altre idee su come aprire una velocità extra parallela dei trasferimenti SCP oltre a chiamare l'utilità scp tramite una subshell?

prova Rspec qui: https://gist.github.com/703966

risposta

-3

Si potrebbe provare Net-sftp invece. Sftp è un protocollo più recente e l'utility linux scp utilizza effettivamente il protocollo sftp se disponibile. Non so se net-scp usi effettivamente il protocollo sftp, ma non sarei sorpreso se non lo fosse.

Si potrebbe anche provare rsync, ma ciò richiederebbe l'installazione di rsync sull'host remoto pure.Rsync è di gran lunga il re della velocità con trasferimenti di file remoti, anche se non posso vouche per la gemma six-rsync.