Seadistame Linuxis Out-Of-Memory Killer'i PostgreSQL jaoks

Seadistame Linuxis Out-Of-Memory Killer'i PostgreSQL jaoks

Kui Linuxi andmebaasi server ootamatult sulgub, tuleb leida pĂ”hjus. PĂ”hjuseid vĂ”ib olla mitu. NĂ€iteks, SIGSEGV — viga, mis tuleneb bĂ€kendi serveri tĂ”rkest. Kuid see on haruldane. Enamasti lĂ”peb lihtsalt kettaruumi vĂ”i mĂ€lu. Kui kettaruumi on lĂ”ppenud, on lahendus ĂŒks — vabastada ruumi ja taaskĂ€ivita andmebaas.

Out-Of-Memory Killer

Kui serverilt vĂ”i protsessil on mĂ€lu lĂ”ppenud, pakub Linux 2 lahendust: kas kukutada kogu sĂŒsteem vĂ”i lĂ”petada protsess (rakendus), mis mĂ€luruumi tarbib. Parim variant on, et lĂ”petada protsess ja pÀÀsta operatsioonisĂŒsteem kriitilisest seiskumisest. Lihtsustatult, Out-Of-Memory Killer on protsess, mis lĂ”petab rakenduse, et kaitsta tuuma tĂ”rkest. Ta ohverdab rakenduse, et hoida operatsioonisĂŒsteem töös. Arutame kĂ”igepealt, kuidas OOM töötab ja kuidas seda kontrollida, seejĂ€rel vaatame, kuidas OOM Killer otsustab, millise rakenduse lĂ”petada.

Üks peamisi Linuxi ĂŒlesandeid on eraldada mĂ€lu protsessidele, kui nad seda kĂŒsivad. Tavaline protsess vĂ”i rakendus kĂŒsib operatsioonisĂŒsteemilt mĂ€lu, kuid kasutab seda tĂ€ielikult mitte. Kui operatsioonisĂŒsteem jagab mĂ€lu kĂ”igile, kes seda paluvad, kuid ei kavatse seda kasutada, lĂ”peb mĂ€lu kiiresti ja sĂŒsteem lĂ”petab töö. Selle vĂ€ltimiseks eraldab operatsioonisĂŒsteem mĂ€lu protsessile, kuid ei anna seda tegelikult. MĂ€lu eraldatakse alles siis, kui protsess tĂ”eliselt kavatseb seda kasutada. Juhtub, et operatsioonisĂŒsteemil ei ole vaba mĂ€lu, kuid see eraldab mĂ€lu protsessile ja kui protsess seda vajab, eraldab operatsioonisĂŒsteem selle, kui saab. Miinus on see, et mĂ”nikord eraldab operatsioonisĂŒsteem mĂ€lu, kuid vajalikul hetkel ei ole vaba mĂ€lu, ja sĂŒsteem kukub kokku. OOM mĂ€ngib selles stsenaariumis olulist rolli ning lĂ”petab protsessid, et kaitsta tuuma paanikast. Kui PostgreSQL protsess on sunnitud lĂ”petama, ilmub logisse sĂ”num:

Out of Memory: Killed process 12345 (postgres).

Kui sĂŒsteemis on vĂ€he mĂ€lu ja seda ei saa vabastada, kutsutakse vĂ€lja funktsioon out_of_memory. Sel hetkel jÀÀb tal vaid ĂŒks ĂŒlesanne – lĂ”petada ĂŒks vĂ”i mitu protsessi. OOM-killer peab protsessi kohe lĂ”petama vĂ”i vĂ”ib oodata? Ilmselgelt, kui out_of_memory kutsutakse esile, on see seotud sisendi/outputs operatsiooni ootamise vĂ”i lehe vahetamisega kettale. SeetĂ”ttu peab OOM-killer esmalt teostama kontrollid ja nende pĂ”hjal otsustama, mida lĂ”petada. Kui kĂ”ik allpool kirjutatud kontrollid annavad positiivse tulemuse, lĂ”petab OOM protsessi.

Protsessi valimine

Kui mÀlu on otsas, kutsutakse vÀlja funktsioon out_of_memory(). Seal on funktsioon select_bad_process(), mis saab hindamise funktsioonilt badness(). Alati satub pahamaine protsess. Funktsioon badness() valib protsessi teatud reeglite jÀrgi.

  1. Tuuma jaoks on vajalik mingi minimaalne mÀlu.
  2. On vajalik vabastada palju mÀlu.
  3. Ei ole vaja lÔpetada protsesse, mis kasutavad vÀhe mÀlu.
  4. On vajalik lÔpetada vÀhemalt mÔni protsess.
  5. Kompiksed algoritmid, mis suurendavad vÔimalusi lÔpetada just neid protsesse, mida kasutaja soovib lÔpetada.

PÀrast kÔiki neid kontrollimisprotseduure uurib OOM hindet (oom_score). OOM mÀÀrab oom_score iga protsessi jaoks ja seejÀrel korrutab selle vÀÀrtuse mÀlu mahuga. Suurte vÀÀrtustega protsessidel on suuremad vÔimalused OOM Killeriks saamisele. Privilegiseeritud kasutajaga seotud protsessidel on madalam hinnang ja vÀhem vÔimalusi sunniviisiliseks lÔpetamiseks.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

