Op heel veel besturingssystemen is swap iets boosaardigs en doe je er goed aan om gebruik van swap zoveel mogelijk te vermijden. Op Linux is de situatie radicaal anders en kan je veel profijt hebben van een goed ingerichte swapomgeving. In dit artikel lees je hoe het werkt. 

Voordat we het gaan hebben over het beheer van een swapomgeving, is het nuttig om eerst een overzicht te geven van de benodigde achtergrondinformatie. Om te beginnen: swapgeheugen is geheugen dat geëmuleerd wordt op de harde schijf. Swap is NIET hetzelfde als virtueel geheugen. Het nut van swap is om ervoor te zorgen dat je nog steeds geheugen beschikbaar hebt, zelfs al heb je je werkgeheugen compleet gevuld met gegevens. 

Om te begrijpen of swapgeheugen adequaat gebruikt wordt, is het nuttig om iets te weten over actief en inactief geheugen. De Linux kernel is namelijk prima in staat onderscheid te maken tussen actief en inactief geheugen. Het onderscheid hiertussen wordt ook bijgehouden in de twee hoofdvormen van geheugengebruik op Linux: bestandsgeheugen en anoniem geheugen. 

Bestandsgeheugen is het deel van RAM dat gebruikt wordt als cache. Als een bestand benaderd wordt, dient dit opgehaald te worden vanaf de harde schijf van het systeem. Vervolgens wordt het in het RAM geplaatst, zodat gebruikers snel kunnen werken met de inhoud van het bestand. Als er vervolgens weer een gebruiker hetzelfde bestand benadert, komt het de prestaties zeer ten goede als het zich nog in RAM bevindt. RAM is namelijk al snel 1.000 keer sneller als disk. 

Voor de goede werking van een Linux-systeem is het van essentieel belang dat er voldoende ruimte beschikbaar is voor het cachen van bestanden. Dit achterhaal je op basis van de uitvoer van het commando free -m. In Listing 1 zie je hoe dit commando weergeeft hoeveel er precies gebruikt wordt voor het cachen van bestanden en hoeveel geheugen er nog beschikbaar is. 

 

user@user-virtual-machine ~ $ free -m

              total        used        free      shared  buff/cache   available

Mem:            972         422         181           6         369         366

Swap:          1021         119         902

Listing 1: Uitvoer van het free -m commando 

Zoals gezegd is het voor de werking van een Linux-systeem essentieel dat er voldoende RAM beschikbaar is als cache. Het gebruik van swap kan hier een rol in spelen. Voordat we het echter over swap gaan hebben, is het nuttig te weten dat de Linux kernel bijhoudt wat er precies in cache zit en ook gebruikt wordt. Dit staat gekenmerkt als Active File memory. Daarnaast is er Inactive File memory: dit zijn geheugenpagina’s die gereserveerd zijn voor cachen van bestanden, maar waarbij dat eigenlijk helemaal niet nodig is. Als er een tekort ontstaat aan geheugen, is de inactive file cache het eerste wat geleegd wordt. Is er dan nog steeds een gebrek aan geheugen, dat zich uit doordat er onvoldoende ruimte is voor het cachen van actieve bestanden, dan kan swap een nuttige rol spelen. 

 

user@user-virtual-machine ~ $ grep -i active /proc/meminfo 

Active:           228004 kB

Inactive:         381536 kB

Active(anon):      74412 kB

Inactive(anon):   236060 kB

Active(file):     153592 kB

Inactive(file):   145476 kB

Listing 2: in /proc/meminfo achterhaal je welk deel van je geheugen actief gebruikt wordt 

Het uitgangspunt is dat je op elke machine zoveel RAM moet hebben, dat alle active file cache aanvragen gehonoreerd kunnen worden. Dit uit zich doordat je in /proc/meminfo ook altijd een flinke hoeveelheid inactive file cache hebt. Dat is een zogenaamde buffer van geheugenpagina’s, die gedropt kunnen worden als dat nodig is. 

De andere kant van het verhaal zit hem in het applicatiegeheugen. Dit staat in /proc/meminfo aangeduid als Anonymous memory en ook hierbij kan onderscheid gemaakt worden tussen actief en inactief geheugen. Hier zit ook de flexibiliteit. Active Anonymous geheugen moet altijd beschikbaar zijn in RAM. Dit zijn namelijk de programma’s, die op dit moment gebruikt worden. Inactive Anonymouos geheugen is geheugen dat je eigenlijk helemaal niet nodig hebt. Het moet wél geladen worden als je een programma laadt, maar er is niets op tegen om dat inactieve anonieme geheugen op een langzamer medium te parkeren. Met andere woorden: de aanwezigheid van swap kan een goede rol spelen bij het werken met inactief anoniem geheugen. Als je kijkt naar het geheugengebruik in Listing 2, dan zie je dat het toch al snel om significante hoeveelheden gaat. 

 

