Geheugenverbruik van een VPS begrijpen

Container-based virtualisatie en de Linux kernel bieden veel voordelen met betrekking tot geheugengebruik. Men mag gerust meer geheugen reserveren en zelfs gebruiken dan men daadwerkelijk toegewezen heeft gekregen. Hier liggen echter ook gevaren. Om een stabiele omgeving te creëeren is het van belang te begrijpen hoe de geheugentoewijzing en verbruik werkt.

Wat is het geheugen van een VPS?

Het geheugen van virtuele servers is een relatief ingewikkelde aangelegenheid. Het belangrijkste voor een VPS-beheerder is het begrijpen van het verbruik en daarmee het voorkomen van een OOM-situatie (out of memory situatie). U wilt immers dat uw VPS stabiel blijft draaien. Het bestand /proc/user_beancounters is de belangrijkste bron voor informatie aangaande geheugen in een container-based VPS. U kunt dit bestand gemakkelijk uitlezen:

# cat /proc/user_beancounters

De kolom failcnt geeft aan hoe vaak het mislukt is om geheugen toe te wijzen aan een proces.

Het welbekende comamndo "free" om in Linux enige infromatie over het geheugenverbruik te krijgen is ook behulpzaam:

# free -m

Bovenstaande commano's zijn gedraait op een VPS die volledig het VPS-pakket Small gebruikt (512MB).

Gegarandeerd geheugen

Het gegarandeerde geheugen van een VPS is de gegarandeerde hoeveelheid geheugen dat te allen tijde beschikbaar zal zijn voor de processen in de specifieke VPS. Blijft de totale geheugenbehoefte van de VPS onder deze limiet, zullen uw processen niet crashen vanwege een tekort aan geheugen.

oomguarpages geeft het gegarandeerde geheugen aan door middel van de kolom barrier. In bovenstaand voorbeeld is het gegarandeerde geheugen dus 144488. Deze waarde wordt weergegeven in pages. Een page is normaliter 4 kilobytes. Om dit om te rekenen naar MB's kan men de waarde vermenigvuldigen met 4 en delen door 1024.

(144488 * 4 kB) / 1024 kB = 564 MB

Tot deze limiet bereikt is, zal er geen proces gestopt worden. Blijft u dus onder deze grens, kunt u uitgaan van een stabiele omgeving. U kunt echter, zonder garantie, boven de grens uitkomen tot aan de grens van geheugenreservering (hieronder verder besproken). Dit heet extra geheugen en wordt ook wel burst geheugen genoemd.

Geheugenreservering

Veel processen reserveren geheugen, maar verbruiken dit niet. Het komt ook bijna nooit voor dat deze processen al het gereserveerde geheugen gebruiken. Een goed voorbeeld is de Java-daemon die graag meer dan 1GB reserveert maar dit lang niet gebruikt. Ook Apache en MySQL reserveren meer dan ze nodig hebben. Dit is begrijpelijk en ook noodzakelijk voor een goede geheugenhuishouding, maar het zou erg vervelend zijn om alle geheugenreseringen aan te merken als daadwerkelijk geheugenverbruik. Java zou, zonder aparate configuratie, niet kunnen draaien op een klein VPS-pakket.

Gelukkig biedt de Linux-kernel de mogelijkheid om alleen het daadwerkelijk gebruikte geheugen een plek in te laten nemen (memory overcommitment). De reservering van overig geheugen waar geen gebruik van wordt gemaakt neemt geen ruimte in. Dit brengt wel een risico met zich mee. Als het proces opeens meer geheugen gaat gebruiken en dat geheugen is er niet is. Om het risco te beperken dat er opeens een geheugentekort komt als een proces wel veel meer geheugen opeist, is er een limiet gesteld aan deze vorm van geheugenreservering.

De waarde privvmpages in de kolom held geeft de hoeveelheid gereserveerd geheugen weer. In bovenstaand voorbeeld is dat 86683*4/1024 = 338 MB

Wat opvalt is dat het commando free -m dit als used aanmerkt.

Het is toegestaan geheugenreserveringen te maken tot aan de barrier van privvmpages.
Dat is 621443*4/1024 = 2427 MB, hetgeen weer gelijk staat aan wat het commando free -m als total wordt aanmerkt.

Daadwerkelijk geheugenverbruik

In dit voorbeeld wordt, zoals hierboven besproken, 338 MB aan geheugen gereserveerd, maar niet daadwerkelijk verbruikt. Hoeveel geheugen daadwerkelijk gebruikt wordt, is ook af te lezen door middel van de waarde oomguarpages. Alleen deze keer dient de kolom held uitgelezen te worden. In bovenstaand voorbeeld is dat 39785 (pages). Dat staat gelijk aan 39785*4/1024=155MB.

Waar moet u op letten

  • Kijk als u problemen ondervindt met de VPS altijd eerst naar de kolom failcnt van het bestand /proc/user_beancounters. Deze waarden worden nooit gereset, dus schrijf de waarde op zodat u weet of er een verhoging van de waarde heeft plaatsgevonden.
  • Zorg altijd dat de waarde oomguarpages - held niet hoger is dan oomguarpages - barrier.
  • Zorg dat de waarde privvmpages - held niet hoger is dan privvmpages - barrier.
  • Gebruikt de kolom held als houvast aangaande hoe hoog de waarden ooit geweest zijn. Als u /proc/user_beancounters is dit immers slechts een momentopname.
  • Mochten andere waardes ook failcounts aangeven, neem dan gerust contact met ons op.

Als u bovenstaande adviezen opvolgt zult u in de meeste gevallen een zeer stabiele omgeving hebben. Heeft u een erg kritieke VPS die erg extreem schommelt in zijn geheugenverbruik, zorg dan dat de waarde privvmpages - held niet hoger is dan oomguarpages - barrier. Mochten de processen opeens al het gereservverde geheugen opvragen en er is geen extra geheugen meer beschikbaar blijft uw VPS ongeschonden.