velocidades de subida SCP parecen estar limitadas en gran medida en la biblioteca por lo que la utilidad de línea de comandos SCP es capaz de hacer. Entiendo que esto es Ruby (1.9.2-P0), pero Net :: SCP es aproximadamente 8 veces más lenta que la utilidad Linux (visto el uso de archivos de gran tamaño ... ver más abajo). Tengo curiosidad por saber (Tomé un rápido vistazo al código) si es así como enchufes están en Ruby, o si es posible multiplexar la Red :: tomas de CPS mejor?problemas de rendimiento con Ruby y transferencias Net :: SCP (enchufes):
Noté que no importa qué estilo de carga probé (carga en serie, canales que funcionan de forma asíncrona, utilizando múltiples instancias del objeto scp) nunca pude obtener más de 9 megabytes/segundo de velocidad de transferencia en una carga SCP. Ahora ... permítanme explicar los detalles de mi investigación:
1) probado diferentes algoritmos de cifrado
he utilizado diferentes tipos de cifrado sin mucha significativa de cambio de velocidad Ejemplo: Podría enviar mi archivo de prueba de 1 GB utilizando Línea de comando scp (algoritmo de cifrado = arcfour128) y obtener una tasa de transferencia de 73,3 megabytes/s en mi conexión gigabit interna. Nunca obtuve más de 9 megabytes/s en mi conexión gigabit interna usando Net :: SCP.upload lib.
2) probado diferentes sistemas operativos anfitriones/
me encontré con que Linux - subidos> Linux fueron los más rápidos. servidor ssh de SUA (Windows) sólo podía proporcionarme un máximo de velocidades 13.5megabytes/s de subida (Linux -> Windows, utilizando el algoritmo arcfour w/línea de comandos SCP), mientras que Linux -> Linux (usando arcfour, w línea de comandos/SCP) fue un abrasador 73.3 megabytes/s. Debo mencionar que estas ventanas y máquinas de Linux son exactamente el mismo modelo, hardware, etc.
3) probado diferentes métodos de carga SCP
-> 2 utiliza carga sincrónica! llamadas, una después de la otra se terminó. -> usado 2 llamadas de subida asíncronos, uno tras otro había comenzado -> usado 2 objetos Net :: SCP y enviado el archivo a la versión sin bloqueo/asíncrono de carga (por lo que se ejecuta en paralelo) Ninguno de estos métodos diferentes dar cualquier ganancia de rendimiento significativo, que es un poco frustrante.
Éstos son los resultados de la prueba (texto mejorado para facilitar la lectura, pero similar a la salida del código incluido):
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
Si usted tiene un archivo de gran tamaño (utilicé un archivo ~ 1 GB), Puede usar estas pruebas de rspec (en scp_spec.rb) o cambiarlas a los arneses de prueba con los que esté familiarizado para ver esta degradación del rendimiento.
Si no sabe cómo se puede mejorar este rendimiento en la biblioteca, ¿tiene más ideas sobre cómo abrir una velocidad extra paralela de las transferencias SCP además de simplemente llamar a la utilidad scp a través de una subcapa?
prueba Rspec aquí: https://gist.github.com/703966