Hoeveel swap?

Als je een standaard Linux-installatie uitvoert, wordt daar een hoeveelheid swap toegewezen. Voor systemen met minder dan 1 GB RAM (niet typisch op een server) is de hoeveelheid swapgeheugen vaak gelijk aan de hoeveelheid RAM. Op systemen met meerdere gigabytes aan RAM is de hoeveelheid swap vaak een percentage van de hoeveelheid RAM. De meeste installatieprogramma’s passen zelf een formule toe om te zorgen dat je een redelijke hoeveelheid swapgeheugen beschikbaar hebt. Deze formule is echter nergens op gebaseerd. Als je je server echt wilt optimaliseren op het gebied van geheugengebruik, moet je kijken naar het gemiddeld gebruik van inactief anoniem geheugen om te bepalen hoeveel swap je nodig hebt. Als je namelijk al het inactieve geheugen naar swap verplaatst, kun je die hoeveelheid RAM vrij maken om er andere dingen mee te doen. 

Laten we eens naar een voorbeeld kijken om dit wat duidelijker te maken. In Listing 1 zie je dat er 181 MB geheugen vrij is en dat er 119 MB al in swap zit. Kijk nu naar het gebruik van geheugen in Listing 2. Daar zie je dat er in totaal zo’n 230 MB inactief anoniem geheugen is. Hiervan zit dus al 119 MB in swap, maar er is dus ook nog altijd zo’n 110 MB RAM in gebruik, dat ook voor andere zaken ingezet zou kunnen worden. 

 

Swapperigheid

Wanneer er behoefte is aan meer RAM, dan maakt de Linux kernel een beslissing. Er kan namelijk op twee manieren RAM vrij gemaakt worden: je kunt alle inactive file memory droppen of alle inactive anonymous memory naar swap dirigeren. Om te bepalen welke optie de voorkeur heeft, maak je gebruik van de swappiness kernel tunable. Deze tunable heeft een waarde tussen 0 en 100. Hoe hoger de waarde, hoe eerder je Linux kernel geheugenpagina’s weg zal schrijven naar swap. Veel distributies hebben al een standaard swappiness van 70, maar die kan dus nog verder omhoog als je merkt dat er nog teveel inactief geheugen achterblijft in RAM. Je stelt deze waarde in met onderstaande opdracht, waarin nn de waarde is die je wilt gebruiken.

 

sysctl -w vm.swappiness = nn 

 

Er is echter wel een ding waar je nog rekening mee moet houden. Het is goed als een systeem veel swap heeft, maar het zou weinig gebruikt moeten worden. Als jouw server non-stop bezig is met het verplaatsen van gegevens tussen RAM en swap, heeft dat een hoge activiteit op schijf tot gevolg. Dat is weer slecht voor de prestaties van je server. 

 

user@user-virtual-machine ~ $ vmstat 2 20

procs ———–memory———- —swap– —–io—- -system-

cache    si   so    bi    bo   in   cs  us sy id wa st

356968    6   92   858   309   87  198  4  1 95  0  0

357000    0    0     0     0   34   55  0  0 99  0  0

357000    0    0     0     0   33   52  0  0 100  0  0

356992    0    0     0     6   32   53  0  0 100  0  0

357000    2    0     2     0  126  399  4  1 95  1  0

357000    0    0     0     0   32   52  1  0 100  0  0

357000    0    0     0     0   33   52  0  0 100  0  0

357000    0    0     0     0   30   47  0  0 100  0  0

357000    0    0     0     0   32   48  0  0 99  0  0

357000    0    0     0     0   30   49  0  0 100  0  0

357000    0    0     0     0   31   49  0  0 100  0  0

357000    0    0     0     0   32   50  0  1 100  0  0

357000    0    0     0     0   31   50  0  0 100  0  0

357000    0    0     0     0   31   51  0  0 100  0  0

357000    0    0     0     0   31   50  0  0 100  0  0

357000    0    0     0     0   37   67  1  0 100  0  0

357000    0    0     0     0   33   51  0  1 100  0  0

357000    0    0     0     0   33   54  1  0 100  0  0

357000    0    0     0     2   32   49  0  0 100  0  0

357000    0    0     0     0  121  396  4  1 95  0  0

 Listing 4: gebruik vmstat om te achterhalen hoe actief swap gebruikt wordt 

Je kunt het gebruik van swap monitoren door het commando vmstat 2 20 uit te voeren (zie Listing 4). Hiermee geef je met een interval van 2 seconden in totaal 20 keer statistieken weer over het gebruik van je systeem. Let daarbij op de kolommen si (swap in) en so (swap out). Hiermee zie je precies hoe actief je swap gebruikt wordt. Als in deze kolommen hoge waarden aangegeven worden, wordt je swap té actief gebruikt en is er eigenlijk nog maar één goede mogelijkheid over: meer RAM kopen.