Comment puis-je accélérer les opérations sur des fichiers épars avec tar, gzip, rsync?

9

J'ai un fichier clairsemé. ( du -hrapports 3G et du -h --apparent-sizerapports 100G.) Jusqu'à présent, tout va bien.

Maintenant, lorsque je veux compresser le fichier en utilisant tarou l'envoyer sur le réseau en utilisant rsync, il faudra autant de temps que la 3G. Il semble que ces outils lisent tous les zéros.

Je pensais que les trous étaient en quelque sorte marqués et ces outils pouvaient en quelque sorte les sauter?

Il n'y a probablement aucun problème avec mon fichier?

Est-ce une fonctionnalité manquante dans taret rsyncpour ne pas rechercher les fichiers épars? J'ai utilisé le tarparamètre --sparse, mais cela n'a pas accéléré les choses. Le rsyncparamètre non plus --sparse.

Existe-t-il un moyen d'accélérer ces outils sur des fichiers clairsemés?

adrelanos
la source

Réponses:

7

bsdtar(au moins à partir de libarchive3.1.2) est capable de détecter des sections clairsemées en utilisant l' FS_IOC_FIEMAPioctl sur les systèmes de fichiers qui le prennent en charge (bien qu'il prenne également en charge un certain nombre d'autres API), cependant, au moins dans mon test, étrangement, il est pas en mesure de gérer les tarfichiers qu'il génère lui-même (ressemble cependant à un bogue).

Cependant, utiliser GNU tarpour les extraire fonctionne, mais GNU tar ne peut pas gérer certains des attributs étendus pris en charge par bsdtar.

Donc

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

fonctionne tant que les fichiers n'ont pas d'attributs étendus ou de drapeaux.

Cela ne fonctionne toujours pas pour les fichiers qui sont entièrement clairsemés (seulement des zéros) car l' FS_IOC_FIEMAPioctl retourne alors 0 étendue et il semble que bsdtarne gère pas cela correctement (un autre bogue?).

star( Schily tar ) est une autre implémentation de tar open source qui peut détecter des fichiers épars (utilisez l' -sparseoption) et n'a pas ces bogues bsdtar(mais n'est pas empaqueté par de nombreux systèmes).

Stéphane Chazelas
la source
2

Cet article contient quelques suggestions utiles pour rsyncau moins:

Problèmes

Utilisation rsync --sparse works, mais provoque un énorme montage d'écritures de disque inutiles. La modification de 10 octets sur une longueur de 50 Go (1 Go utilisé) ne devrait entraîner l'écriture que d'un ou deux blocs, ce qui entraîne l'écriture de 1 Go. Ceci est lent et peut ne pas être bon pour la longévité des disques.

Utiliser des rsync --inplaceœuvres, mais crée des fichiers non clairsemés.

Vous ne pouvez pas utiliser --sparse et --inplace en même temps :-( ceci est interdit par rsync. Rsync: --sparse ne peut pas être utilisé avec --inplace

Solution

Si vous utilisez --inplace pour mettre à jour un fichier clairsemé préexistant, le fichier restera clairsemé et n'aura qu'un petit nombre de blocs écrits. Ce n'est que lorsque rsync --inplace crée un fichier qu'il le rend non clairsemé.

La solution consiste donc à créer un fichier clairsemé, correspondant à la longueur correcte et vide sur la machine cible pour chaque fichier de la machine source - si le fichier n'est pas encore présent sur la machine cible.

Ensuite, rsync --inplace fonctionnera comme prévu, laissant les fichiers épars épars et écrivant uniquement les blocs modifiés sur le disque.

Donc, si j'ai bien lu, vous voulez d'abord créer un fichier clairsemé vide sur la cible. Vous pouvez le faire avec

truncate -s 3G filename

Vous pouvez ensuite utiliser rsync --inplacepour copier les fichiers. Cela ne devrait être nécessaire qu'une seule fois.


Le même article suggère d'utiliser Virtsync qui est

un outil de ligne de commande Linux commercial de 49 $ pour synchroniser le contenu de fichiers volumineux (tels que des images de disque de machine virtuelle et des bases de données).

Cela pourrait être la meilleure solution si vous êtes prêt à payer car cela semble être écrit spécifiquement pour ce type de situation.

terdon
la source