Acelerar / evitar el cálculo de listas de archivos rsync

12

Utilizo rsync 3.1.1 para mantener sincronizados dos discos, uno de los cuales está en la red y montado como un recurso compartido de samba /mnt/ROUTER_WD_2TB/. Esta es la fuente, con una velocidad máxima de 30-40 MB / s debido a las limitaciones de la red. El otro, el destino, se monta localmente (pico 110 MB / s) y es /mnt/BACKUP_HITACHI_2TB/.

Yo uso el siguiente comando rsync:

rsync  -haAXi --quiet --append-verify --delete /mnt/ROUTER_WD_2TB/* /mnt/BACKUP_HITACHI_2TB/.

Los discos contienen muchos archivos, la mayoría de ellos pequeños.

El problema es que rsync lleva bastante tiempo (10-20m) antes de comenzar a mover cualquier archivo, supongo porque tiene que calcular listas de archivos para una gran cantidad de archivos pequeños. Durante este período, la utilización de redes nuevas se ubica en un nivel bajo de 200-500 KB / s, mientras que al transferir archivos la velocidad es de aproximadamente 40 MB / s.

Suele suceder que rsync tarda unos 15 m en encontrar finalmente algo que tiene que copiar, luego tarda 5 segundos en copiarlo, luego continúa buscando otros archivos para copiar durante otros 5 minutos. Con todo, ¡una copia de archivo de 5 segundos termina durando 20 minutos!

¿Hay alguna medida que pueda tomar para evitar este largo período antes de copiar los archivos, aparte de excluir carpetas? ¿Puedo implementar algún tipo de "caché" para que rsync no tenga que reconstruir toda la lista de archivos desde cero?

AF7
fuente
1
¿Has probado una solución de este hilo? unix.stackexchange.com/questions/189878/…
UVV
@UVV No he hecho eso. puedo hacer eso, sin embargo 1) rsync ya no parece usar un núcleo completo en mi caso, por alguna razón (= no estoy seguro si estoy limitado por la CPU o si la limitación se encuentra en otro lugar) y 2) Esto es solo en una CPU de doble núcleo, por lo que incluso si la mejora fuera 2X, todavía habría un gran margen de mejora.
AF7
Sí, esto me parece una locura, ¿por qué rsync es tan lento en esto? Incluso con rsync "--size-only" parece tomar una eternidad para construir su lista de archivos incremental. ¿Por qué? ¡Puedo verificar manualmente los tamaños de archivo y determinar cuáles han cambiado mucho más rápido! ¿Qué está haciendo perder tanto tiempo y cómo desactivo estas características sofisticadas? EDITAR: Ah, no importa, tuve la bandera 'c' establecida por accidente. Sin las sumas de verificación es muy rápido en esto.
Ben Farmer

Respuestas:

5

En lo que rsynca usted respecta, está copiando entre dos árboles de archivos locales, por lo que deshabilita la mayoría de sus optimizaciones (incluido su algoritmo delta por el que es famoso). Si puede ejecutar un rsyncen su servidor remoto (para obtener un verdadero escenario cliente-servidor en su red) obtendrá una gran cantidad de tracción.

Sin embargo, aquí hay otras opciones a considerar

  1. Copiar sin preocuparse por eliminar archivos antiguos. Esto puede permitirle realizar una transferencia más rápida con más frecuencia y relegar la limpieza más lenta para decir, solo una vez al día:

    cp -au /mnt/ROUTER_WD_2TB/. /mnt/BACKUP_HITACHI_2TB/
    
  2. Utilice una variación del rsyncalgoritmo de eliminación predeterminado para evitar crear una lista completa de archivos antes de la transferencia:

    rsync -haAXi --quiet --delete --delete-during /mnt/ROUTER_WD_2TB/ /mnt/BACKUP_HITACHI_2TB/
    
  3. Divida los directorios de nivel superior en tareas separadas y ejecútelos en paralelo. Puede descubrir que si está vinculado a la E / S del disco, esto realmente no ayudará, y para los platos giratorios seguramente empeorará las cosas.

    for d in /mnt/ROUTER_WD_2TB/*
    do
        rsync -haAXi --quiet --delete --delete-during "$d" /mnt/BACKUP_HITACHI_2TB/ >"/tmp/rsync.${d/*\/}.log" 2>&1 &
    done
    wait
    cat /tmp/rsync.*.log
    rm -f /tmp/rsync.*.log
    

Si ninguna de estas sugerencias ayuda, entonces sería la pena añadir otra --verbosea rsyncver lo que está haciendo. Sospecho que está sacudiendo todos los archivos sin cambios, y si tiene suficientes archivos, esto simplemente lleva mucho tiempo.

roaima
fuente
--delete --delete-duringno lo hizo por mí, que todavía envió una lista de archivos incremental, sino que --delete --delete-beforefue directamente a:, lo building file listque parece un gran progreso. Yo creo que.
mlissner
No, eso es al revés, me temo. Si lo usa --delete-before, rsyncrealiza dos pases a través del árbol de archivos: uno para eliminar y el siguiente para copiar.
roaima
Gracias. En ese caso ... ¿alguna forma de evitar construir la lista incremental de archivos?
mlissner
@mlissner depende de varios factores diferentes. El más grande con diferencia es si está haciendo una copia local a local o local a remota.
roaima
Para mí, todo es local a local, ¿aunque uno de los locales es un disco USB?
mlissner
-2

puede usar -vvpara ver el registro completo de rsync.

namaiiee
fuente
2
¿Cómo respondería esto a la pregunta, es decir, cómo aceleraría esto?
Kusalananda
Podrías ver los registros, lo que muestra por qué tomó tanto tiempo iniciar rsync, tal vez hay archivos que puedes omitir de rsync para reducir el tiempo.
namaiiee