sábado, 25 de agosto de 2012

Mejorando transferencia de ssh/rsync

Buscando la forma de mejorar la transferencia de backups (realizados con rsync, pero sobre un tunel de SSH), encontré que la velocidad de transferencia puede variar mucho dependiendo del cipher usado para crear la conexión con SSH.

En una primera búsqueda encontré unos tests que reproduje en mi ambiente. Las pruebas que hice consiste en copiar un archivo con contenidos aleatorios (generado desde /dev/urandom), de 512MB, sobre una conección Gigabit Ethernet, estando el archivo de origen y el de destino en el directorio /dev/shm (esto nos permite asegurarnos que el acceso a disco no influya en nuestros tests):


Warm up... Copiando con cipher por default...
random                           100%  512MB  42.7MB/s   00:12    

Copiando con cipher: 3des-cbc
random                           100%  512MB  16.5MB/s   00:31    

Copiando con cipher: aes128-cbc
random                           100%  512MB  85.3MB/s   00:06    

Copiando con cipher: aes192-cbc
random                           100%  512MB  73.1MB/s   00:07    

Copiando con cipher: aes256-cbc
random                           100%  512MB  64.0MB/s   00:08    

Copiando con cipher: aes128-ctr
random                           100%  512MB  42.7MB/s   00:12    

Copiando con cipher: aes192-ctr
random                           100%  512MB  34.1MB/s   00:15    

Copiando con cipher: aes256-ctr
random                           100%  512MB  32.0MB/s   00:16    

Copiando con cipher: arcfour128
random                           100%  512MB 102.4MB/s   00:05    

Copiando con cipher: arcfour256
random                           100%  512MB 102.4MB/s   00:05    

Copiando con cipher: arcfour
random                           100%  512MB 102.4MB/s   00:05    

Copiando con cipher: blowfish-cbc
random                           100%  512MB  56.9MB/s   00:09    

Copiando con cipher: cast128-cbc
random                           100%  512MB  51.2MB/s   00:10    

Luego probé copiar a "localhost":

Warm up... Copiando con cipher por default...
random                               100%  512MB  56.9MB/s   00:09    

Copiando con cipher: 3des-cbc
random                               100%  512MB  20.5MB/s   00:25    

Copiando con cipher: aes128-cbc
random                               100%  512MB 170.7MB/s   00:03    

Copiando con cipher: aes192-cbc
random                               100%  512MB 170.7MB/s   00:03    

Copiando con cipher: aes256-cbc
random                               100%  512MB 170.7MB/s   00:03    

Copiando con cipher: aes128-ctr
random                               100%  512MB  64.0MB/s   00:08    

Copiando con cipher: aes192-ctr
random                               100%  512MB  51.2MB/s   00:10    

Copiando con cipher: aes256-ctr
random                               100%  512MB  46.6MB/s   00:11    

Copiando con cipher: arcfour128
random                               100%  512MB 256.0MB/s   00:02    

Copiando con cipher: arcfour256
random                               100%  512MB 256.0MB/s   00:02    

Copiando con cipher: arcfour
random                               100%  512MB 170.7MB/s   00:03    

Copiando con cipher: blowfish-cbc
random                               100%  512MB  64.0MB/s   00:08    

Copiando con cipher: cast128-cbc
random                               100%  512MB  56.9MB/s   00:09    

El ganador en velocidad, es por mucho arcfour, pero por lo que he visto, no es recomendable usarlo cuando la seguridad es un factor crítico. El cipher aes128 es algo más lerdo, pero la taza de transferencia es de más del doble comparada al cipher por default.

Para usar un cipher específico con rsync + ssh, el comando a usar tendría la forma:

$ rsync -e 'ssh -c arcfour256' ......

El script que usé lo subí a un gist de GitHub.

No hay comentarios: