Ook al is opslagruimte erg goedkoop, het is altijd fijn om meer te doen met minder opslagruimte. Gebruik je LVM om je schijfruimte te beheren? Dan kan je thin provisioning inschakelen om de beschikbare schijfruimte efficiënter te verdelen! 

Normaal gesproken verdeelt LVM één of meerdere fysieke schijven in verschillende logical volumes met een bepaalde grootte (al kan die later gewijzigd worden). Dat is vooral handig op systemen met meerdere gebruikers. Voor elke gebruiker is er dan bijvoorbeeld een afzonderlijk logical volume van 10GB. Op die manier krijgt iedereen netjes evenveel opslagcapaciteit en kan niemand aan de haal gaan met alle beschikbare schijfruimte. Maar in werkelijkheid zal niet iedereen 10GB gebruiken. Op een systeem met 20 gebruikers moet je dus 200GB voorzien, ook al is de kans klein dat die ruimte volledig benut wordt. LVM reserveert immers de benodigde extents al bij het aanmaken van een nieuw logical volume. Heb je een volume group met 200GB aan extents? Dan is de totale grootte van alle logical volumes samen ook maximaal 200GB. Dergelijke logical volumes noemt met thick volumes.

Thick of thin?

Bij thin provisioning werkt dat enigszins anders. Elk nieuw logical volume krijgt een virtuele grootte, zonder dat de onderliggende extents gereserveerd worden. Op die manier kan je dus méér extents toewijzen aan logical volumes dan er eigenlijk beschikbaar zijn. Dat fenomeen noemt men overprovisioning. In een volume group van 200GB zou je bijvoorbeeld 30 logical volumes van 10GB kunnen aanmaken. Zolang het gemiddelde schijfgebruik van alle gebruikers maximaal 66% is, werkt dat prima. Overprovisioning is ook een gangbare methode om de beschikbare resources maximaal te gebruiken op virtualisatiehosts. Op systemen met tientallen virtuele machines kan je gerust méér geheugen en CPU cores toewijzen aan alle vm’s samen, dan er in werkelijkheid beschikbaar zijn. De kans is immers erg klein dat alle vm’s tegelijkertijd alle resources willen gebruiken. Hetzelfde geldt eigenlijk voor opslagruimte: je kunt prima aan elke vm een schijf van 20GB toekennen, terwijl er eigenlijk maar 10GB beschikbaar is. Je moet dan wel tijdig ingrijpen als de onderliggende opslagruimte dreigt vol te lopen.

Thin pool

In LVM werkt thin provisioning op basis van een zogenaamd thin pool logical volume. Zo’n logical volume maak je aan met de -T-optie, bijvoorbeeld:

lvcreate -L 5G -n thinpool -T ubuntu-vg

Onderliggend bevat dat thin pool logical volume een data volume van 5GB en een veel kleiner metadata volume: het commando lvs -a toont beide volumes. In de kolommen Data% en Meta% zie je meteen hoeveel procent van beide volumes effectief in gebruik zijn. Vanaf nu kun je bij het lvcreate-commando aangeven dat je een thin logical volume wilt maken. De grootte definieer je dan met de -V-optie in plaats van -L en met -T geef je aan van welk thin pool logical volume de extents moeten komen. Bijvoorbeeld:

lvcreate -V 4G -n vm-mail -T ubuntu-vg/thinpool

Let op: in Ubuntu moet je het pakket thin-provisioning-tools nog installeren, voordat bovenstaand commando werkt! De lvs-output geeft voor elk thin logical volume aan hoeveel procent van de virtuele grootte het volume effectief inneemt. Dat is niet altijd hetzelfde als de output van het df-commando. Immers, als je een bestand verwijdert van een filesystem op een thin logical volume, dan komt die ruimte niet meteen vrij voor het thin pool logical volume! Je kunt die ruimte wel manueel vrijgeven met het fstrim-commando. De man-page van lvmthin bevat meer informatie daarover.

Autoextend

Het is erg belangrijk om te vermijden dat de beschikbare ruimte in het thin pool logical volume volloopt. Vanaf dat moment kan het systeem immers geen data meer schrijven naar alle thin logical volumes (lezen lukt nog wel)! Een thin pool logical volume breid je uit net zoals een gewoon logical volume:

lvextend -L +2G ubuntu-vg/thinpool

Wil je dat LVM een thin pool logical volume automatisch uitbreidt wanneer het dreigt vol te lopen? In /etc/lvm/lvm.conf vind je verschillende parameters om dat in te schakelen. Stel je thin_pool_autoextend_threshold op 90 in en thin_pool_autoextend_percent op 10, dan zal LVM het logical volume met 10% uitbreiden, zodra 90% van de beschikbare ruimte gebruikt is. Natuurlijk lukt dat alleen als de volume group nog over voldoende vrije extents beschikt. Goede monitoring van je LVM-systeem is dus onontbeerlijk, zodra je thin provisioning inschakelt!