Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Taille des chunks cdc Décidé

Une cible : min 512 Kio · moyenne 2 Mio · max 8 Mio, épinglés par tenant. On penche vers le gros — plus que restic — parce que le chiffrement convergent double le coût des métadonnées par chunk.

FastCDC découpe sur le clair, BLAKE3 nomme chaque chunk. Reste à fixer les trois bornes du découpage. C’est un choix quasi-irréversible : changer les paramètres change toutes les frontières, donc toutes les adresses — c’est un re-découpage complet du dépôt. On tranche une fois, prudemment.

L’arbitrage

Le curseur oppose deux coûts.

  • Petits chunks (~8–64 Kio) — meilleure granularité de dédup (modifs internes, fragments partagés entre fichiers), mais explosion des métadonnées, flot de vérifications d'existence pour un client stateless, et compression médiocre par chunk.
  • Gros chunks (~1–4 Mio) — index et manifestes légers, gros débit, peu d'aller-retours, compression par chunk déjà pleine ; en échange une granularité de dédup plus grossière (une modif ré-écrit ~un chunk entier, mais FastCDC borne déjà le rayon de souffle à un seul chunk).

Le gain réel des petits chunks est étroit : les fichiers identiques dédupliquent déjà entièrement (même fichier = même manifeste = même jeu de chunks), quelle que soit la taille. Ce qu’on gagnerait, c’est surtout la dédup de fragments partagés entre fichiers différents, et la dédup des gros fichiers mutables (images VM, bases, boîtes mail) édités en place — un cas précis, à valider par la mesure avant de payer pour lui.

Ce que font les voisins

Outilminmoyennemax
restic512 Kio~1 Mio8 Mio
rustic512 Kio~1 Mio8 Mio
borg512 Kio2 Mio8 Mio
kopia2 Mio4 Mio8 Mio
Cairn512 Kio2 Mio8 Mio

Deux constantes : min ≥ 512 Kio et max = 8 Mio partout. restic tire vers ~1 Mio de moyenne, borg vers 2 Mio, kopia jusqu’à 4 Mio. rustic hérite par défaut du chunker de restic (compatibilité des dépôts) mais reste le seul à exposer min/moyenne/max en configuration — précédent utile pour nous.

Le facteur décisif : nos métadonnées pèsent le double

Pourquoi Cairn doit pencher plus gros que restic Chez restic et borg, une clé de dépôt unique chiffre tout : le manifeste ne stocke qu'un identifiant de contenu par chunk (~32 o, le hash). Cairn fait du chiffrement convergentclé_chunk = BLAKE3_keyed(secret, chunk) — et cette clé ne peut pas être re-dérivée à la restauration (il faudrait le clair, précisément ce qu'on restaure). Il faut donc la stocker dans le manifeste, à côté de l'adresse : ~64 o par chunk, soit ≈ 2× restic. À taille de chunk égale, notre index et nos manifestes sont deux fois plus lourds.

Conséquence directe : le coût métadonnées est le seul qu’on ne peut pas récupérer après coup (contrairement à l’espace des blobs, que le GC finit par rendre). Donc dans le doute on vise un peu trop gros, et jamais plus petit que restic/borg.

Le piège : des paramètres non épinglés cassent la dédup

À figer par scope — sinon dédup silencieusement cassée Les paramètres de découpage — la table/seed gear de FastCDC et min/moyenne/max — doivent être épinglés par scope de dédup et rangés dans la config du tenant, exactement comme le profil de compression. Deux versions du client qui découpent différemment produisent des frontières différentes → des chunks différents → des adresses différentes → aucune dédup entre elles, sans le moindre message d'erreur. C'est le même mécanisme que restic, qui stocke son polynôme (degré 53, tiré au hasard) dans la config du dépôt pour que tous les clients découpent à l'identique.

La décision

min 512 Kio · moyenne 2 Mio · max 8 Mio, FastCDC en chunking normalisé (NC niveau 2) pour resserrer la distribution autour de la cible. En Rust : la crate fastcdc.

  • On ne descend à 1 Mio de moyenne que si une mesure sur une charge réelle riche en gros fichiers mutables montre un gain de dédup net.
  • On ne descend jamais sous 512 Kio de minimum : en dessous, le coût métadonnées, l'overhead par chunk (tag AEAD, framing) et le flot de vérifications d'existence dominent.
  • kopia va plus gros encore (2/4/8) : si l'index devient le goulot, c'est la direction — pas l'inverse.
Pas de corpus de référence — pour l'instant On ne sait pas encore ce que les clients sauvegarderont, donc on ne peut pas mesurer le meilleur réglage. On assume ce défaut raisonné (aligné borg) et on le remesurera dès qu'un corpus réel existera. Comme les paramètres vivent dans la config du tenant, on pourra ajuster le défaut des futurs dépôts sans toucher aux existants — un dépôt déjà en place garde ses paramètres (les changer = re-découpage complet).

Corollaire, traité au point Compression : à 2 Mio de chunk, chaque chunk se compresse pleinement seul — les dictionnaires zstd, utiles seulement sur de petits chunks, sont écartés.