
Kui sisse Linux Andmebaasiserver lĂ”petab ootamatult töö ja pĂ”hjus tuleb vĂ€lja selgitada. Sellel vĂ”ib olla mitu pĂ”hjust. NĂ€iteks SIGSEGV â tĂ”rge taustaserveri vea tĂ”ttu. Kuid see on haruldane. Enamasti saab kettaruum vĂ”i mĂ€lu lihtsalt otsa. Kui kettaruum saab otsa, on ainult ĂŒks vĂ€ljapÀÀs â vabastage ruumi ja taaskĂ€ivitage andmebaas.
MĂ€lu otsas tapja
Kui sa server vĂ”i protsessil saab mĂ€lu otsa, Linux MĂ€lu otsa saamise tĂ”rge pakub kahte lahendust: kogu sĂŒsteemi krahhi ajada vĂ”i mĂ€lu tarbiva protsessi (rakenduse) lĂ”petada. Parem on muidugi protsess ise lĂ”petada ja operatsioonisĂŒsteem krahhist pÀÀsta. LĂŒhidalt öeldes on mĂ€lu otsa saamise tĂ”rge protsess, mis lĂ”petab rakenduse, et pÀÀsta kernel krahhist. See ohverdab rakenduse, et operatsioonisĂŒsteem töötaks. KĂ”igepealt arutame, kuidas mĂ€lu otsa saamise tĂ”rge töötab ja kuidas seda juhtida, ning seejĂ€rel vaatame, kuidas mĂ€lu otsa saamise tĂ”rge otsustab, millised rakendused lĂ”petada.
Ăks peamisi ĂŒlesandeid Linux â MĂ€lu eraldamine protsessidele siis, kui nad seda taotlevad. Tavaliselt taotleb protsess vĂ”i rakendus operatsioonisĂŒsteemilt mĂ€lu, kuid ei kasuta seda tĂ€ielikult Ă€ra. Kui operatsioonisĂŒsteem eraldab mĂ€lu kĂ”igile, kes seda taotlevad, kuid ei plaani seda kasutada, saab sĂŒsteemil mĂ€lu kiiresti otsa ja sĂŒsteem jookseb kokku. Selle vĂ€ltimiseks reserveerib operatsioonisĂŒsteem protsessile mĂ€lu, kuid tegelikult seda ei eralda. MĂ€lu eraldatakse ainult siis, kui protsess kavatseb seda tegelikult kasutada. MĂ”nikord pole operatsioonisĂŒsteemil vaba mĂ€lu, kuid see eraldab mĂ€lu protsessile ja kui protsess seda vajab, eraldab operatsioonisĂŒsteem selle, kui saab. Negatiivne kĂŒlg on see, et mĂ”nikord reserveerib operatsioonisĂŒsteem mĂ€lu, kuid vajaduse korral pole vaba mĂ€lu, mis pĂ”hjustab sĂŒsteemi krahhi. OOM mĂ€ngib selles stsenaariumis vĂ”tmerolli, lĂ”petades protsesse, et vĂ€ltida kerneli paanikat. Kui PostgreSQL-i protsess sunniviisiliselt lĂ”petatakse, kuvatakse logis jĂ€rgmine teade:
Out of Memory: Killed process 12345 (postgres).Kui sĂŒsteemis on vĂ€he mĂ€lu ja seda ei saa vabastada, kutsutakse funktsioon vĂ€lja out_of_memory. Selles etapis on tal teha vaid ĂŒks asi â ĂŒks vĂ”i mitu protsessi lĂ”pule viia. Kas OOM-killer peaks protsessi viivitamatult lĂ”petama vĂ”i vĂ”ib oodata? Ilmselgelt on out_of_memory vĂ€ljakutsumine tingitud I/O operatsiooni ootamisest vĂ”i kettale otsimisest. SeetĂ”ttu peab OOM-i killer esmalt lĂ€bi viima kontrollid ja nende pĂ”hjal otsustama, et protsess tuleb lĂ”petada. Kui kĂ”ik allolevad kontrollid on positiivsed, lĂ”petab OOM protsessi.
Protsessi valik
Kui mĂ€lu saab otsa, kutsutakse funktsioon vĂ€lja out_of_memory(). Sellel on funktsioon select_bad_process(), mis saab funktsioonilt hinnangu badness(). Sihikule vĂ”etakse âhalvimâ protsess. Funktsioon badness() valib protsessi teatud reeglite jĂ€rgi.
- Kernel vajab enda jaoks minimaalset mÀlu.
- Peate vabastama palju mÀlu.
- VÀhe mÀlu kasutavaid protsesse pole vaja lÔpetada.
- Minimaalsed protsessid tuleb lÔpule viia.
- Komplekssed algoritmid, mis suurendavad nende protsesside lÔpetamise vÔimalusi, mida kasutaja ise soovib.
PÀrast kÔigi nende kontrollide sooritamist uurib OOM skoori (oom_score). OOM mÀÀrab oom_score iga protsessi jaoks ja korrutab selle vÀÀrtuse mÀlumahuga. Suurema vÀÀrtusega protsessid langevad tÔenÀolisemalt OOM Killeri ohvriks. Juurkasutajaga seotud protsessidel on madalam skoor ja need on harvemini sunnitud lÔpetama.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Postgresi protsessi ID on 3813, nii et teises shellis on vÔimalik selle kerneli parameetri abil tulemus saada oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Kui te ei soovi, et OOM-Killer protsessi ĂŒldse tapaks, on veel ĂŒks kerneli valik: oom_score_adj. Lisage suur negatiivne vÀÀrtus, et vĂ€hendada teie jaoks vÀÀrtusliku protsessi lĂ”puleviimise vĂ”imalusi.
sudo echo -100 > /proc/3813/oom_score_adjVÀÀrtuse mÀÀramiseks oom_score_adj, mÀÀrake teenuseplokis OOMScoreAdjust:
[Service]
OOMScoreAdjust=-1000VÔi kasutada oomprotect meeskonnas rcctl.
rcctl set <i>servicename</i> oomprotect -1000Protsessi sunniviisiline lÔpetamine
Kui ĂŒks vĂ”i mitu protsessi on juba valitud, kutsub OOM-Killer funktsiooni oom_kill_task(). See funktsioon saadab protsessile lĂ”petamissignaali. MĂ€lupuuduse korral oom_kill() Kutsub seda funktsiooni, et saata protsessile SIGKILL-signaal. Kerneli logisse kirjutatakse teade.
Out of Memory: Killed process [pid] [name].Kuidas juhtida OOM-Killerit
РLinux Saate OOM-Killeri lubada vÔi keelata (kuigi viimast ei soovitata). Selle lubamiseks vÔi keelamiseks kasutage parameetrit vm.oom-kill. OOM-Killeri kÀivitamise ajal lubamiseks kÀivitage kÀsk sysctl.
sudo -s sysctl -w vm.oom-kill = 1OOM-Killeri keelamiseks mÀÀrake samas kÀsus vÀÀrtus 0:
sudo -s sysctl -w vm.oom-kill = 0Selle kĂ€su tulemust ei salvestata igaveseks, vaid ainult kuni esimese taaskĂ€ivituseni. Kui vajate rohkem pĂŒsivust, lisage see rida faili /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confTeine vÔimalus lubamiseks ja keelamiseks on muutuja kirjutamine panic_on_oom. VÀÀrtust saab alati sisse registreerida /proc.
$ cat /proc/sys/vm/panic_on_oom
0Kui mÀÀrate vÀÀrtuseks 0, siis kui mÀlu saab otsa, ei teki tuumapaanikat.
$ echo 0 > /proc/sys/vm/panic_on_oomKui mÀÀrate vÀÀrtuseks 1, siis kui mÀlu saab otsa, tekib kerneli paanika.
echo 1 > /proc/sys/vm/panic_on_oomNagu me juba mainisime, saab OOM-Killerit sisse ja vĂ€lja lĂŒlitada. Linux vĂ”ib protsessidele reserveerida rohkem mĂ€lu kui saadaval on, kuid seda tegelikult ei eraldata ning seda kĂ€itumist kontrollib kerneli parameeter LinuxMuutuja vastutab selle eest. vm.overcommit_memory.
Selle jaoks saate mÀÀrata jÀrgmised vÀÀrtused:
0: Kernel ise otsustab, kas reserveerida liiga palju mÀlu. See on enamikus versioonides vaikevÀÀrtus. Linux.
1: Kernel reserveerib alati lisamĂ€lu. See on riskantne, sest mĂ€lu vĂ”ib otsa saada, sest suure tĂ”enĂ€osusega ĂŒhel pĂ€eval protsessid seda nĂ”uavad.
2: kernel ei reserveeri rohkem mÀlu kui parameetris on mÀÀratud overcommit_ratio.
Selle parameetriga saate mÀÀrata, kui palju mĂ€lu on lubatud ĂŒlereserveerida. Kui selle jaoks pole ruumi, siis mĂ€lu ei eraldata ja broneering lĂŒkatakse tagasi. See on PostgreSQL-i jaoks soovitatav kĂ”ige turvalisem valik. OOM-Killerit mĂ”jutab veel ĂŒks element â ââvahetusvĂ”ime, mida juhib muutuja cat /proc/sys/vm/swappiness. Need vÀÀrtused nĂ€itavad kernelile, kuidas lehitsemist kĂ€sitleda. Mida suurem on vÀÀrtus, seda vĂ€iksem on tĂ”enĂ€osus, et OOM lĂ”petab protsessi, kuid sisend-vĂ€ljundtoimingute tĂ”ttu avaldab see andmebaasile negatiivset mĂ”ju. Ja vastupidi â mida madalam on vÀÀrtus, seda suurem on OOM-Killeri sekkumise tĂ”enĂ€osus, kuid ka andmebaasi jĂ”udlus on suurem. VaikevÀÀrtus on 60, kuid kui kogu andmebaas mahub mĂ€llu, on parem mÀÀrata vÀÀrtuseks 1.
Tulemused
Ărge laske OOM-Killeri "tapjal" end hirmutada. Sel juhul on tapja teie sĂŒsteemi pÀÀstja. See "tapab" halvimad protsessid ja pÀÀstab sĂŒsteemi kokkujooksmisest. Et vĂ€ltida OOM-Killeri kasutamist PostgreSQL-i lĂ”petamiseks, mÀÀrake vÀÀrtuseks vm.overcommit_memory vÀÀrtus 2. See ei garanteeri, et OOM-Killer ei pea sekkuma, kuid see vĂ€hendab tĂ”enĂ€osust, et PostgreSQL-i protsess sunnitakse lĂ”petama.
Allikas: www.habr.com
