La forma más eficaz de reducir una copia de seguridad que utiliza enlaces duros

La forma más eficaz de reducir una copia de seguridad que utiliza enlaces duros

Tengo un disco de respaldo que contiene cientos de copias de seguridad de la misma máquina en diferentes fechas. La copia de seguridad se realizó con rsync y enlaces duros, es decir, si un archivo no cambia, el script de copia de seguridad simplemente crea un enlace duro al archivo en una copia de seguridad anterior. Entonces, si un archivo nunca cambia, esencialmente tiene una copia en el disco de respaldo, pero digamos 100 enlaces duros en cada directorio que representa la copia de seguridad de cada fecha (digamos back-1, back-2, ... back-n). Si quiero reducirlo, elimino un subconjunto de ellos, pero no todos. Supongamos que quiero eliminar back_5, back_6, ... back_10(solo como ejemplo, en mi escenario real hay muchos más). Luego trato de paralizarlo mediante:

echo back_5 back_6 back_10 | xargs -n 1 -P 0 rm -rf

Esto lleva varias horas. Entonces, ¿hay alguna forma más rápida de hacer esto?

Respuesta1

No puedo ver cómo usasxargosde esta manera es todo menos lento. Mi página de manual dice -P es el número de procesos y -n es el número de argumentos. No hay un valor especial para -P0, por lo que es probable que se ignore (o, si se respeta, no se obtienen procesos, lo que explicaría 24 horas sin nada). Y -n1se asegura de obtener unoejecutivo(2) para cada nombre de archivo, que es el más lento posible.

Dudo que hacer un paralelismo con este trabajo te ayude a conseguir mucho. yo pensaria solo

$ echo filenames ... | xargs rm -rf 

bastaría. Podrías experimentar con valores como -P4si lo deseas. PornoAl limitar el número de argumentos de la línea de comandos, minimiza las invocaciones /bin/rmy deja que proceda en serie a través de la caché de su disco.

Respuesta2

El df informa un número pequeño porque en su mayoría estás eliminando directorios, que son relativamente pequeños. Además, dependiendo del sistema de archivos, los cambios en los directorios y los cambios en la cantidad de enlaces a un archivo se registran y/o sincronizan con el disco inmediatamente, ya que son críticos para la recuperación de fallas y, por lo tanto, son más lentos.

¡Eso es en realidad un testimonio de la eficiencia de su vinculación!

Respuesta3

En mi experiencia, la mejor manera de acelerar las copias de seguridad basadas en rsync+hardlink era disminuir la cantidad de archivos que tiene.

Una gran cantidad de archivos pequeños ralentiza rsyncmucho.

Si puede organizar sus datos de tal manera que sus directorios, en su mayoría de archivos pequeños y de solo lectura, se pongan tarrojos, debería ver una aceleración significativa en su secuencia de comandos de respaldo. (Con herramientas como archivemount, puedes acceder a esos archivos sin extraerlos).

Paralelizar el script de copia de seguridad probablemente no ayudará o incluso podría ralentizarlo (el acceso al disco predecible es más óptimo).

Respuesta4

Esta es también una respuesta basada en la experiencia y no respaldada por datos concretos.

Encuentro que al eliminar muchos archivos en árboles similares con muchos enlaces cruzados, parece más rápido eliminar subárboles aislados en paralelo. Déjame intentar explicarlo con un diagrama:

topdir1
    |-a1
    |-b1
    |-c1

topdir2
    |-a2
    |-b2
    |-c2

topdir3
    |-a3
    |-b3
    |-c3

En lugar de eliminar topdir1, topdir2en topdir3paralelo, mi impresión es que es más rápido eliminar a1, en paralelo y luego pasar a b1, , y así sucesivamente. (Mi teoría para esto es que la desvinculación paralela múltiple de los "mismos" archivos causa contención por el recuento de referencias de enlaces de inodo, pero enfatizo que no he verificado esto con datos concretos).c1a2b2c2

for topdir in *
do
    echo "Removing $topdir..."
    for sub in "$topdir"/*; do rm -rf "$sub" & done
    wait
    rm -rf "$topdir"
done

información relacionada