
Kai įeina Linux Duomenų bazės serveris netikėtai nustoja veikti, todėl reikia nustatyti priežastį. Tam gali būti kelios priežastys. Pavyzdžiui, SIGSEGV — gedimas dėl galinio serverio klaidos. Bet tai reta. Dažniausiai jums tiesiog pritrūksta vietos diske arba atminties. Jei trūksta vietos diske, yra tik viena išeitis – atlaisvinkite vietos ir paleiskite duomenų bazę iš naujo.
Išsenkančios atminties žudikas
Kai tu serveris arba procesui pritrūksta atminties, Linux „Out-Of-Memory Killer“ siūlo du sprendimus: užstrigti visai sistemai arba nutraukti procesą (programą), kuris eikvoja atmintį. Žinoma, geriau nutraukti procesą ir apsaugoti OS nuo gedimų. Trumpai tariant, „Out-Of-Memory Killer“ yra procesas, kuris nutraukia programos veikimą, kad apsaugotų branduolį nuo gedimų. Jis paaukoja programą, kad OS toliau veiktų. Pirmiausia aptarkime, kaip veikia OOM ir kaip jį valdyti, o tada pažiūrėkime, kaip OOM Killer nusprendžia, kurias programas nutraukti.
Viena iš pagrindinių užduočių Linux — Skirkite atmintį procesams, kai jie jos prašo. Paprastai procesas arba programa prašo atminties iš OS, bet jos visiškai neišnaudoja. Jei OS skiria atmintį visiems, kurie jos prašo, bet neplanuoja jos naudoti, sistema greitai pritrūks atminties ir suges. Kad to išvengtumėte, OS rezervuoja atmintį procesui, bet jos iš tikrųjų neskiria. Atmintis skiriama tik tada, kai procesas iš tikrųjų ketina ją naudoti. Kartais OS neturi laisvos atminties, bet ji skiria atmintį procesui, o kai procesui jos reikia, OS ją skiria, jei gali. Neigiama yra tai, kad kartais OS rezervuoja atmintį, bet kai reikia, laisvos atminties nėra, todėl sistema sugenda. Šiame scenarijuje pagrindinį vaidmenį atlieka OOM, nutraukdama procesus, kad branduolys nepanikuotų. Kai PostgreSQL procesas priverstinai nutraukiamas, žurnale rodomas toks pranešimas:
Out of Memory: Killed process 12345 (postgres).Jei sistemoje mažai atminties ir jos negalima atlaisvinti, iškviečiama funkcija out_of_memory. Šiame etape jai liko tik vienas dalykas – užbaigti vieną ar kelis procesus. Ar OOM-killer turėtų nedelsiant nutraukti procesą, ar gali palaukti? Akivaizdu, kad kai iškviečiama out_of_memory, tai yra dėl laukimo, kol bus atlikta įvesties / išvesties operacija arba ieškoma puslapių į diską. Todėl OOM žudikas pirmiausia turi atlikti patikrinimus ir jais remdamasis nuspręsti, kad procesą reikia nutraukti. Jei visi toliau pateikti patikrinimai yra teigiami, OOM nutrauks procesą.
Proceso pasirinkimas
Kai baigiasi atmintis, funkcija iškviečiama out_of_memory(). Ji turi funkciją select_bad_process(), kuris gauna įvertinimą iš funkcijos badness(). Bus nukreiptas „blogiausias“ procesas. Funkcija badness() parenka procesą pagal tam tikras taisykles.
- Branduoliui reikia tam tikros minimalios atminties.
- Reikia atlaisvinti daug atminties.
- Nereikia nutraukti procesų, kurie naudoja mažai atminties.
- Reikia atlikti minimalius procesus.
- Sudėtingi algoritmai, padidinantys tų procesų, kuriuos pats vartotojas nori užbaigti, užbaigimo tikimybę.
Atlikęs visus šiuos patikrinimus, OOM patikrina balą (oom_score). OOM priskiria oom_score kiekvieną procesą, o tada šią reikšmę padaugina iš atminties kiekio. Didesnių verčių procesai greičiausiai taps OOM Killer aukomis. Procesai, susiję su pagrindiniu vartotoju, turi mažesnį balą ir yra mažiau tikėtina, kad jie bus priversti nutraukti.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Postgres proceso ID yra 3813, todėl kitame apvalkale galima gauti balą naudojant šį branduolio parametrą oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Jei nenorite, kad OOM-Killer visiškai nužudytų procesą, yra kita branduolio parinktis: oom_score_adj. Pridėkite didelę neigiamą vertę, kad sumažintumėte tikimybę užbaigti jums vertinamą procesą.
sudo echo -100 > /proc/3813/oom_score_adjNorėdami nustatyti vertę oom_score_adj, paslaugų bloke nustatykite OOMScoreAdjust:
[Service]
OOMScoreAdjust=-1000Arba naudoti oomprotect komandoje rcctl.
rcctl set <i>servicename</i> oomprotect -1000Priverstinis proceso nutraukimas
Kai jau pasirinktas vienas ar keli procesai, OOM-Killer iškviečia funkciją oom_kill_task(). Ši funkcija siunčia proceso pabaigos signalą. Esant atminties trūkumui oom_kill() Iškviečia šią funkciją, kad į procesą būtų išsiųstas SIGKILL signalas. Į branduolio žurnalą įrašomas pranešimas.
Out of Memory: Killed process [pid] [name].Kaip valdyti OOM-Killer
В Linux Galite įjungti arba išjungti „OOM-Killer“ (nors pastarasis nerekomenduojamas). Norėdami jį įjungti arba išjungti, naudokite parametrą vm.oom-kill. Norėdami įjungti OOM-Killer vykdymo metu, paleiskite komandą sysctl.
sudo -s sysctl -w vm.oom-kill = 1Norėdami išjungti OOM-Killer, nurodykite reikšmę 0 toje pačioje komandoje:
sudo -s sysctl -w vm.oom-kill = 0Šios komandos rezultatas nebus išsaugotas amžinai, o tik iki pirmojo perkrovimo. Jei jums reikia daugiau atkaklumo, pridėkite šią eilutę prie failo /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confKitas būdas įjungti ir išjungti yra rašyti kintamąjį panic_on_oom. Vertė visada gali būti patikrinta /proc.
$ cat /proc/sys/vm/panic_on_oom
0Jei nustatysite reikšmę į 0, tada, kai baigsis atmintis, branduolio panikos nebus.
$ echo 0 > /proc/sys/vm/panic_on_oomJei nustatysite reikšmę į 1, tada, kai baigsis atmintis, kils branduolio panika.
echo 1 > /proc/sys/vm/panic_on_oomKaip jau minėjome, „OOM-Killer“ galima įjungti ir išjungti. Linux gali rezervuoti procesams daugiau atminties nei yra prieinama, bet jos iš tikrųjų neskirti, ir šį elgesį kontroliuoja branduolio parametras LinuxUž tai atsakingas kintamasis. vm.overcommit_memory.
Galite nurodyti šias reikšmes:
0: Pats branduolys nusprendžia, ar rezervuoti per daug atminties. Tai yra numatytoji reikšmė daugumoje versijų. Linux.
1: Branduolys visada rezervuos papildomą atmintį. Tai rizikinga, nes gali pritrūkti atminties, nes greičiausiai vieną dieną procesai to prireiks.
2: branduolys nerezervuoja daugiau atminties nei nurodyta parametre overcommit_ratio.
Naudodami šį parametrą nurodote, kiek procentų atminties leidžiama rezervuoti per daug. Jei jai nėra vietos, atmintis neskiriama, o rezervacija bus atmesta. Tai yra saugiausia parinktis, rekomenduojama „PostgreSQL“. OOM-Killer veikia kitas elementas – keitimo galimybė, kurią valdo kintamasis cat /proc/sys/vm/swappiness. Šios reikšmės nurodo branduoliui, kaip tvarkyti puslapius. Kuo didesnė vertė, tuo mažesnė tikimybė, kad OOM nutrauks procesą, tačiau dėl I/O operacijų tai daro neigiamą poveikį duomenų bazei. Ir atvirkščiai – kuo mažesnė vertė, tuo didesnė OOM-Killer įsikišimo tikimybė, tačiau duomenų bazės našumas taip pat didesnis. Numatytoji reikšmė yra 60, bet jei visa duomenų bazė telpa atmintyje, geriau nustatyti reikšmę į 1.
rezultatai
Neleiskite, kad OOM-Killer „žudikas“ jūsų gąsdintų. Tokiu atveju žudikas bus jūsų sistemos gelbėtojas. Tai „nužudo“ blogiausius procesus ir apsaugo sistemą nuo gedimo. Kad nereikėtų naudoti OOM-Killer norint nutraukti PostgreSQL, nustatykite į vm.overcommit_memory reikšmė 2. Tai negarantuoja, kad OOM-Killer nereikės įsikišti, bet sumažins tikimybę, kad PostgreSQL procesas bus priverstas nutraukti.
Šaltinis: www.habr.com
