Copia de archivos con multihilo rápido parsyncfp | INTROSERV
EUR
european

EUR

usa

USD

Spanish Es
Ex. VAT Ex. VAT 0%

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.

Warning

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

Info

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.

Info

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.

Warning

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.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA