Cómo acelerar rsync para archivos pequeños

15

Estoy tratando de transferir miles de archivos pequeños de un servidor a otro usando el siguiente comando:

rsync -zr --delete /home/user/ [email protected]::backup

Actualmente, la transferencia lleva mucho tiempo (no la he cronometrado). ¿Hay alguna manera de hacer esto más rápido? ¿Debo estar usando otra herramienta? ¿Debería usar rsync sobre ssh en lugar de usar el protocolo rsync?

Tallarines
fuente
¿Realmente son solo cientos? ¿Como en menos de un par de miles?
Zoredache
Un poco más que eso ... 475,576 por un total de 9.3GB
Fideos
Eso va a apestar usando casi cualquier herramienta que funcione a nivel de sistema de archivos. Sospecho que si hicieras un perfil, verías que se gasta una cantidad considerable de tiempo llamando stat().
Zoredache
¿Por qué no -apero -r?
kamae

Respuestas:

13

Necesitas determinar el cuello de botella. No es rsync. Probablemente no sea el ancho de banda de su red. Como sugirió @Zoredache, lo más probable es la gran cantidad de iops generados por todas las stat()llamadas. Cualquier herramienta de sincronización necesitará estadísticas de los archivos. Al sincronizar ejecutar iostatpara verificar.

Entonces la pregunta se vuelve; ¿Cómo optimizar estadísticas? Dos respuestas fáciles:

  1. obtener un subsistema de disco más rápido (en ambos hosts si es necesario) y
  2. ajuste su sistema de archivos (por ejemplo, para ext3 monte con noatimey agregue a dir_index).

Si por casualidad no es el iops de su disco el límite, entonces podría experimentar dividiendo el árbol de directorios en varios árboles distintos y ejecutar múltiples rsyncs.

Mark Wagner
fuente
1
Gracias, miraré dir_index y veré cómo me va (ya usamos noatime). Parece que el disco io es el cuello de botella, pero ya estamos ejecutando unidades SAS de 15k en RAID 5. El siguiente paso sería SSD, pero nuestra empresa de alojamiento aún no nos da esa opción.
Fideos
5

La compresión no es muy útil para archivos pequeños (digamos, menos de 100 bytes). Para archivos pequeños, a veces la versión comprimida puede ser incluso más grande que la original. Prueba el rsynccomando sin la -zbandera.

sshes bueno para la seguridad, pero no hará que la transferencia sea más rápida. De hecho, haría la transferencia más lenta debido a la necesidad de cifrado / descifrado.

rsyncEs posible que no parezca rápido la primera vez que se ejecuta porque hay muchos datos para transferir. Sin embargo, si planea ejecutar este comando periódicamente, las ejecuciones posteriores pueden ser mucho más rápidas ya que rsynces inteligente no transferir archivos que no han cambiado.

unutbu
fuente
Si solo usa el rsynccliente, usará SSH detrás de escena. Tienes que salir de tu camino para deshabilitar el cifrado cuando usas rsync. Ver: stackoverflow.com/a/1821574/64911
mlissner
1

¿Qué versión de rsync estás usando? Cualquier cosa anterior a 3.0.0 (en ambos extremos) no tiene la función de lista de archivos incremental, que acelera las transferencias grandes.

devicenull
fuente
Usando rsync 3.0.5 en ambos servidores.
Fideos
1

Agregar -v --progressa su línea de comando rsync

rsync se realiza en 2 pasos:

  1. Examine todos los archivos en ambas plataformas para comparar su tamaño y fecha
  2. hacer la transferencia real

Si rsync tiene miles de archivos pequeños en directorios anidados, puede ser simplemente que rsync pasa la mayor parte del tiempo yendo a subdirectorios y buscando todos los archivos

Si no se invierte tiempo en navegar, el tiempo puede deberse simplemente a la adición de todas las latencias que comienzan cada nueva transferencia de archivos.

Alex F
fuente
1

En caso de que estén involucrados los sistemas de archivos ext3 o ext4, verifique que ambos tengan habilitada la función dir_index . Esto triplicó el rendimiento de rsync en mi caso.

Vea los detalles en mi respuesta en: /server//a/759421/80414

Alfonx
fuente