
NĂ€r du Ă€r inne Linux Databasservern avslutas ovĂ€ntat och orsaken mĂ„ste faststĂ€llas. Det kan finnas flera orsaker. Till exempel, SIGSEGV â fel pĂ„ grund av en bugg i backend-servern. Men detta Ă€r sĂ€llsynt. Oftast fĂ„r du helt enkelt slut pĂ„ diskutrymme eller minne. Om du fĂ„r slut pĂ„ diskutrymme finns det bara en vĂ€g ut - frigör utrymme och starta om databasen.
Out-of-Memory Killer
NÀr du server eller processen fÄr slut pÄ minne, Linux Out-Of-Memory Killer erbjuder tvÄ lösningar: krascha hela systemet eller avsluta processen (applikationen) som Àter upp minne. Det Àr naturligtvis bÀttre att avsluta processen och rÀdda operativsystemet frÄn att krascha. Kort sagt Àr Out-Of-Memory Killer en process som avslutar en applikation för att rÀdda kÀrnan frÄn att krascha. Den offrar applikationen för att hÄlla operativsystemet igÄng. LÄt oss först diskutera hur OOM fungerar och hur man kontrollerar det, och sedan titta pÄ hur OOM Killer bestÀmmer vilka applikationer som ska avslutas.
En av huvuduppgifterna Linux â Allokera minne till processer nĂ€r de begĂ€r det. Vanligtvis begĂ€r en process eller applikation minne frĂ„n operativsystemet men anvĂ€nder det inte helt. Om operativsystemet allokerar minne till alla som begĂ€r det men inte planerar att anvĂ€nda det, kommer systemet snabbt att fĂ„ slut pĂ„ minne och systemet kraschar. För att förhindra detta reserverar operativsystemet minne för en process men allokerar det inte. Minne allokeras endast nĂ€r en process faktiskt avser att anvĂ€nda det. Ibland har operativsystemet inte ledigt minne, men det allokerar minne till en process, och nĂ€r processen behöver det allokerar operativsystemet det om det kan. Nackdelen Ă€r att operativsystemet ibland reserverar minne, men nĂ€r det behövs finns det inget ledigt minne, vilket orsakar en systemkrasch. OOM spelar en nyckelroll i detta scenario genom att avsluta processer för att förhindra att kĂ€rnan fĂ„r panik. NĂ€r PostgreSQL-processen tvĂ„ngsavslutas visas följande meddelande i loggen:
Out of Memory: Killed process 12345 (postgres).Om systemet har ont om minne och det inte kan frigöras, anropas funktionen out_of_memory. I det hĂ€r skedet har hon bara en sak kvar att göra â slutföra en eller flera processer. Ska OOM-killer avsluta processen omedelbart eller kan den vĂ€nta? Uppenbarligen, nĂ€r out_of_memory anropas beror det pĂ„ att man vĂ€ntar pĂ„ en I/O-operation eller sökning till disk. DĂ€rför mĂ„ste OOM-mördaren först utföra kontroller och utifrĂ„n dem besluta att processen mĂ„ste avslutas. Om alla kontroller nedan Ă€r positiva kommer OOM att avsluta processen.
Processval
NÀr minnet tar slut anropas funktionen out_of_memory(). Den har en funktion select_bad_process(), som fÄr en utvÀrdering frÄn funktionen badness(). Den "vÀrsta" processen kommer att riktas mot. Fungera badness() vÀljer en process enligt vissa regler.
- KÀrnan behöver lite minne för sig sjÀlv.
- Du mÄste frigöra mycket minne.
- Det finns inget behov av att avsluta processer som anvÀnder lite minne.
- Minsta processer mÄste slutföras.
- Komplexa algoritmer som ökar chanserna till slutförande för de processer som anvÀndaren sjÀlv vill slutföra.
Efter att ha genomfört alla dessa kontroller undersöker OOM poÀngen (oom_score). OOM tilldelar oom_score varje process och multiplicerar sedan detta vÀrde med mÀngden minne. Processer med större vÀrden Àr mer benÀgna att falla offer för OOM Killer. Processer associerade med root-anvÀndaren har lÀgre poÀng och Àr mindre sannolikt att tvingas avslutas.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Postgres process-ID Àr 3813, sÄ i ett annat skal Àr det möjligt att fÄ poÀngen med denna kÀrnparameter oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Om du inte vill att OOM-Killer ska döda processen alls, finns det ett annat kÀrnalternativ: oom_score_adj. LÀgg till ett stort negativt vÀrde för att minska chanserna att slutföra en process som du vÀrdesÀtter.
sudo echo -100 > /proc/3813/oom_score_adjFör att stÀlla in ett vÀrde oom_score_adj, stÀll in OOMScoreAdjust i serviceblocket:
[Service]
OOMScoreAdjust=-1000Eller anvÀnd oomprotect i ett lag rcctl.
rcctl set <i>servicename</i> oomprotect -1000Framtvinga avslutande av en process
NÀr en eller flera processer redan Àr valda anropar OOM-Killer funktionen oom_kill_task(). Denna funktion skickar en avslutningssignal till processen. Vid minnesbrist oom_kill() Anropar denna funktion för att skicka en SIGKILL-signal till processen. Ett meddelande skrivs till kÀrnloggen.
Out of Memory: Killed process [pid] [name].Hur man styr OOM-Killer
РLinux Du kan aktivera eller inaktivera OOM-Killer (Àven om det senare inte rekommenderas). För att aktivera eller inaktivera det, anvÀnd parametern vm.oom-kill. För att aktivera OOM-Killer vid körning, kör kommandot sysctl.
sudo -s sysctl -w vm.oom-kill = 1För att inaktivera OOM-Killer, ange vÀrdet 0 i samma kommando:
sudo -s sysctl -w vm.oom-kill = 0Resultatet av detta kommando kommer inte att sparas för alltid, utan bara tills den första omstarten. Om du behöver mer uthÄllighet, lÀgg till den hÀr raden i filen /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confEtt annat sÀtt att aktivera och inaktivera Àr att skriva en variabel panic_on_oom. VÀrdet kan alltid checkas in /proc.
$ cat /proc/sys/vm/panic_on_oom
0Om du stÀller in vÀrdet till 0 kommer det inte att uppstÄ nÄgon kÀrnpanik nÀr minnet tar slut.
$ echo 0 > /proc/sys/vm/panic_on_oomOm du stÀller in vÀrdet till 1 kommer en kÀrnpanik att uppstÄ nÀr minnet tar slut.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer kan slÄs pÄ och av, som vi redan nÀmnt. Linux kan reservera mer minne för processer Àn vad som Àr tillgÀngligt, men inte faktiskt allokera det, och detta beteende styrs av en kÀrnparameter LinuxVariabeln Àr ansvarig för detta. vm.overcommit_memory.
Du kan ange följande vÀrden för det:
0: KÀrnan avgör sjÀlv om den ska reservera för mycket minne. Detta Àr standardvÀrdet i de flesta versioner. Linux.
1: KÀrnan kommer alltid att reservera extra minne. Detta Àr riskabelt, eftersom minnet kan ta slut, eftersom processerna troligen kommer att krÀva det en dag.
2: kÀrnan kommer inte att reservera mer minne Àn vad som anges i parametern overcommit_ratio.
Med den hÀr parametern anger du den procentandel av minnet som fÄr vara överreserverat. Om det inte finns plats för det tilldelas inget minne och reservationen kommer att nekas. Detta Àr det sÀkraste alternativet som rekommenderas för PostgreSQL. OOM-Killer pÄverkas av ett annat element - vÀxlingsförmÄgan, som styrs av variabeln cat /proc/sys/vm/swappiness. Dessa vÀrden talar om för kÀrnan hur man hanterar personsökning. Ju högre vÀrde, desto mindre sannolikt Àr det att OOM kommer att avsluta processen, men pÄ grund av I/O-operationer har det en negativ inverkan pÄ databasen. Och vice versa - ju lÀgre vÀrde, desto högre Àr sannolikheten för OOM-Killer-intervention, men databasprestandan Àr ocksÄ högre. StandardvÀrdet Àr 60, men om hela databasen fÄr plats i minnet Àr det bÀttre att sÀtta vÀrdet till 1.
Resultat av
LÄt inte "mördaren" i OOM-Killer skrÀmma dig. I det hÀr fallet kommer mördaren att bli ditt systems rÀddare. Det "dödar" de vÀrsta processerna och rÀddar systemet frÄn att krascha. För att undvika att behöva anvÀnda OOM-Killer för att avsluta PostgreSQL, stÀll in pÄ vm.overcommit_memory vÀrde 2. Detta garanterar inte att OOM-Killer inte behöver ingripa, men det kommer att minska sannolikheten för att tvinga PostgreSQL-processen att avslutas.
KĂ€lla: will.com
