Linux-prestaties: Waarom u bijna altijd swapruimte moet toevoegen

We weten dat het gebruik van Linux-swapruimte in plaats van RAM (geheugen) de prestaties ernstig kan vertragen. Je zou je dus kunnen afvragen of het niet beter is om swapspace te verwijderen, aangezien ik meer dan genoeg geheugen beschikbaar heb. Het korte antwoord is: Nee. Er zijn prestatievoordelen als swap space is ingeschakeld, zelfs als je meer dan genoeg ram hebt. Update, zie ook Deel 2: Linux Prestaties: Almost Always Add Swap (ZRAM).

Zelfs als er meer dan voldoende servergeheugen is geïnstalleerd, zul je vaak merken dat swapruimte wordt gebruikt na lange perioden van uptime. Zie het onderstaande voorbeeld van een live-chat server met ongeveer een maand uptime:

 total used free shared buff/cache availableMem: 3.7G 1.0G 445M 84M 2.2G 2.2GSwap: 1.8G 308M 1.5G

De uitvoer van free -h hier laat 308M gebruikte swapruimte zien. Toen ik controles voor swapping uitvoerde, waren er geen tekenen van lopende of ontijdige swap I/O activiteit. Ook verbruikte de kswap service niet veel CPU tijd. In feite was het kswap proces nergens te vinden in top (top processen gesorteerd op CPU tijd). Om dit te bevestigen, gebruikte ik het volgende commando:

ps -A | grep kswap 40 ? 00:00:29 kswapd0

…dus in dit geval, zoals in vele andere, is het swap gebruik niet schadelijk voor de prestaties van de Linux server. Laten we nu eens kijken hoe swap ruimte de prestaties van een Linux server kan helpen.

Update: Onlangs heb ik Manjoro i3 geïnstalleerd op mijn Pinebook Pro. ZRAM is nu standaard ingeschakeld.

Voordelen van swapruimte op systemen met voldoende RAM

atop 512GB server - 2GB swap gebruikt

atop 512GB server - 2GB swap gebruikt

Het is normaal en kan een goede zaak zijn voor Linux-systemen om wat swap te gebruiken, zelfs als er nog RAM beschikbaar is. De Linux-kernel verplaatst geheugenpagina’s die bijna nooit worden gebruikt naar de swapruimte om ervoor te zorgen dat er nog meer cachable ruimte in het geheugen beschikbaar komt voor geheugenpagina’s die vaker worden gebruikt (een pagina is een stukje geheugen). Swap gebruik wordt een performance probleem wanneer de Kernel onder druk wordt gezet om continu geheugen pagina’s in en uit het geheugen en swap ruimte te verplaatsen.

Een ander voordeel is dat swap admins tijd geeft om te reageren op problemen met weinig geheugen. We zullen vaak merken dat de server traag reageert en, bij het inloggen, zware swapping opmerkt. Zonder swap (zoals beschreven in de volgende sectie), kan het opraken van geheugen veel meer plotselinge en ernstige kettingreacties veroorzaken. Dus meestal zou ik adviseren om swap ruimte in te stellen op ongeveer de grootte van je grootste proces. Bijvoorbeeld, MySQL’s geconfigureerd geheugen in my.cnf. Het kan zelfs kleiner zijn, vooral als u monitoring en/of alarmering heeft ingesteld.

Sommigen adviseren geen swap of een swap grootte die iets groter is dan het totale RAM. Als je daar geldige redenen voor kunt bedenken, dan is dat misschien jouw keuze. Dit is echter nauwelijks het geval op servers, en u moet uw beslissing afwegen tegen de effecten die swap zal hebben op uw specifieke toepassingen. Swap verandert niets aan de hoeveelheid RAM die nodig is voor een gezonde server, of desktop wat dat betreft. Het is ontworpen om de prestaties van gezonde systemen aan te vullen.

Om samen te vatten:
– Zelfs als er nog beschikbaar RAM is, zal de Linux Kernel geheugenpagina’s die nauwelijks worden gebruikt naar de swap ruimte verplaatsen.
– Het is beter om geheugenpagina’s die een tijdje inactief zijn geweest uit te wisselen, zodat vaak gebruikte data in de cache blijven, en dit zou moeten gebeuren als de server het meest inactief is, dat is het doel van de Kernel.
– Stel de swap ruimte niet te groot in als dat leidt tot langdurige performance problemen, uitval, of uw reactietijd (zonder goede monitoring/waarschuwingen).

