¿Cómo acelerar rsync?


44

Estoy ejecutando rsync para sincronizar un directorio en mi disco duro USB externo. Son unos 150 gigas de datos. Más de 50000 archivos, supongo.

Está ejecutando su primera sincronización en este momento, pero está copiando archivos a una velocidad de solo 1-5 MB / s. Eso parece increíblemente lento para un gabinete USB 2.0. Tampoco hay otras transferencias en el disco.

Estas son las opciones que utilicé:

rsync -avz --progress /mysourcefolder /mytargetfolder

Estoy ejecutando Ubuntu Server 9.10.


2
¿estás seguro de que estás obteniendo una conexión USB2? ¿funciona una copia (no rsync) u otra operación de escritura a velocidades normales? Si no, ¿ha probado una copia / otra operación de escritura con otro puerto / cable USB?
quack quijote

Vea también serverfault.com/questions/43014/… - allí la gente también propone usar dos tarcomandos canalizados o cpio.
Blaisorblade

Respuestas:


38

Para la primera sincronización solo usa

cp -a  /mysourcefolder /mytargetfolder

rsync solo agrega gastos generales cuando el destino está vacío.

también ... la opción -z probablemente esté matando su rendimiento, no debería usarla si no está transfiriendo datos a través de un enlace lento.


3
rsync se llama así porque es para sincronización remota y no es realmente apropiado para un volumen conectado localmente por esta misma razón.
msanford

66
Se supone que también se puede usar para transferencias locales, y es mucho más flexible. Es posible que sea excesivo para la primera sincronización.
Blaisorblade

1
rsync también es una sincronización unidireccional. Muy bueno para realizar copias de seguridad en un servidor o desde un servidor. Sin embargo, si desea la sincronización TWO-Way local con una unidad extraíble, puede consultar csync csync.org/get-it para no confundirlo con csync2, que es un proyecto completamente diferente.
Jesse the Wind Wanderer

3
rsync -avz --progress /mysourcefolder/ /mytargetfoldero obtendrá una copia del mysourcefolderinterior en mytargetfolderlugar de reflejar el contenido
editor

3
Esta respuesta no responde la pregunta. La pregunta era sobre cómo optimizar rsync, no reemplazarlo con el comando cp.
oemb1905

38

Si está utilizando rsync con una red rápida o disco a disco en la misma máquina,

sin usar compresión -z

y usando --inplace

lo acelera al rendimiento de los discos duros o la red

la compresión usa mucha CPU

no usar in situ hace que el disco duro funcione mucho (usa un archivo temporal antes de crear el final)

la compresión y no usar in situ es mejor para hacerlo a través de Internet (red lenta)

NUEVO: Tenga en cuenta el destino ... si hay habilitada la "compresión" NTFS ... esto ralentiza severamente los archivos grandes (diría que 200MB +) rsync casi parece estancado, es causado por esto.


La compresión NTFS es lenta en archivos grandes
Scott Kramer

No veo nada sobre '--inline' en la página de manual
Anthony

1
Es '--inplace'
Scott Kramer

26

Usa la -Wopción. Esto deshabilita las comparaciones delta / diff. Cuando el tiempo / tamaño del archivo difiere, rsync copia todo el archivo.

También elimine la -zopción. Esto solo es útil para comprimir el tráfico de red.

Ahora rsyncdebería ser tan rápido como cp.


66
Nota menor: -zsolo es útil para el tráfico de red de baja velocidad . Si su red es lo suficientemente rápida, ralentizará las cosas, ya que estará limitado por la CPU.
WhyNotHugo

3
Estos consejos aceleraron enormemente la transferencia de mis archivos entre dos dispositivos NAS, ¡gracias!
djhworld

2
pero tenga en cuenta que según la página del manual dice -W: "Este es el valor predeterminado cuando tanto el origen como el destino se especifican como rutas locales, pero solo si no hay una opción de escritura por lotes".
GuoLiang Oon

14

Primero: la cantidad de archivos en este caso será un factor importante. Es un tamaño promedio de 3MB cada uno. Probablemente haya un cuello de botella io que influya en la velocidad en el caso del OP. Más aquí : es una lectura bastante seca, pero la imagen de portada lo vale.

