He estado usando un rsyncscript para sincronizar datos en un host con los datos en otro host. Los datos tienen numerosos archivos de pequeño tamaño que contribuyen a casi 1.2TB.
Para sincronizar esos archivos, he estado usando el rsynccomando de la siguiente manera:
rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/
Los contenidos de proj.lst son los siguientes:
+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *
Como prueba, tomé dos de esos proyectos (8,5 GB de datos) y ejecuté el comando anterior. Al ser un proceso secuencial, tiene 14 minutos y 58 segundos para completar. Entonces, para 1.2TB de datos tomaría varias horas.
Si pudiera hacer varios rsyncprocesos en paralelo (usando &, xargso parallel), me ahorraría tiempo.
Intenté con el siguiente comando con parallel(después cdde ir al directorio de origen) y tardé 12 minutos y 37 segundos en ejecutarse:
parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .
Esto debería haber tomado 5 veces menos tiempo, pero no fue así. Creo que me estoy equivocando en alguna parte.
¿Cómo puedo ejecutar múltiples rsyncprocesos para reducir el tiempo de ejecución?
fuente

rsyncs es nuestra primera prioridad.rsyncs en paralelo es el foco principal ahora.Respuestas:
Los siguientes pasos hicieron el trabajo por mí:
rsync --dry-runprimero para obtener la lista de archivos que se verían afectados.cat transfer.logaparallelpara ejecutar 5rsyncs en paralelo, de la siguiente manera:Aquí, la
--relativeopción ( enlace ) aseguró que la estructura de directorios para los archivos afectados, en el origen y el destino, permanezca igual (dentro del/data/directorio), por lo que el comando debe ejecutarse en la carpeta de origen (por ejemplo/data/projects).fuente
splity alimentar esos nombres de archivos en paralelo. Luego use rsync--files-frompara obtener los nombres de archivo de cada archivo y sincronizarlos. rm backups. * split -l 3000 backup.list backups. ls copias de seguridad. * | paralelo --line-buffer --verbose -j 5 rsync --progress -av --files-from {} / LOCAL / PARENT / PATH / REMOTE_HOST: REMOTE_PATH /receiving file list ... donecreated directory /data/.--info=nameen lugar de-v, y obtendrá solo los nombres de los archivos y directorios. Es posible que también desee usar --protect-args en la transferencia interna 'rsync' si algún archivo puede contener espacios o metacaracteres de shell.Yo personalmente uso este sencillo:
Lo cual solo es útil cuando tienes más de unos pocos directorios no casi vacíos, de lo contrario terminarás teniendo casi cada
rsyncterminación y el último haciendo todo el trabajo solo.fuente
Desalentaría a cualquiera de usar la respuesta aceptada, una mejor solución es rastrear el directorio de nivel superior e iniciar un número proporcional de operaciones de sincronización.
Tengo un gran volumen zfs y mi fuente era un montaje cifs. Ambos están vinculados con 10G, y en algunos puntos de referencia pueden saturar el enlace. El rendimiento se evaluó usando
zpool iostat 1.La unidad fuente se montó como:
Usando un solo
rsyncproceso:el medidor io lee:
Esto en pruebas sintéticas (disco de cristal), el rendimiento para la escritura secuencial se acerca a 900 MB / s, lo que significa que el enlace está saturado. 130 MB / s no es muy bueno, y la diferencia entre esperar un fin de semana y dos semanas.
Entonces, construí la lista de archivos e intenté ejecutar la sincronización nuevamente (tengo una máquina de 64 núcleos):
y tuvo el mismo rendimiento!
Como alternativa, simplemente ejecuté rsync en las carpetas raíz:
Esto realmente aumentó el rendimiento:
En conclusión, como mencionó @Sandip Bhattacharya, escriba un pequeño script para obtener los directorios y paralelos. Alternativamente, pase una lista de archivos a rsync. Pero no cree nuevas instancias para cada archivo.
fuente
Una forma probada de hacer el rsync paralelo es: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync
fuente
find?--dry-runopción enrsync, tendría una lista de archivos que serían transferidos. ¿Puedo proporcionar esa lista de archivosparallelpara paralelizar el proceso?mkdir -p /dest-dir/{//}\;parte? Especialmente la{//}cosa es un poco confusa.Para sincronizaciones de múltiples destinos, estoy usando
Sugerencia: todas las conexiones ssh se establecen con claves públicas en
~/.ssh/authorized_keysfuente
Siempre busco en Google para rsync paralelo, ya que siempre olvido el comando completo, pero ninguna solución me funcionó como quería, ya sea que incluye varios pasos o necesita instalarse
parallel. Terminé usando este one-liner para sincronizar múltiples carpetas:-P 5es la cantidad de procesos que desea generar: use 0 para ilimitado (obviamente no recomendado).--bwlimitpara evitar usar todo el ancho de banda.-I %argumento proporcionado por find (directorio encontrado endir/)$(echo dir/%/ host:/dir/%/)- imprime directorios de origen y destino que rsync lee como argumentos. % es reemplazado por elxargsnombre del directorio encontrado porfind.Supongamos que tengo dos directorios en
/home:dir1ydir2. Corrofind /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'. Entonces, el comando rsync se ejecutará como dos procesos (dos procesos porque/hometiene dos directorios) con los siguientes argumentos:fuente