Postgresi protsessi identifikaator on 3813, seega saab teises konsoolis hindet kÀtte, kasutades seda tuuma parameetrit oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Kui te tĂ”eliselt ei soovi, et OOM-Killer lĂ”petaks protsessi, on veel ĂŒks tuuma parameeter: oom_score_adj. Lisage suur negatiivne vÀÀrtus, et vĂ€hendada kallis protsessi lĂ”petamise vĂ”imalusi.

sudo echo -100 > /proc/3813/oom_score_adj

Selle vÀÀrtuse seadmiseks oom_score_adj, seadke OOMScoreAdjust teenuse plokis:

[Service]
OOMScoreAdjust=-1000

VÔi kasutage oomprotect komandos rcctl.

rcctl set servicename oomprotect -1000

Protsessi sunniviisiline lÔpetamine

Kui ĂŒks vĂ”i mitu protsessi on juba valitud, kutsub OOM-Killer vĂ€lja funktsiooni oom_kill_task(). See funktsioon saadab protsessile lĂ”petamis signaali. MĂ€lupuuduse korral oom_kill() kutsub selle funktsiooni vĂ€lja, et saata protsessile SIGKILL signaal. Logisse registreeritakse sĂ”num.

Out of Memory: Killed process [pid] [name].

Kuidas juhtida OOM-Killera

Linuxis saab OOM-Killera lubada ja keelata (kuigi viimast ei soovitata). Lubamiseks ja keelamiseks kasutage parameetrit vm.oom-kill. OOM-Killera lubamiseks tööaegses keskkonnas kÀivitage kÀsk sysctl.

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

OOM-Killera keelamiseks mÀÀrake selle sama kÀsu vÀÀrtuseks 0:

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

Selle kĂ€su tulemus salvestatakse mitte igavesti, vaid ainult kuni esimese taaskĂ€ivitamiseni. 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 kirjutada muutuja panic_on_oom. Selle vÀÀrtust saab alati kontrollida /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Kui vÀÀrtus on 0, siis kui mÀlu otsa saab, kernel panic ei toimu.

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

Kui vÀÀrtus on 1, siis kui mÀlu otsa saab, toimub kernel panic.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killera ei saa ainult lubada ja keelduda. Oleme juba rÀÀkinud, et Linux vÔib protsessidele reserveerida rohkem mÀlu, kui on olemas, kuid mitte tegelikult eraldada, ning selle kÀitumise eest vastutab Linuxi tuuma parameeter. Selle eest vastutab muutuja vm.overcommit_memory.

Sellele saab mÀÀrata jÀrgmised vÀÀrtused:

0: tuuma otsustab ise, kas reserveerida liiga palju mÀlu. See on vaikimisi vÀÀrtus enamikus Linuxi versioonides.
1: tuuma reserveerib alati liigset mÀlu. See on riskantne, sest mÀlu vÔib lÔppeda, kuna tÔenÀoliselt kord protsessid nÔuavad vajalikku.
2: tuuma ei reserveeri rohkem mÀlu, kui on mÀÀratud parameetris overcommit_ratio.

Selles parameetris mÀÀrate protsendi mĂ€lu, mille jaoks on lubatud ĂŒlemÀÀrane reserveerimine. Kui sellele ei ole ruumi, siis mĂ€lu ei eraldata, reserveerimine saadetakse tagasi. See on kĂ”ige ohutum variant, mida soovitatakse PostgreSQL-i jaoks. OOM-Killera mĂ”jutab veel ĂŒks element - swapimise vĂ”imalus, mida juhib muutuja cat /proc/sys/vm/swappiness. Needja vÀÀrtused nĂ€itavad sĂŒdamikule, kuidas lehe vahetust töödelda. Mida suurem on vÀÀrtus, seda vĂ€iksem on tĂ”enĂ€osus, et OOM lĂ”petab protsessi, kuid sisendi- ja vĂ€ljundioperatsioonide tĂ”ttu halvendab see andmebaasi tööd. Ja vastupidi — mida vĂ€iksem on vÀÀrtus, seda suurem on tĂ”enĂ€osus, et OOM-Killer sekkub, kuid andmebaasi jĂ”udlus on ka kĂ”rgem. VaikevÀÀrtus on 60, kuid kui kogu andmebaas mahtus mĂ€llu, on parem seadistada vÀÀrtus 1.

Summary

Ärge laske end heidutada OOM-Killeris esinevatest "tappjatest". Antud juhul on tappja teie sĂŒsteemi pÀÀstja. See "tapab" kĂ”ige enam kahjulikud protsessid ja pÀÀstab sĂŒsteemi avarii lĂ”petamisest. Selleks, et ei peaks OOM-Killeri kasutama PostgreSQL lĂ”petamiseks, seadke vm.overcommit_memory vÀÀrtus 2. See ei taga, et OOM-Killerit ei pea sekkuma, kuid vĂ€hendab tĂ”enĂ€osust, et PostgreSQL protsess lĂ”petatakse sundimisega.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster