Les fichiers dits « sparse » sont alloués avec une taille supérieur à la taille réellement occupée sur le disque dur. Cela permet de n’occuper l’espace disque que si le fichier fait face à un accroissement. On les rencontre couramment en virtualisation où l’on parle aussi de « thin provisioning ». Le terme « sparse » se traduit par « clairsemé » en français et « thin provisionning » par « provisionnement allégé ».
L’option sparse de rsync n’est pas efficiente
Pour des transferts de fichiers par le réseau, rsync permet de respecter le caractère « sparse » du fichier grâce à l’option -S (ou –sparse), c’est à dire que le fichier cible n’occupera pas plus de place que le fichier source. Cependant cette option est peu efficiente par rapport à d’autres options. Plus précisément :
- En transfert par le réseau, la taille totale du fichier transitera par le réseau à moins d’utiliser -z. Or cette option de compression est loin d’être un réflexe sur réseau 1 Gbit et plus, car elle bride de débit maximum. De plus, cela restera plus lent que l’alternative ci-dessous.
- En transfert local sur le disque dur, la copie de fichier sera jusqu’à 5000 fois plus lente qu’avec un bête cp.
Alternative avec tar
Pour éviter ce désagrément on peut faire appel à une archive tar en mode sparse (-S). Le fichier obtenu peut ainsi être transféré via n’importe quel protocole pour être dé-taré sur place.
1 2 |
root@ordinateur:~# tar Scvf image.qcow2.tar image.qcow2 root@ordinateur:~# rsync image.qcow2.tar serveur-cible:/chemin/ |
Une variante consiste à utiliser tar en mode flux sur le réseau avec un pipe comme indiqué sur cette page How to copy sparse files faster que je me permets de citer en français : « il y a un type de fichier que rsync gère assez mal, c’est le fichier sparse, la documentation rsync indique qu’ils sont gérés de manière efficiente mais ce n’est simplement pas vrai« .
1 |
root@ordinateur:~# tar cvzSpf – image.qcow2 | ssh user@serveur-distant ‘(cd /tmp; tar xzSpf -)’ |
L’utilisation de tar conjointement avec SSH est une bonne idée pour un meilleur traitement des fichiers sparse, mais aussi pour remplir les trames réseau et accélérer les échanges par rapport à rsync, en particulier en cas de petits fichiers. Avec tar on exploite un réseau 1 Gbits jusqu’à 120 Mo/sec. Voir différent exemples ici ou encore celui qui suit pour un dossier entier.
1 |
root@ordinateur:~# tar -cS /dossier | ssh serveur-distant 'tar -xvf - -C /destination/' |
D’autres méthodes (cp, cpio, dd) sont proposées sur le site duserver.com.
Tests chronométrés
Voici ci-dessous un petit comparatif de transferts d’un fichier sparse de 5 Go avec différentes options de la plus lente à la plus rapide.
Rsync via réseau localhost et tunnel SSH (forte utilisation CPU)
- rsync standard : 24,6 s. Taille cible 5 Go, tout passe par le réseau, à proscrire.
- rsync -S : 23,8 s.
- rsync -Sz : 39,2 s.
Rsync local (forte utilisation CPU)
- rsync standard : 12,4 s. Taille cible 5 Go, à proscrire.
- rsync -S : 11,7 s.
- rsync -Sz : 39,1 s.
Tar pipe de l’exemple
- tar cvzSpf : 0,18 s.
Conclusion
Rsync demeure un magnifique outil de synchronisation différentielle en mode blocs qui a fait ses preuves et qui est répandu. Mais si l’on veut réaliser une copie de fichier sparse rapidement, mieux vaut utiliser une méthode comme le tar via le réseau. Bien entendu, les exigences en matière de performances ne sont pas les mêmes chez l’hébergeur cloud et chez le particulier ou l’association.
Je pense qu’il faut regarder l’option –sparse (-S) de rsync. Il doit être possible d’envoyer par le réseau, puisque rsync le supporte en natif
L’option sparse de rsync permet bien de respecter le caractère « sparse » du fichier à destination. Mais avec elle, la taille totale allouée transite par le réseau contrairement à tar. J’ai ajouté un exemple chronométré pour mieux se rendre compte.
Si on utilise l’option « –sparse » de rsync, il faut évidemment utiliser « –compress » (= -z) avec pour ne pas transmettre tels quels les « trous ».
Bonjour, merci pour votre méthode qui a le mérite de rendre rsync plus utilisable avec les fichiers sparse en situation réelle. J’ai corrigé mon article pour en tenir compte. Mais cela reste la méthode la plus lente. Selon moi, gérer les fichiers sparse de manière efficiente est une chose, utiliser la compression pour atténuer un effet indésirable en est une autre.