
Wanneer binnen Linux De databaseserver stopt onverwacht en de oorzaak moet worden vastgesteld. 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 server of het proces raakt zonder geheugen, Linux De Out-Of-Memory Killer biedt twee oplossingen: het hele systeem laten crashen of het proces (de applicatie) beëindigen dat geheugen verbruikt. Het is natuurlijk beter om het proces te beëindigen en te voorkomen dat het besturingssysteem crasht. Kortom, de Out-Of-Memory Killer is een proces dat een applicatie beëindigt 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 we het kunnen beheren, en vervolgens kijken hoe de OOM Killer bepaalt welke applicaties moeten worden beëindigd.
Een van de belangrijkste taken Linux — Wijs geheugen toe aan processen wanneer ze erom vragen. Normaal gesproken vraagt een proces of applicatie geheugen aan het besturingssysteem, maar gebruikt het niet volledig. Als het besturingssysteem geheugen toewijst aan iedereen die erom vraagt, maar niet van plan is het te gebruiken, raakt het systeem snel zonder geheugen en crasht het. Om dit te voorkomen, reserveert het besturingssysteem geheugen voor een proces, maar wijst het dit niet daadwerkelijk toe. Geheugen wordt alleen toegewezen wanneer een proces het daadwerkelijk wil gebruiken. Soms heeft het besturingssysteem geen vrij geheugen, maar wijst het wel geheugen toe aan een proces. Wanneer het proces het nodig heeft, wijst het besturingssysteem het toe als dat mogelijk is. Het nadeel hiervan is dat het besturingssysteem soms geheugen reserveert, maar wanneer het nodig is, er geen vrij geheugen is, wat een systeemcrash veroorzaakt. OOM (Out of Memory) speelt een belangrijke rol in dit scenario door processen te beëindigen om te voorkomen dat de kernel in paniek raakt. Wanneer het PostgreSQL-proces geforceerd wordt beëindigd, verschijnt het volgende 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.
- De kernel heeft een minimum aan geheugen voor zichzelf nodig.
- U moet veel geheugen vrijmaken.
- Het is niet nodig om processen die weinig geheugen gebruiken te beëindigen.
- Er moeten minimale processen worden voltooid.
- 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
2Als 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_adjOm een waarde in te stellen oom_score_adj, stel OOMScoreAdjust in het serviceblok in:
[Service]
OOMScoreAdjust=-1000Of gebruik oomprotect in een team rcctl.
rcctl set <i>servicename</i> oomprotect -1000Forceer 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
В Linux Je kunt de OOM-Killer in- of uitschakelen (hoewel dat laatste niet aan te raden is). Gebruik hiervoor de parameter. vm.oom-kill. Voer de opdracht uit om OOM-Killer tijdens runtime in te schakelen sysctl.
sudo -s sysctl -w vm.oom-kill = 1Om OOM-Killer uit te schakelen, geeft u de waarde 0 op in hetzelfde commando:
sudo -s sysctl -w vm.oom-kill = 0Het 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.confEen 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
0Als u de waarde instelt op 0, zal er geen kernelpaniek optreden als het geheugen vol raakt.
$ echo 0 > /proc/sys/vm/panic_on_oomAls u de waarde instelt op 1, zal er een kernelpaniek optreden als het geheugen vol raakt.
echo 1 > /proc/sys/vm/panic_on_oomZoals we al eerder hebben vermeld, kan OOM-Killer worden in- en uitgeschakeld. Linux Het is mogelijk dat er meer geheugen voor processen wordt gereserveerd dan beschikbaar is, zonder dat dit daadwerkelijk wordt toegewezen. Dit gedrag wordt geregeld door een kernelparameter. LinuxDeze variabele is hiervoor verantwoordelijk. vm.overcommit_memory.
U kunt hiervoor de volgende waarden opgeven:
0: De kernel bepaalt zelf of er te veel geheugen gereserveerd moet worden. Dit is de standaardwaarde in de meeste versies. 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
