Out-Of-Memory Killer instellen in Linux voor PostgreSQL

Out-Of-Memory Killer instellen in Linux voor PostgreSQL

Wanneer een databaseserver onverwacht stopt in Linux, moet je de reden achterhalen. Er kunnen verschillende redenen zijn. Bijvoorbeeld, SIGSEGV — mislukking vanwege een bug in de backend-server. Maar dit is zeldzaam. Meestal komt u gewoonweg onvoldoende schijfruimte of geheugen te kort. Als u geen schijfruimte meer heeft, is er maar één uitweg: maak ruimte vrij en start de database opnieuw op.

Moordenaar zonder geheugen

Wanneer een server of proces onvoldoende geheugen heeft, biedt Linux twee oplossingen: het hele systeem laten crashen of het proces (applicatie) beëindigen dat geheugen in beslag neemt. Het is natuurlijk beter om het proces te beëindigen en te voorkomen dat het besturingssysteem crasht. In een notendop is Out-Of-Memory Killer een proces dat een applicatie doodt om te voorkomen dat de kernel crasht. Het offert de applicatie op om het besturingssysteem draaiende te houden. Laten we eerst bespreken hoe OOM werkt en hoe u het kunt besturen, en vervolgens kijken hoe OOM Killer beslist welke applicatie moet worden beëindigd.

Een van de belangrijkste taken van Linux is het toewijzen van geheugen aan processen wanneer ze daarom vragen. Normaal gesproken vraagt ​​een proces of applicatie om geheugen van het besturingssysteem, maar gebruikt het niet volledig. Als het besturingssysteem geheugen uitdeelt aan iedereen die erom vraagt, maar niet van plan is het te gebruiken, zal het geheugen zeer binnenkort opraken en zal het systeem falen. Om dit te voorkomen reserveert het besturingssysteem geheugen voor het proces, maar geeft het niet daadwerkelijk vrij. Geheugen wordt alleen toegewezen als een proces het daadwerkelijk gaat gebruiken. Het komt voor dat het besturingssysteem geen vrij geheugen heeft, maar geheugen toewijst aan een proces, en wanneer een proces het nodig heeft, wijst het besturingssysteem het toe als het kan. Het nadeel is dat het besturingssysteem soms geheugen reserveert, maar op het juiste moment geen vrij geheugen meer heeft en het systeem crasht. OOM speelt een belangrijke rol in dit scenario en beëindigt processen om te voorkomen dat de kernel in paniek raakt. Wanneer een PostgreSQL-proces gedwongen wordt beëindigd, verschijnt er een bericht in het logboek:

Out of Memory: Killed process 12345 (postgres).

Als het systeem weinig geheugen heeft en het niet kan worden vrijgemaakt, wordt de functie aangeroepen out_of_memory. In dit stadium hoeft ze nog maar één ding te doen: een of meer processen voltooien. Moet OOM-killer het proces direct beëindigen of kan het wachten? Het is duidelijk dat wanneer out_of_memory wordt aangeroepen, dit te wijten is aan het wachten op een I/O-bewerking of paging naar schijf. Daarom moet de OOM-killer eerst controles uitvoeren en op basis daarvan besluiten dat het proces moet worden beëindigd. Als alle onderstaande controles positief zijn, beëindigt OOM het proces.

Processelectie

Wanneer het geheugen vol raakt, wordt de functie aangeroepen out_of_memory(). Het heeft een functie select_bad_process(), die een evaluatie krijgt van de functie badness(). Het ‘slechtste’ proces zal worden aangepakt. Functie badness() selecteert een proces volgens bepaalde regels.

  1. De kernel heeft een minimum aan geheugen voor zichzelf nodig.
  2. U moet veel geheugen vrijmaken.
  3. Het is niet nodig om processen die weinig geheugen gebruiken te beëindigen.
  4. Er moeten minimale processen worden voltooid.
  5. Complexe algoritmen die de kans op voltooiing vergroten van die processen die de gebruiker zelf wil voltooien.

Nadat al deze controles zijn afgerond, onderzoekt OOM de score (oom_score). OOM wijst toe oom_score elk proces, en vermenigvuldigt deze waarde vervolgens met de hoeveelheid geheugen. Processen met grotere waarden hebben een grotere kans slachtoffer te worden van de OOM Killer. Processen die aan de rootgebruiker zijn gekoppeld, scoren lager en worden minder vaak gedwongen te beëindigen.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

