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