Btrfs balance-t-il également la défragmentation des fichiers?


9

Lorsque je lance btrfs filesystem balance, cela défragmente-t-il implicitement les fichiers? Je pourrais imaginer que l'équilibre réalloue simplement chaque extension de fichier séparément, en préservant la fragmentation existante.

Il y a une entrée dans la FAQ, "Que fait" l'équilibre "?" , ce qui n'est pas clair sur ce point:

L'équilibre du système de fichiers btrfs est une opération qui prend simplement toutes les données et métadonnées sur le système de fichiers et les réécrit à un endroit différent sur les disques, en passant par l'algorithme d'allocateur en cours de route. Il a été initialement conçu pour les systèmes de fichiers multi-appareils, afin de répartir les données plus uniformément sur les appareils (c'est-à-dire pour "équilibrer" leur utilisation). Ceci est particulièrement utile lors de l'ajout de nouveaux périphériques à un système de fichiers presque complet.

En raison de la façon dont l'équilibre fonctionne, il a également des effets secondaires utiles:

  • S'il y a beaucoup de blocs de données ou de métadonnées alloués mais non utilisés, un solde peut récupérer une partie de cet espace alloué. C'est la raison principale de l'exécution d'un solde sur un système de fichiers à un seul appareil.
  • Sur un système de fichiers dont la réplication est endommagée (par exemple, un RAID-1 FS avec un disque mort et supprimé), il forcera le FS à reconstruire la copie manquante des données sur l'un des périphériques actuellement actifs, restaurant la capacité RAID-1 du système de fichiers.

Réponses:


9

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:

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

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

  3. À 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.

  4. L'exception est la fonction "nocow".

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

  6. L'utilisation de nocow signifie que btrfs ne gère pas les sommes de contrôle pour le contenu du fichier.

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


Wow, excellente réponse. Je vois qu'il y a une grave pénurie d'informations pertinentes pour l'utilisateur de BTRFS, dans des livres ou similaires (plutôt contrairement à ZFS), ce qui semble contribuer à sa mauvaise réputation. Avez-vous un blog ou plus de bonnes choses comme ça?
Andrew Keech

1
Merci! Je devrais vraiment y apporter du contenu plus à jour. : - | Le temps manque cruellement: dogma.swiftspirit.co.za
zaTricky

6

Peut-être que regarder le code source de la commande pourrait aider

Préférer btrfs balance start

La commande 'btrfs filesystem balance' est obsolète, veuillez utiliser la commande 'btrfs balance start' à la place.

Et puis sur la chaîne de commande

"btrfs [filesystem] balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
"particular chunk type.  If filter list is not given balance all",
"chunks of that type.  In case none of the -d, -m or -s options is",
"given balance all chunks in a filesystem."

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

En fonction de l'allocation des objectifs et du mode d'allocation, l'algorithme recherche directement une étendue continue d'espace libre dans chaque groupe d'allocation approprié (un groupe en btrfs correspond à un bloc décrit ci-dessus

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


3

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.


0

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.


3
À moins que vous n'accédiez aux données du lecteur SSD, cela ne signifie rien du tout.
Matt

1
Cela ne répond pas à la question.
Karl Richter

-2

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.


6
La fragmentation n'est pas vraiment un problème pour ext2 / 3/4, xfs, jfs, etc., mais cela peut être un problème important pour btrfs. Voir btrfs.wiki.kernel.org/index.php/Gotchas qui dit "Les fichiers avec beaucoup d'écritures aléatoires peuvent devenir très fragmentés (10000+ étendus) provoquant la corbeille sur les disques durs et des pics excessifs de plusieurs secondes de charge CPU sur les systèmes avec un SSD ou une grande quantité de RAM. " Ce n'est pas une exagération, même pour les cas d'utilisation courants (fichiers téléchargés avec bittorrent, bases de données sqlite, etc.).
nemequ

2
La défragmentation peut faire une grande différence même avec des systèmes de fichiers plus modernes, en particulier une fois que le lecteur commence à être plein sur un disque dur conventionnel. Certains systèmes de fichiers le gèrent mieux que d'autres et certains types de fichiers sont bien pires que d'autres. Espace insuffisant, impossible d'optimiser les scénarios, les caches en lecture / écriture, la lecture anticipée, l'optimisation des applications, etc. ont tendance à en cacher beaucoup. Pour la plupart, les gens n'ont pas à s'en soucier et ne devraient s'inquiéter que s'ils ont réellement un problème grave qui pourrait être causé par la fragmentation.
jgmjgm
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.