Swap Ruimte vs. Geen Swap wanneer het beschikbare geheugen laag is

In tegenstelling tot het geval hierboven, als u niet genoeg geheugen heeft, zal swap vrij vaak en merkbaar meer gebruikt worden tijdens pieken in de geheugenbehoefte. Als u niet genoeg geheugen hebt en geen swap ruimte, zal dit vaak leiden tot het niet toewijzen van geheugen voor aanvragen die meer geheugen pagina’s nodig hebben. Als laatste redmiddel zal de Kernel OOM killer inzetten om processen met veel geheugen (meestal MySQL, java, etc.) uit te schakelen.

Voor een meer gedetailleerde kijk op Linux swap space, lees de Swap Management en Page Frame Reclamation hoofdstukken van Kernel.org docs. Kijk ook eens naar de laatste sectie, “Kernel cache druk en swappiness,” van mijn andere blog post voor tips over het tunen van Linux swap space gebruik door de Kernel. Als uw swap ruimte “gebruikt” altijd ‘0’ is, dan heeft u inderdaad een ton vrij beschikbaar RAM, in welk geval het veilig kan zijn om de swap ruimte te verwijderen… of u kunt de cache druk van uw Kernel aanpassen om gebruik te maken van nog meer RAM.

Om samen te vatten:
– Swap I/O schaalt zeer slecht. Als geheugen pagina’s niet alleen geswapt kunnen worden als de server inactief is, moet je swap tunen of uitschakelen. Dit is meestal niet het geval, vandaar de “bijna altijd” titel van deze blog post.
– Met swap uitgeschakeld, worden performance problemen heel snel merkbaar, en de OOM killer kan je te pakken krijgen!

Voor vergelijking, hier is de output van free met een oudere versie van free van procps-ng-3.3.1 op dezelfde server:

 total used free shared buffers cachedMem: 3.7G 3.3G 445M 0B 4.2M 1.7G-/+ buffers/cache: 1.6G 2.1GSwap: 1.8G 308M 1.5G

Kernel cache druk en swappiness

Nu dat je swap hebt ingeschakeld. Overweeg om de cache druk en de neiging tot swappen (vm.swappiness) van je server aan te passen door de onderstaande gids te volgen, die afkomstig is uit het vorige artikel: Linux server heeft een RAM upgrade nodig? Controleer met top, free, vmstat en sar:

vfs_cache_pressure – Regelt de neiging van de kernel om het geheugen terug te vorderen, dat wordt gebruikt voor het cachen van directory- en inode-objecten. (standaard = 100, aanbevolen waarde 50 tot 200)

swappiness – Deze controle wordt gebruikt om aan te geven hoe agressief de kernel geheugenpagina’s verwisselt. Hogere waarden verhogen de agressiviteit; lagere waarden verlagen de hoeveelheid swap. (standaard = 60, aanbevolen waarden tussen 1 en 60) Verwijder uw swap voor 0 waarde, maar meestal niet aanbevolen in de meeste gevallen.

Om te bewerken, kunt u deze regels toevoegen of vervangen in /etc/sysctl.conf bestand. Als u bijvoorbeeld weinig geheugen heeft totdat u gaat upgraden, kunt u iets proberen als:

vm.swappiness=10vm.vfs_cache_pressure=200

Dit zal de cache druk verhogen, wat misschien wat contraproductief lijkt omdat caching goed is voor de performance. Echter, te vaak swappen vermindert de algehele performance van je server aanzienlijk meer. Dus niet zoveel cache in het geheugen houden zal helpen om de swap activiteit te verminderen. Ook, met vm.swappiness ingesteld op 10 of zo laag als 1, zal het swappen van schijven verminderen.

Op een gezonde server met veel beschikbaar geheugen, gebruik je het volgende:

vm.swappiness=10vm.vfs_cache_pressure=50

Dit zal de cache druk verminderen. Omdat caching goed is voor de prestaties, willen we cache-gegevens langer in het geheugen houden. Since the cache will grow larger, we still want to reduce swapping to not cause increased swap I/O.

To check current values using these commands use:

sudo cat /proc/sys/vm/swappinesssudo cat /proc/sys/vm/vfs_cache_pressure

To enable these settings temporarily without rebooting, use the following commands:

sudo sysctl -w vm.swappiness=10sudo sysctl -w vm.vfs_cache_pressure=50