MĂ€lu otsa saamise tapja seadistamine Linux PostgreSQL-i jaoks

MĂ€lu otsa saamise tapja seadistamine Linux PostgreSQL-i jaoks

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.

  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

В 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 = 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

Nagu 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

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster