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.

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« .

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.

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.