De Postgres-proces-ID is 3813, dus in een andere shell is het mogelijk om de score te verkrijgen met behulp van deze kernelparameter oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Als je helemaal niet wilt dat OOM-Killer het proces beëindigt, is er nog een andere kerneloptie: oom_score_adj. Voeg een grote negatieve waarde toe om de kans te verkleinen dat een proces dat u waardeert, wordt voltooid.

sudo echo -100 > /proc/3813/oom_score_adj

Om een ​​waarde in te stellen oom_score_adj, stel OOMScoreAdjust in het serviceblok in:

[Service]
OOMScoreAdjust=-1000

Of gebruik oomprotect in een team rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Forceer beëindiging van een proces

Wanneer er al een of meer processen zijn geselecteerd, roept OOM-Killer de functie aan oom_kill_task(). Deze functie stuurt een beëindigingssignaal naar het proces. In geval van geheugentekort oom_kill() Roept deze functie aan om een ​​SIGKILL-signaal naar het proces te sturen. Er wordt een bericht naar het kernellogboek geschreven.

Out of Memory: Killed process [pid] [name].

Zo bedien je de OOM-Killer

Op Linux kunt u OOM-Killer in- of uitschakelen (hoewel dit laatste niet wordt aanbevolen). Gebruik de parameter om in of uit te schakelen vm.oom-kill. Voer de opdracht uit om OOM-Killer tijdens runtime in te schakelen sysctl.

sudo -s sysctl -w vm.oom-kill = 1

Om OOM-Killer uit te schakelen, geeft u de waarde 0 op in hetzelfde commando:

sudo -s sysctl -w vm.oom-kill = 0

Het resultaat van deze opdracht wordt niet voor altijd bewaard, maar alleen tot de eerste keer opnieuw opstarten. Als je meer doorzettingsvermogen nodig hebt, voeg dan deze regel toe aan het bestand /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

Een andere manier om in en uit te schakelen is door een variabele te schrijven panic_on_oom. De waarde kan altijd worden ingecheckt /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Als u de waarde instelt op 0, zal er geen kernelpaniek optreden als het geheugen vol raakt.

$ echo 0 > /proc/sys/vm/panic_on_oom

Als u de waarde instelt op 1, zal er een kernelpaniek optreden als het geheugen vol raakt.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer kan niet alleen worden in- en uitgeschakeld. We hebben al gezegd dat Linux meer geheugen voor processen kan reserveren dan beschikbaar is zonder het daadwerkelijk toe te wijzen, en dit gedrag wordt bestuurd door een Linux-kernelparameter. De variabele is hiervoor verantwoordelijk vm.overcommit_memory.

U kunt hiervoor de volgende waarden opgeven:

0: De kernel beslist zelf of er te veel geheugen wordt gereserveerd. Dit is de standaard op de meeste versies van Linux.
1: De kernel zal altijd extra geheugen reserveren. Dit is riskant, omdat het geheugen mogelijk leeg raakt, omdat de processen dit hoogstwaarschijnlijk op een dag nodig zullen hebben.
2: de kernel zal niet meer geheugen reserveren dan gespecificeerd in de parameter overcommit_ratio.

Met deze parameter geeft u het percentage geheugen op dat overgereserveerd mag worden. Als er geen ruimte voor is, wordt er geen geheugen toegewezen en wordt de reservering geweigerd. Dit is de veiligste optie die wordt aanbevolen voor PostgreSQL. OOM-Killer wordt beïnvloed door een ander element: de ruilmogelijkheid, die wordt bestuurd door de variabele cat /proc/sys/vm/swappiness. Deze waarden vertellen de kernel hoe om te gaan met paging. Hoe hoger de waarde, hoe kleiner de kans dat OOM het proces beëindigt, maar vanwege I/O-bewerkingen heeft dit wel een negatief effect op de database. En omgekeerd: hoe lager de waarde, hoe groter de kans op tussenkomst van OOM-Killer, maar de databaseprestaties zijn ook hoger. De standaardwaarde is 60, maar als de gehele database in het geheugen past, is het beter om de waarde op 1 te zetten.

Resultaten van

Laat je niet afschrikken door de "moordenaar" in OOM-Killer. In dit geval zal de moordenaar de redder van uw systeem zijn. Het ‘doodt’ de ergste processen en voorkomt dat het systeem crasht. Om te voorkomen dat u OOM-Killer moet gebruiken om PostgreSQL te beëindigen, stelt u in op vm.overcommit_memory waarde 2. Dit garandeert niet dat OOM-Killer niet hoeft in te grijpen, maar verkleint wel de kans dat het PostgreSQL-proces gedwongen wordt beëindigd.

Bron: www.habr.com

Voeg een reactie