Copia de archivos con multihilo rápido parsyncfp
Introducción
parsyncfp es un envoltorio paralelo de rsync que acelera la transferencia de grandes colecciones de archivos ejecutando varios procesos rsync a la vez. Cada proceso sincroniza su propio fragmento de archivos, de modo que el ancho de banda y la CPU disponibles se utilizan de forma más eficiente que con un único flujo rsync.
Esta guía cubre cuándo parsyncfp resulta útil, cómo instalarlo y cómo realizar una transferencia básica entre dos servidores.
La copia paralela acelera las transferencias solo en discos rápidos y con una red estable. En discos lentos o sistemas de archivos montados por red (NFS, SMB, FUSE), aumentar el número de procesos paralelos a menudo no proporciona ninguna ganancia de velocidad y, en su lugar, puede sobrecargar el origen, el destino o el enlace entre ambos. Comience con un número reducido de procesos, mida el resultado y aumente la cantidad solo si los discos y la red pueden seguir el ritmo.
Cómo funciona parsyncfp
parsyncfp utiliza la utilidad fpart para dividir el árbol de archivos de origen en fragmentos de tamaño aproximadamente igual, y luego lanza varios procesos rsync en paralelo, uno por fragmento. Dado que fpart divide el árbol de forma incremental, parsyncfp puede empezar a transferir archivos antes de que finalice el escaneo completo del árbol de origen, lo cual es importante en árboles de directorios muy grandes.
La herramienta solo necesita instalarse en el servidor de origen. rsync gestiona el lado receptor como de costumbre.
El mismo autor mantiene un sucesor llamado parsyncfp2 (pfp2), que incluye correcciones de errores y mejoras respecto a parsyncfp y, además, admite el envío desde varios hosts de origen a la vez. Para nuevas implementaciones, parsyncfp2 es la opción recomendada. Esta guía trata sobre el parsyncfp clásico; la sintaxis de comandos de pfp2 es en gran medida compatible.
Cuándo es útil parsyncfp
parsyncfp ofrece la mayor ganancia cuando:
- el origen contiene millones de archivos pequeños, donde rsync dedica la mayor parte del tiempo a operaciones de metadatos en lugar de a la transferencia real de datos;
- tanto el origen como el destino están respaldados por almacenamiento rápido (NVMe, SSD o un RAID bien configurado);
- la red entre el origen y el destino es rápida y estable (1 Gbps o más, baja pérdida de paquetes);
- un único proceso rsync está limitado por la CPU o por el rendimiento por flujo, no por el disco ni por el enlace.
Para directorios pequeños, discos giratorios lentos o una red saturada, el rsync habitual suele ser suficiente.
El directorio ~/.parsyncfp
parsyncfp crea un directorio de caché llamado ~/.parsyncfp en el servidor de origen. Dentro encontrará el subdirectorio fpcache, que contiene el registro de fpart, los archivos PID de los procesos rsync en ejecución y los archivos de fragmentos que indican qué rutas debe copiar cada rsync. Los archivos de registro llevan fecha y no se sobrescriben entre ejecuciones, por lo que las ejecuciones anteriores pueden revisarse más tarde.
Si desea ejecutar varias instancias de parsyncfp al mismo tiempo, asigne a cada una una ubicación de caché independiente con la opción --altcache. parsyncfp detecta otras instancias en ejecución al iniciarse y avisa sobre ellas, de modo que las ejecuciones superpuestas accidentales se detectan a tiempo.
Instalación de las dependencias
El propio parsyncfp depende de rsync (el transporte) y de fpart (para dividir el árbol de origen en fragmentos). Instale ambos en el servidor de origen.
En Debian y Ubuntu:
apt-get install rsync fpart
En RHEL, CentOS Stream, AlmaLinux y Rocky Linux, fpart no está en los repositorios base. Active primero el repositorio EPEL y luego instale ambos paquetes:
dnf install epel-release dnf install rsync fpart
Algunos paquetes de EPEL dependen de paquetes del repositorio PowerTools o CRB, que está deshabilitado de forma predeterminada. Active el que corresponda a su versión:
# RHEL/AlmaLinux/Rocky Linux 9 y posteriores dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools
Si su distribución no incluye fpart en absoluto (por ejemplo, RHEL 10 o sus reconstrucciones en el momento de escribir esto), o prefiere no usar EPEL, compile fpart desde el código fuente. El repositorio oficial es el repositorio de fpart en GitHub; el README enumera un pequeño conjunto de dependencias de compilación (un compilador de C, make y las cabeceras estándar de la biblioteca C).
Instalación de parsyncfp
parsyncfp es un único script Perl alojado en GitHub. Descárguelo, hágalo ejecutable y muévalo a un directorio en su PATH para poder invocarlo sin escribir la ruta completa:
wget https://raw.githubusercontent.com/hjmangalam/parsy ncfp /master/parsyncfp chmod +x parsyncfp sudo mv parsyncfp /usr/local/bin/
Verifique que el script se ejecuta:
parsyncfp --help
Si aparece la pantalla de ayuda, parsyncfp está listo para usarse.
Configuración del acceso SSH al destino
parsyncfp ejecuta rsync a través de SSH, por lo que el servidor de origen debe poder iniciar sesión en el destino sin contraseña. Genere un par de claves en el origen (si aún no existe uno) y copie la clave pública al destino:
ssh-keygen ssh-copy-id user@target_host
Sustituya user@target_host por el nombre de usuario y la IP o el nombre de host de su servidor de destino. Después de este paso, el siguiente comando debería conectarse sin pedir una contraseña:
ssh user@target_host
Ejecución de una transferencia
Un comando parsyncfp típico tiene este aspecto:
parsyncfp --NP=8 --altcache=/dir/local/tmp --startdir=/dir/local/ www/ [email protected]:/var/dir/
Este comando inicia 8 procesos rsync, utiliza /dir/local/tmp como directorio de caché y copia el contenido de /dir/local/www a /var/dir/ en el host de destino 192.168.67.1.
Preste atención a la barra final en el argumento de origen: www/ copia el contenido del directorio www en el destino (como en el ejemplo anterior), mientras que www (sin barra) copia el propio directorio www, creando /var/dir/www/ en el destino. Este es el mismo comportamiento que el de rsync habitual.
Parámetros clave del comando
- --NP establece el número de procesos rsync paralelos. Un punto de partida razonable es de 4 a 8; aumente la cantidad gradualmente, y solo si los discos y la red aún no están saturados. Establecer --NP igual al número de núcleos de la CPU rara vez es la decisión correcta por sí sola.
- --altcache especifica un directorio de caché alternativo. Resulta útil cuando ejecuta varias instancias de parsyncfp a la vez, o cuando la ubicación predeterminada está en almacenamiento lento. Evite apuntarlo a una ubicación respaldada por tmpfs (como /tmp en muchas distribuciones), ya que las listas de fragmentos de árboles de origen muy grandes pueden crecer bastante y no conviene que consuman RAM.
- --startdir establece el directorio de trabajo utilizado como base para las rutas de origen que siguen.
- Los argumentos posteriores a --startdir son los directorios de origen a copiar (uno o varios, separados por espacios), seguidos del destino con el formato de rsync user@host:/path/.
Para ver la lista completa de opciones, ejecute parsyncfp --help o consulte la documentación oficial.
Opciones adicionales útiles
Una vez que la transferencia básica funciona, vale la pena conocer algunas opciones para las ejecuciones en producción:
- --maxbw=500000 limita el ancho de banda total utilizado por todos los procesos rsync, en KB/s. Útil cuando el enlace se comparte con otros servicios.
- --maxload=12 pausa la creación de nuevos procesos rsync en cuanto la carga media del sistema supera el valor indicado. Útil en servidores de origen muy ocupados, pero consulte la advertencia de abajo antes de usarla.
- --chunksize=5G controla el tamaño de cada fragmento de fpart. Los fragmentos más grandes reducen la sobrecarga por fragmento en transferencias con muchos archivos pequeños; los fragmentos más pequeños mejoran el paralelismo en transferencias con pocos archivos muy grandes.
- --rsyncopts="-a -s -x" permite pasar indicadores adicionales directamente a los procesos rsync subyacentes. Úselo para activar la compresión (-z), establecer un tamaño de bloque personalizado o aplicar otros ajustes de rsync. No pase --delete a través de --rsyncopts; consulte la sección Limitaciones más abajo para saber por qué esto no es seguro.
- --verbose=2 aumenta el nivel de detalle del registro, lo que facilita la resolución de problemas en las primeras ejecuciones.
El autor original ha documentado un problema conocido con --maxload: cuando parsyncfp pasa por ciclos repetidos de suspensión y reanudación, es posible que algunos archivos de origen no se transfieran al destino. Si utiliza --maxload, establezca el umbral lo suficientemente alto para que las suspensiones nunca se activen, o verifique el resultado con una comprobación de coherencia independiente una vez finalizada la transferencia.
Limitaciones
Incluso en hardware adecuado, parsyncfp tiene compromisos que conviene conocer antes de aumentar el número de procesos:
- parsyncfp no admite de forma segura la opción --delete de rsync. Cada proceso rsync paralelo ve solo su propio fragmento del origen, de modo que si se pasa --delete, cada proceso intentará eliminar en el destino los archivos que no estén en su fragmento, es decir, archivos que legítimamente pertenecen a otros fragmentos. Esto puede borrar grandes partes del destino. Utilice rsync habitual (o un paso de limpieza independiente) cuando necesite la semántica de --delete.
- parsyncfp no preserva un orden global de los archivos entre los procesos rsync paralelos, por lo que el orden en que los archivos aparecen en el destino no es predecible. Esto solo importa para flujos de trabajo que dependan de las marcas de tiempo de los archivos o del orden del listado de directorios durante la propia copia.
- En matrices de discos duros (HDD), muchos procesos rsync paralelos convierten lo que sería un patrón de lectura secuencial en uno casi aleatorio, lo que puede ser más lento que un único rsync. Los discos SSD y NVMe se ven mucho menos afectados.
- En sistemas de archivos con un número muy elevado de archivos pequeños, la sobrecarga de metadatos por archivo puede dominar el tiempo de transferencia. El paralelismo ayuda hasta cierto punto y luego se estanca.
- Cada proceso rsync abre su propia conexión SSH al destino, por lo que valores altos de --NP multiplican la sobrecarga de establecimiento de conexión. En enlaces WAN con pérdida de paquetes o alta latencia, esto puede empeorar la congestión en lugar de mejorarla. En ese caso, un número menor de procesos con un rsync bien ajustado (compresión, tamaño de bloque mayor) suele rendir mejor que muchos procesos en paralelo.
Véase también
Si parsyncfp resulta ser más pesado de lo que necesita, el paquete fpart también incluye fpsync, un envoltorio paralelo de rsync más sencillo del mismo autor. Utiliza la misma idea de fragmentación, pero con menos opciones, y suele bastar para transferencias puntuales.