TL; DR
La fonction de défragmentation de Btrfs est spécifique à la correction de la fragmentation des métadonnées de dossier et du contenu des fichiers, tandis que la fonction d'équilibre a été créée pour " équilibrer " (d'où le nom) la quantité de données partagées entre les disques chaque fois qu'un disque est ajouté ou supprimé. Bien qu'ils aient un certain chevauchement théorique dans ce qu'ils font, ils ne sont pas directement liés, donc la documentation ne relie pas les deux fonctionnalités.
Réponse détaillée ci-dessous. Notez bien sûr que ma longue réponse est dans l'espoir qu'elle aidera ceux qui n'ont pas le contexte complet des problèmes rencontrés.
Allocation de morceaux
Un concept important avec btrfs est l'allocation de morceaux. Lorsque vous écrivez des données dans btrfs, il écrit ces données dans un bloc "actuel", généralement 1 Go en taille 1 . Si le bloc "actuel" devient plein, il alloue un nouveau bloc. Si un bloc existant est vidé, son espace de stockage est rendu disponible pour une réallocation lorsqu'un nouveau bloc est nécessaire.
Si le système de fichiers utilise plusieurs lecteurs avec les profils de stockage "dup", "single" ou "raid1" , l'allocateur de blocs préfère toujours placer le prochain nouveau bloc sur le (s) lecteur (s) avec le plus d'espace libre disponible. Cela garantit, en général, que les lecteurs sont utilisés de manière égale.
Comment l'équilibre fait sa chose
La fonction d'équilibre fonctionne en prenant des blocs de données existants et en les réécrivant dans le bloc "actuel". Lorsqu'un segment existant est vidé de cette manière, il est automatiquement mis à la disposition de l'allocateur. Si le bloc existant en cours de vidage n'était pas plein au départ (peut-être que les anciennes données du bloc ont été supprimées), le résultat net est la libération de l'espace disque puisque le bloc le plus récent est "plus serré" avec les données pertinentes.
C'est la partie qui pourrait, en théorie, être utilisée dans le cadre d'une stratégie de défragmentation , ce qui, selon moi, est la raison pour laquelle beaucoup de gens pensent qu'elle le fait déjà. Cependant, bien sûr, la fonction d'équilibre a été conçue dans un but spécifique, c'est pourquoi elle ne regarde pas le contenu du fichier. Il vérifie uniquement si les données qu'il retire des blocs existants sont pertinentes 2 avant de copier ces données dans le nouveau bloc.
D'où vient la partie Balance ?
Lorsque vous ajoutez un nouveau lecteur au système de fichiers, l'allocateur aura d'abord tendance à écrire toutes les nouvelles données sur le nouveau lecteur, principalement parce qu'il a plus d'espace libre disponible que les lecteurs existants. En réécrivant tous les morceaux, tous les morceaux initialement équilibrés sont écrits uniquement sur le nouveau lecteur. Une fois égalisé (équilibré), le reste des données sera également réparti entre les disques.
Scénario d'équilibre typique:
J'ai 2x 500 Go de disques avec 240 Go utilisés sur chacun; J'ajoute un autre lecteur de 500 Go. J'aurais généralement:
- lecteur a: 240 Go utilisé
- lecteur b: 240 Go utilisé
- lecteur c: 0 Go utilisé
Je commence un équilibre de toutes les données. Environ un quart du solde, je suis susceptible de voir une situation similaire à la suivante:
- conduire un: 180 Go utilisé
- lecteur b: 180 Go utilisé
- lecteur c: 120 Go utilisé
À environ un tiers, il semble équilibré:
- lecteur a: 160 Go utilisé
- lecteur b: 160 Go utilisé
- lecteur c: 160 Go utilisé
Vous pouvez bien sûr arrêter l'opération d'équilibrage à ce stade, bien qu'il existe des raisons (bonnes et mauvaises) pour lesquelles vous voudrez peut-être la laisser se terminer 3 .
Comment se produit la fragmentation dans btrfs
Btrfs est une vache ( copie sur écriture système de fichiers), ce qui signifie que les données sont jamais trop écrit 4 . Si vous disposez d'un fichier de 100 Mo existant et que vous écrasez une partie de 1 Mo du fichier, cette partie de 1 Mo n'est pas écrite sur les données existantes sur le lecteur. Au lieu de cela, il est écrit ailleurs dans le bloc "actuel". Btrfs garde une trace de l'endroit où ces "fragments" de nouvelles données sont stockés. Ceci est très utile pour maintenir des instantanés des données car cela signifie que les anciennes données sont conservées par défaut. Parce que les SSD, d'une manière très similaire, n'écrasent jamais non plus les données, ce mécanisme CoW se prête bien à permettre aux SSD de maintenir leur durée de vie et leurs performances.
Où Defrag intervient
Indépendamment des avantages, certains fichiers sont écrasés très souvent (généralement des fichiers de base de données), donc finissent par avoir des centaines de ces fragments. Avec les SSD, il y a peu de pénalité de performance à court terme. Mais avec les entraînements de broche, la pénalité de performance est sévère.
Une solution est bien sûr d'utiliser la fonction de défragmentation de btrfs. L'opération de défragmentation réécrit le contenu du fichier dans le bloc actuel dans l'ordre logique de son état actuel, réduisant ainsi les fragments en un grand ensemble de données de 100 Mo au lieu de nombreuses pièces distinctes.
Une autre solution consisterait à utiliser la fonction "nocow" spécifiquement pour des fichiers comme celui-ci. La fonction nocow entraîne l'écrasement du fichier sur place. Méfiez-vous qu'il y a des mises en garde à ne pas faire 5 6 .
Résumé à nouveau
La balance se penche sur les morceaux et les rayures - et n'est pas réellement au courant du contenu du fichier, sauf si les données dans ces morceaux sont toujours pertinentes.
L'opération de défragmentation examine les données de dossier et le contenu de fichier individuel et réécrit les données de manière aussi contiguë que possible. L'inconvénient est avec des instantanés où la défragmentation provoque la duplication et l'utilisation supplémentaire du lecteur.
Remarques:
Bien que les morceaux aient généralement une taille de 1 Go, ils peuvent être plus gros ou plus petits. Lorsque vous utilisez des types de raid, les morceaux sont généralement répartis sur plusieurs disques en multiples de 1 Go. Par exemple, 5 disques avec raid0 se traduisent généralement par une bande de 5 Go composée de morceaux de 1 Go en cours d'écriture sur chaque disque.
Btrfs utilise des "références" pour le contenu du fichier. Lorsqu'une partie d'un fichier est écrasée, le système de fichiers en direct "référence" l'emplacement où ces données ont été écrites. Cependant, un instantané peut toujours "référencer" l'ancien emplacement. S'il n'y a pas d'instantané - ou si l'ancien instantané est supprimé, il ne reste plus aucune référence "référence" faisant référence au contenu écrasé d'origine. Ce contenu est alors considéré comme non pertinent et ne sera pas copié avec les autres données pertinentes dans l'opération de solde.
À ce stade, en supposant que le stockage utilise le simple profil "unique" 7 , les premiers 160 Go équilibrés seraient tous déplacés vers le nouveau lecteur - mais également à ce stade, il reste encore environ 320 Go à équilibrer. Le reste serait équilibré également entre les disques. Avec les broches, vous voudriez idéalement équilibrer seulement 160 morceaux avant que btrfs rééquilibre les 3 disques pour une meilleure "diffusion" des données. Avec les disques SSD, en essayant de maintenir un même « propagation » des données devient très compliqué, inutile probable, et beaucoup plus susceptibles très mauvais pour la durée de vie de SSD.
L'exception est la fonction "nocow".
S'il y a des instantanés, la défragmentation du fichier "en direct" fait que les instantanés et le fichier "en direct" se réfèrent à des emplacements de données divergents sur le disque, provoquant la duplication des données et occupant ainsi un espace disque supplémentaire. Lorsqu'une fonction de déduplication à usage général devient disponible, ce ne sera plus autant un problème.
L'utilisation de nocow signifie que btrfs ne gère pas les sommes de contrôle pour le contenu du fichier.
Avec la plupart des types de raid (raid1 est l'exception), la "répartition" sur les disques est inutile car les bandes sont généralement écrites sur tous les disques de toute façon.
Peut-être que regarder le code source de la commande pourrait aider
Préférer
btrfs balance start
Et puis sur la chaîne de commande
Je pourrais lui donner un deuxième regard mais je ne vois aucune référence à la défragmentation sur les structures ni les appels à ioctl (). Il n'y a donc pas de défragmentation explicite.
Tout ce qu'il fait, c'est copier d'un endroit à un autre et utiliser l'allocateur par défaut dans le processus. Pris d'ici
Ainsi, en fonction du mode d'allocation, de l'espace libre sur le périphérique, etc., vous pouvez dire que btrfs allouera de telle manière que la défragmentation ne sera pas nécessaire. Que vous pourriez considérer comme une forme de défragmentation implicite.
HTH
la source
L'équilibre fonctionne au niveau du bloc; les morceaux sont la façon dont Btrfs implémente la redondance de raid. Il ne fait rien au niveau de Btree et ne défragmente pas.
la source
Dans le cas où vous utilisez un média à latence d'accès élevée, la framentation compte toujours, quel que soit le système de fichiers utilisé. Une recherche reste une recherche, une période.
la source
La défragmentation est surfaite. Bien sûr, sur un FAT16, cela fait une réelle différence, mais pas sur quelque chose de moderne, dans la plupart des cas. En effet, le rééquilibrage améliorera l'organisation de votre système de fichiers et les fichiers seront moins fragmentés.
la source