He estado usando un rsync
script 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 rsync
comando 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 rsync
procesos en paralelo (usando &
, xargs
o parallel
), me ahorraría tiempo.
Intenté con el siguiente comando con parallel
(después cd
de 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 rsync
procesos para reducir el tiempo de ejecución?
fuente
rsync
s es nuestra primera prioridad.rsync
s en paralelo es el foco principal ahora.Respuestas:
Los siguientes pasos hicieron el trabajo por mí:
rsync --dry-run
primero para obtener la lista de archivos que se verían afectados.cat transfer.log
aparallel
para ejecutar 5rsync
s en paralelo, de la siguiente manera:Aquí, la
--relative
opció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
split
y alimentar esos nombres de archivos en paralelo. Luego use rsync--files-from
para 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 ... done
created directory /data/
.--info=name
en 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
rsync
terminació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
rsync
proceso: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-run
opción enrsync
, tendría una lista de archivos que serían transferidos. ¿Puedo proporcionar esa lista de archivosparallel
para 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_keys
fuente
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 5
es la cantidad de procesos que desea generar: use 0 para ilimitado (obviamente no recomendado).--bwlimit
para 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 elxargs
nombre del directorio encontrado porfind
.Supongamos que tengo dos directorios en
/home
:dir1
ydir2
. 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/home
tiene dos directorios) con los siguientes argumentos:fuente