Journal d'un Geek

La connaissance ne vaut que si on la partage

Défragmentation LVM

Le premier réflexe qu’aura tout être humain normalement constitué en lisant ce titre, c’est un peu d’incrédulité sur la fragmentation de LVM : ça fragmente, LVM ?

Non. Du moins pas de la même manière qu’on peut le concevoir pour les systèmes de fichier classiques : les fichiers et les répertoires qui se trouvent sur LVM ne fragmentent pas, du moins pas plus que ce que le filesystem qui s’y trouve ne le permet.

Par « fragmentation LVM », je fais référence à un problème qui n’arrive que lorsqu’on utilise de manière intensive les commandes d’agrandissement/réduction de LV. Apparaît alors un phénomène particulier : à force de libérer de petits espaces dans le VG (en réduisant les LV), et de réallouer d’autres espaces (en les agrandissant), chaque LV est réparti en une dizaine de petits morceaux (voire plus) un peu partout sur les PV.

Soyons clair : cela ne va pas impacter les performances (sauf dans des cas extrêmes), et cela n’empêche pas LVM de fonctionner correctement. Mais cela complique la tâche lorsqu’on doit libérer un espace libre contigu, par exemple pour changer un disque. Et puis, il faut avouer que c’est assez pénible à interpréter lorsqu’on utilise les commandes de LVM. Alors retroussons nos manches et réorganisons tout cela pour avoir quelque chose de propre !

 Etat des lieux

Pour faire simple, je vais montrer à quoi ressemblait mon ordinateur personnel après quelques années à revoir à la hausse ou à la baisse certains LV. Comme j’utilise plusieurs PV correspondant à des partitions réparties sur plusieurs disques, les agrandissements successifs de lv_home et lv_backup ont amené à une répartition assez anarchique de leurs segments sur mes PV.

Si vous n’avez pas le courage, voici un résumé :

  • Le lv_home est réparti sur 5 segments dont 3 sur le même PV ;
  • Le lv_backup est réparti sur 4 segments dont 2 sur le même PV. Il y en a même un qui utilise un seul extent !
  • Un PV a de l’espace libre au beau milieu de son espace, il serait judicieux de le déplacer à la fin.

Si vous vous demandez ce que sont ces /dev/md?, ce sont des périphériques RAID fournis par mdraid. En fait, mes disques sont découpés en partitions, mdraid fait un RAID 1 dessus, et LVM utilise ces périphériques comme PV.

 

Le principe du déplacement d’extents

LVM étant bien fait, il est parfaitement possible de déplacer les extents d’un Logical Volume tout en continuant d’utiliser l’ordinateur.  Pour cela, on utilise la commande pvmove. Pour fonctionner, cette commande procède comme suit :

  1. Elle crée un LV de la taille de la portion à déplacer, à un endroit qu’elle choisit, et le déclare en miroir ;
  2. Elle copie les données de l’ancien emplacement vers le nouveau. Le fait que le LV temporaire soit en miroir garantit que toute modification durant cette opération sera correctement répercuté sur le nouveau LV ;
  3. Elle inverse le miroir (l’ancien LV devient le miroir, le nouveau devient le LV principal) ;
  4. Elle supprime l’ancien LV.

Le problème c’est que, par défaut, pvmove cherche à remplir le premier espace libre disponible et étant suffisamment grand pour contenir la portion du LV à déplacer. Quand vous commencez à avoir comme moi un VG bien rempli, vous vous retrouvez coincé par un pvmove récalcitrant.

 

Etablissement d’un plan

La solution pour contourner ce problème gênant consiste à réaliser le déplacement « à la main » en utilisant l’option –alloc anywhere de pvmove. Pour que cette option fonctionne correctement, il faut préciser en détail quels extents doivent être déplacés du PV source, vers quels extents sur le PV cible. Il faut donc établir un plan pour réaliser cette opération le plus efficacement possible. Selon l’espace libre sur votre VG et l’état de fragmentation de celui-ci, le nombre d’étapes peut être plus ou moins important. Pour ma part, j’ai dû passer par plusieurs déplacements temporaires pour obtenir le résultat souhaité.

 

Exemple

Voici un exemple d’utilisation de pvmove. On indique d’abord le PV source et la fourchette de PE à déplacer, puis le PV destination et la fourchette de PE cible. Bien sûr, les deux fourchettes doivent contenir le même nombre de PE, quitte à réaliser l’opération en plusieurs fois.

 

Tags :

2 réactions sur “Défragmentation LVM”

  • GuL dit :

    MERCI pour cet article tres utile. Il est en effet tres difficile de trouver les informations « pvdisplay –maps » et « pvmove –alloc anywhere » dont j’avais besoin.

    A noter que « pvmove /dev/md1 –alloc anywhere » defragmente egalement mais les donnees sont au milieu du physical volume.

    PS : clavier qwerty

    GuL

  • Guillaume MICHON dit :

    Heureux de voir que, même si je n’ai plus le temps de publier, mes quelques articles peuvent servir 🙂
    Surtout qu’il faut bien chercher pour tomber ici…

  • Réagissez