ZFS: recompressez les fichiers existants après un changement d'algorithme de compression


14

J'ai un pool qui a été créé en 2011, en utilisant lzjb compression, et ce n'est que quelques années plus tard qu'une mise à niveau m'a permis de définir la compression lz4. J'estime qu'au moins 20% du contenu (par espace) sur le tableau a été créé avant 2013, ce qui signifie qu'il est toujours compressé à l'aide lzjb.

Je peux penser à quelques options pour résoudre ce problème et regagner (un peu) d'espace:

  1. Sauvegardez et restaurez dans un nouveau pool. Pas vraiment pratique, car je n'ai pas de stockage redondant suffisant pour contenir la copie temporaire. La restauration nécessiterait également que le pool soit hors ligne pendant plusieurs heures.

  2. Écrivez un script pour recopier n'importe quel fichier avec un horodatage antérieur à 2013. Potentiellement risqué, surtout s'il s'étouffe avec des espaces ou d'autres caractères spéciaux et finit par altérer le nom d'origine.

Existe-t-il un moyen d'obtenir que ZFS recompresse les blocs hérités à l'aide de l'algorithme de compression actuel? Un peu comme un gommage, mais guérissant la compression.

Une question connexe: existe-t-il un moyen de voir l'utilisation de chaque type d'algorithme de compression? zdb affiche simplement les statistiques globales de compression, plutôt que de les décomposer en algorithmes individuels.


2
Je suis sûr que vous avez nommé les deux seules options. Consultez également la discussion du problème 3013 pour savoir pourquoi cette fonctionnalité n'existe pas et vous ne voudrez peut-être pas du tout le faire.
Michael Hampton

2
lz4 est censé être au mieux 10% meilleur en compression que lzjb. Si 20% de vos données peuvent être compressées 10% mieux, vous obtiendrez au plus 2% d'espace libre en plus. Est-ce que ça vaut le coup?
pipe

1
Si vous écrivez un script shell pour effectuer la copie, ajoutez-le export LC_ALL=Cau début du script et tous les caractères spéciaux non ASCII des noms de fichiers seront conservés intacts. Garder les espaces et les tirets intacts est plus délicat, utilisez des guillemets doubles et --, par exemple cp -- "$SOURCE" "$TARGET".
pts

4
@pipe Space est un (très) petit avantage, mais je suis plus intéressé par la vitesse de décompression. À partir de la page de manuel FreeBSD zpool-features: "En règle générale, la compression lz4 est environ 50% plus rapide sur les données compressibles et 200% plus rapide sur les données incompressibles que lzjb. Elle est également environ 80% plus rapide sur la décompression, tout en donnant un taux de compression environ 10% meilleur. "
rowan194

@pts Je n'appellerais pas --"compliqué" d' obéir aux règles fondamentales de programmation du shell (guillemets doubles autour des variables ou à utiliser ). C'est aussi important que d'éviter l'injection SQL, par exemple.
glglgl

Réponses:


14

Vous devez recopier les données (complètes ou partielles) ou zfs envoyer / recevoir les données vers un nouveau pool ou système de fichiers ZFS.

Il n'y a pas d'autre option.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.