Qu’est-ce que la déduplication dans OpenZFS ?
- Définition de la déduplication : dans OpenZFS, avant d’écrire des données sur le disque, le système vérifie si ces données existent déjà sur le disque ; si c’est le cas, il n’effectue pas une nouvelle écriture et ajoute à la place une référence vers la copie existante.
- Les défis de la déduplication : il est difficile de vérifier si les données sont déjà présentes sur le disque et d’en connaître l’emplacement. Cela nécessite des entrées/sorties (IO) supplémentaires, ce qui peut entraîner une baisse des performances.
Comment fonctionne la déduplication ?
- Principe de fonctionnement : lorsque la déduplication est activée, un bloc de données est préparé et sa somme de contrôle est calculée. Auparavant, l’allocateur metaslab attribuait l’espace, mais lorsque la déduplication est activée, la somme de contrôle est recherchée dans la table de déduplication.
- Table de déduplication : elle est stockée sous la forme d’une table de hachage utilisant la somme de contrôle comme clé, et l’emplacement sur disque ainsi que le nombre de références comme valeurs. Elle est considérée comme faisant partie des métadonnées du pool.
Les problèmes de la déduplication traditionnelle
- Problème de la table de déduplication : la déduplication traditionnelle est implémentée à l’aide de l’objet de table de hachage sur disque d’OpenZFS. Il s’agit d’une structure complexe, peu adaptée à des usages comme la déduplication.
- Utilisation mémoire : la lecture de la table de déduplication est mise en cache dans l’ARC et, avec suffisamment de RAM, il est possible de réduire la partie lecture des mises à jour de la table.
- Problème des entrées uniques : l’espace nécessaire pour suivre les entrées uniques dans la table de déduplication pose problème. Les blocs dont le nombre de références est de 1 occupent de l’espace dans la table de déduplication et, si les mêmes données ne sont pas réécrites, ce coût ne peut pas être amorti.
Comment la déduplication rapide résout-elle le problème ?
- Réduction de la liste des entrées actives : pour réduire l’utilisation mémoire, l’empreinte mémoire de la liste des entrées actives a été réduite. Dans la nouvelle table de déduplication, la partie « valeur » d’une entrée a été ramenée à 72 octets.
- Journal de déduplication : au lieu de la liste des entrées actives, un journal est utilisé pour enregistrer les modifications, puis ce journal est rejoué lors de la récupération après incident. Le journal est conservé en mémoire pour permettre des recherches rapides.
- Vidage incrémental du journal : pour maîtriser la taille du journal, une partie de celui-ci est écrite dans le ZAP à chaque transaction. Le vidage du journal est accéléré en cas de pression mémoire.
Résumé de GN⁺
- La nouvelle fonctionnalité « FastDedup » d’OpenZFS a été développée pour résoudre les problèmes de la déduplication traditionnelle. Elle réduit l’utilisation mémoire et permet une gestion plus efficace des données grâce à un journal.
- La déduplication n’est utile que pour certains workloads et peut toujours être inefficace dans un usage général. Cela s’explique par le surcoût important de gestion de la table de déduplication.
- Parmi les projets offrant une fonctionnalité comparable, on peut citer la déduplication de Btrfs, qui peut constituer une alternative sur d’autres systèmes de fichiers.
1 commentaires
Avis Hacker News
J’ai cliqué à cause du titre, mais même sans m’intéresser à ZFS, j’ai fini par lire presque tout l’article. Les explications étaient claires, et j’ai particulièrement apprécié le thème CSS mobile. Un résumé concis se trouve en bas de l’article.
Au-delà de la discussion sur
copy_file_range, ce serait bien de pouvoir repérer dans le système de fichiers les fichiers de 1 Mo ou plus ayant le même hash, puis d’appliquer la déduplication de manière sélective.Le problème de la déduplication traditionnelle, c’est que la surcharge est trop importante, donc en dehors de certaines charges de travail précises, il est difficile d’en tirer un réel bénéfice. J’ai constaté un gain de réduction de 3:1 grâce à la déduplication/compression sur des charges de travail VMWare avec des baies Pure et Dell/EMC.
L’efficacité de la déduplication dépend fortement de la taille des blocs hachés. Plus les blocs sont petits, plus la probabilité de trouver des blocs correspondants augmente. Personnellement, je préfère une taille de bloc de 4 Ko.
Je voudrais une déduplication « hors ligne » ou « paresseuse ». Quand la déduplication est activée, chaque écriture et chaque libération exigent des consultations et des écritures dans la table de déduplication. Je veux que l’écriture des données se termine rapidement.
J’attends la déduplication rapide avec beaucoup d’enthousiasme. J’aurais aimé utiliser la déduplication ZFS pour les données d’ArchiveBox. Il semble que cela pourrait permettre d’archiver beaucoup d’URL tout en laissant le système de fichiers tout compresser.
J’utilise la déduplication ZFS pour une archive personnelle, et cela réduit actuellement l’espace disque par trois. ZFS a très bien fonctionné du point de vue de la fiabilité et a permis d’éviter des pertes de données.
La déduplication générale est séduisante en théorie, mais en pratique elle fonctionne mal. IPFS essaie de dédupliquer les données avec des fragments de taille variable, mais en réalité cela ne change rien et ne fait qu’ajouter de la complexité.
Ce serait bien d’améliorer le matériel dédié des contrôleurs de disque pour qu’il puisse exposer au système les hash des blocs calculés pour des opérations comme l’ECC.
J’aimerais que l’API du système de fichiers ait une forme complètement différente. Les API de systèmes de fichiers de tous les OS sont figées à cause de la compatibilité.
Si les performances en écriture sont importantes, il n’est pas nécessaire de faire la déduplication au moment de l’écriture. Elle peut être effectuée plus tard, en parallèle et avec une faible priorité.