¿Cómo puedo acelerar las operaciones en archivos dispersos con tar, gzip, rsync?

9

Tengo un archivo escaso. ( du -hReporta 3G y du -h --apparent-sizereporta 100G.) Hasta ahora, todo bien.

Ahora, cuando quiero comprimir el archivo usando taro enviarlo a través de la red rsync, requerirá tanto tiempo como 3G. Parece que estas herramientas leen todos los ceros.

Pensé que los agujeros están marcados de alguna manera y estas herramientas podrían de alguna manera simplemente omitirlos

Es probable que no haya ningún problema con mi archivo?

¿Es esta una característica que falta tary rsyncno buscar archivos dispersos? Usé el tarparámetro --sparse, pero eso no aceleró las cosas. Tampoco el rsyncparámetro --sparse.

¿Hay alguna forma de acelerar estas herramientas en archivos dispersos?

adrelanos
fuente

Respuestas:

7

bsdtar(al menos desde libarchive3.1.2) es capaz de detectar secciones dispersas utilizando el FS_IOC_FIEMAPioctl en los sistemas de archivos que lo admiten (aunque también admite una serie de otras API), sin embargo, al menos en mi prueba, curiosamente, es no puede manejar los tararchivos que genera por sí mismo (aunque parece un error).

Sin embargo, usar GNU tarpara extraerlos funciona, pero luego GNU tar no puede manejar algunos de los atributos extendidos que admite bsdtar.

Entonces

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)

funciona siempre que los archivos no tengan atributos extendidos o marcas.

Todavía no funciona para archivos que son completamente escasos (solo ceros) ya que el FS_IOC_FIEMAPioctl luego devuelve la extensión 0 y parece bsdtarque no maneja eso correctamente (¿otro error?).

star( Schily tar ) es otra implementación de tar de código abierto que puede detectar archivos dispersos (use la -sparseopción) y no tiene esos errores bsdtar(pero muchos sistemas no la empaquetan).

Stéphane Chazelas
fuente
2

Este artículo tiene algunas sugerencias útiles para rsyncal menos:

Problemas

Usando rsync --sparse works, pero provoca una gran cantidad de escrituras de disco innecesarias. Cambiar 10 bytes en 50GB de largo (1GB usado) debería causar que solo se escriban uno o dos bloques, esto hace que se escriba 1GB. Esto es lento y posiblemente no sea bueno para la longevidad de los discos.

Usando rsync --inplacetrabajos, pero crea archivos no dispersos.

No puede usar --sparse y --inplace al mismo tiempo :-( esto no está permitido por rsync. Rsync: --sparse no puede usarse con --inplace

Solución

Si usa --inplace para actualizar un archivo disperso preexistente, el archivo permanecerá disperso y solo tendrá una pequeña cantidad de bloques escritos. Es solo cuando rsync --inplace crea un archivo que lo hace no disperso.

Entonces, la solución es crear un archivo correspondiente, correctamente alargado, vacío y disperso en la máquina de destino para cada archivo en la máquina de origen, si el archivo aún no está presente en la máquina de destino.

Luego, rsync --inplace funcionará según lo previsto, dejando dispersos los archivos dispersos y solo escribiendo los bloques modificados en el disco.

Entonces, si lo leí correctamente, primero desea crear un archivo disperso vacío en el destino. Puedes hacer esto con

truncate -s 3G filename

Luego puede usar rsync --inplacepara copiar los archivos. Esto solo debería ser necesario una vez.


El mismo artículo sugiere usar Virtsync, que es

una herramienta de línea de comandos de Linux comercial de $ 49 para sincronizar el contenido de archivos enormes (como imágenes de discos de máquinas virtuales y bases de datos).

Esta podría ser la mejor solución si está dispuesto a pagarla, ya que parece estar escrita específicamente para este tipo de situación.

terdon
fuente