Entonces, ¿usa rsync para copiar en un directorio vacío? Aquí hay algunas formas de acelerarlo:

  1. No -z: definitivamente no use -z como en el OP.
  2. --no-comprimir podría acelerarlo. Esto podría tener el mayor impacto ... mi prueba fue de 13,000 archivos, tamaño total de 200MB, y usando rsync 3.1.3. Me sincronicé con una partición diferente en la misma unidad SSD interna. Con --no-compress, obtengo 18 MBps, y sin él obtengo 15 MBps. cp, por cierto, obtiene 16 MBps. Sin embargo, ese es un tamaño de archivo promedio mucho más pequeño. Además, no puedo encontrar ninguna documentación para --no-compress. Lo aprendí de esta publicación en stackexchange.com.
  3. -W para copiar archivos completos : use siempre esto si no desea que compare diferencias; No importa que el objetivo de rsync sea comparar diferencias y solo actualizar los cambios.
  4. -S para manejar bien los archivos dispersos : no puede hacer daño si no tiene archivos dispersos.
  5. --exclude-from o algo similar para excluir archivos que quizás no necesite reducirá el tiempo, pero no aumentará su velocidad de transferencia.
  6. Es posible si envía la salida a un archivo como este rsync -a /source /destination >/somewhere/rsync.out 2>/somewhere/rsync.err: el primero> básicamente imprime un archivo con todo lo que normalmente vería, y el 2> se refiere a mensajes de error.
  7. Finalmente, ejecutar múltiples instancias de rsync para diferentes partes de su transferencia podría ser de gran ayuda.

Mi comando sería:

rsync -avAXEWSlHh /source /destination --no-compress --info=progress2 --dry-run

Si todo se veía bien, eliminaría "--dry-run" y lo dejaría pasar. A, X y E cubren atributos y permisos extendidos no cubiertos por -a, l es para enlaces blandos, H es para enlaces duros y h es para lectura humana.

La actualización de un directorio ya sincronizado en una unidad USB, o la misma unidad, o en una red, requerirá diferentes comandos rsync para maximizar la velocidad de transferencia.

Bonificación : aquí está la página de manual de rsync , y si desea probar la velocidad de su disco duro, bonnie ++ es una buena opción, y para la velocidad de su red, pruebe iperf .


* La publicación tiene casi diez años, pero a los motores de búsqueda les gusta, y la sigo viendo. Es una buena pregunta, y no creo que la respuesta principal a "cómo acelerar rsync" deba ser "usar cp en su lugar".


1
Con respecto al ítem 7) podría mejorar mucho más el rendimiento usando un HDD tradicional como fuente, extendiendo el buffer de lectura anticipada usando "blockdev --setra 8192 / dev / sdX". Así que tengo la intención de reducir la cabeza busca.
user2480144

Descubrí que S (manejo de archivos dispersos) es realmente lento. Eliminarlo lo hizo mucho más rápido
Sammy Guergachi

2

No dice qué distribución de tamaño tienen sus archivos. Si hay muchos archivos pequeños, esto reducirá la velocidad de transferencia general al aumentar la latencia del movimiento del cabezal tanto en las unidades de origen como de destino, ya que la herramienta abre nuevos archivos y el sistema operativo mantiene entradas de directorio y otros metadatos (como el diario del sistema de archivos si está utilizando diario de metadatos como ext3 / ext4 y NTFS (por defecto) actualizado durante la transferencia. Un proceso de copia de archivos solo "entrará en su ritmo" para objetos más grandes, cuando ocurra una simple transferencia masiva.


0

Definitivamente quieres probar rclone . Esto es una locura rápido:

$ tree / usr [...] 26105 directorios, 293208 archivos

$ sudo rclone sync / usr / home / fred / temp -P -L --transfers 64

Transferido: 17.929G / 17.929 GBytes, 100%, 165.692 MBytes / s, ETA 0s Errores: 75 (reintentar puede ayudar) Cheques: 691078/691078, 100% transferido: 345539/345539, 100% Tiempo transcurrido: 1m50.8s

Esta es una copia local desde y hacia un SSD LITEONIT LCS-256 (256GB).

Puede agregar --ignore-checksum en la primera ejecución para hacerlo aún más rápido.


0

Evitar

  • -z/ --compress: la compresión solo cargará la CPU ya que la transferencia no se realiza a través de una red sino a través de la RAM.
  • --append-verify: reanudar una transferencia interrumpida. Esto suena como una buena idea, pero tiene el caso de falla peligrosa: cualquier archivo de destino del mismo tamaño (o mayor) que la fuente será IGNORADO. Además, comprueba el archivo completo al final, lo que significa que no se acelera significativamente --no-whole-fileal agregar un caso de falla peligrosa.

Utilizar

  • -S/ --sparse: convierte secuencias de nulos en bloques dispersos
  • --partialo -Pcuál es --partial --progress: guarde los archivos parcialmente transferidos para reanudarlos en el futuro. Nota: los archivos no tendrán un nombre temporal, así que asegúrese de que nada más espere usar el destino hasta que se haya completado la copia completa.
  • --no-whole-filepara que cualquier cosa que deba reenviarse use la transferencia delta. Leer la mitad de un archivo transferido parcialmente suele ser mucho más rápido que volver a escribirlo.
  • --inplace para evitar la copia de archivos (pero solo si nada está leyendo el destino hasta que se complete la transferencia completa)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.