Out-Of-Memory Killer seadistamine Linuxis PostgreSQL-i jaoks

Out-Of-Memory Killer seadistamine Linuxis PostgreSQL-i jaoks

Kui andmebaasiserver Linuxis ootamatult sulgub, peate leidma põhjuse. Põhjuseid võib olla mitu. 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 serveri või protsessi mälu saab otsa, pakub Linux kahte lahendust: jookseb kogu süsteem kokku või lõpeta protsess (rakendus), mis mälu sööb. Parem on muidugi protsess lõpetada ja OS kokkujooksmisest päästa. Lühidalt, Out-Of-Memory Killer on protsess, mis tapab rakenduse, et päästa kernel kokkujooksmisest. See ohverdab rakenduse, et OS töötaks. Arutame esmalt, kuidas OOM töötab ja kuidas seda juhtida, ning seejärel vaatame, kuidas OOM Killer otsustab, milline rakendus lõpetada.

Linuxi üks peamisi ülesandeid on eraldada protsessidele mälu, kui nad seda nõuavad. Tavaliselt nõuab protsess või rakendus OS-ilt mälu, kuid ei kasuta seda täielikult. Kui OS annab mälu välja kõigile, kes seda küsivad, kuid ei kavatse seda kasutada, saab mälu peagi tühjaks ja süsteem ebaõnnestub. Selle vältimiseks reserveerib operatsioonisüsteem protsessi jaoks mälu, kuid tegelikult ei vabasta seda. Mälu eraldatakse ainult siis, kui protsess seda tegelikult kasutab. Juhtub, et OS-il pole vaba mälu, kuid see määrab protsessile mälu ja kui protsess seda vajab, eraldab OS selle võimaluse korral. Negatiivne külg on see, et mõnikord OS reserveerib mälu, kuid õigel ajal pole vaba mälu ja süsteem jookseb kokku. OOM mängib selles stsenaariumis olulist rolli ja lõpetab protsessid, et vältida kerneli paanikasse sattumist. Kui PostgreSQL-protsess on sunnitud lõpetama, kuvatakse logis 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.

  1. Kernel vajab enda jaoks minimaalset mälu.
  2. Peate vabastama palju mälu.
  3. Vähe mälu kasutavaid protsesse pole vaja lõpetada.
  4. Minimaalsed protsessid tuleb lõpule viia.
  5. 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
2

Kui 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_adj

Väärtuse määramiseks oom_score_adj, määrake teenuseplokis OOMScoreAdjust:

[Service]
OOMScoreAdjust=-1000

Või kasutada oomprotect meeskonnas rcctl.

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

Protsessi 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

Linuxis saate OOM-Killeri lubada või keelata (kuigi viimane pole soovitatav). 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 = 1

OOM-Killeri keelamiseks määrake samas käsus väärtus 0:

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

Selle 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.conf

Teine 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
0

Kui määrate väärtuseks 0, siis kui mälu saab otsa, ei teki tuumapaanikat.

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

Kui määrate väärtuseks 1, siis kui mälu saab otsa, tekib kerneli paanika.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killerit ei saa ainult sisse ja välja lülitada. Oleme juba öelnud, et Linux saab reserveerida protsesside jaoks rohkem mälu, kui see on tegelikult eraldamata, ja seda käitumist juhib Linuxi tuuma parameeter. Selle eest vastutab muutuja vm.overcommit_memory.

Selle jaoks saate määrata järgmised väärtused:

0: Kernel ise otsustab, kas reserveerida liiga palju mälu. See on enamiku Linuxi versioonide vaikeseade.
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

Lisa kommentaar