
Kui Linuxi andmebaasi server ootamatult kokku kukub, tuleb leida pĂ”hjus. PĂ”hjuseid vĂ”ib olla mitmeid. NĂ€iteks, SIGSEGV â tĂ”rge tagasiserveris. Kuid see on haruldane. Sageli lĂ”ppeb lihtsalt ruum kettal vĂ”i mĂ€lu. Kui kettaruumi on otsa saanud, on ainus vĂ”imalus vabastada ruumi ja taaskĂ€ivitada andmebaas.
Out-Of-Memory Killer
Kui serverile vĂ”i protsessil on mĂ€lu otsas, pakub Linux 2 lahendusteed: kas lĂ”hkuda kogu sĂŒsteem vĂ”i lĂ”petada protsess (rakendus), mis mĂ€lu tarbib. Parim on loomulikult lĂ”petada protsess ja pÀÀsta operatsioonisĂŒsteem hĂ€daseisundist. Lihtsalt öeldes, Out-Of-Memory Killer on protsess, mis lĂ”petab rakenduse, et pÀÀsta kernel kokkuvarisemisest. Ta ohverdab rakenduse, et hoida operatsioonisĂŒsteem töökorras. Alustame OOM-i töö ja selle kontrollimise arutamisest ning seejĂ€rel vaatame, kuidas OOM Killer otsustab, millist rakendust lĂ”petada.
Ăks peamisi Linuxi ĂŒlesandeid on eraldada mĂ€lu protsessidele, kui nad seda kĂŒsivad. Tavaline protsess vĂ”i rakendus kĂŒsib OS-ilt mĂ€lu, kuid kasutab seda tĂ€ielikult mitte. Kui OS hakkab andma mĂ€lu kĂ”igile, kes seda kĂŒsivad, kuid ei kavatse seda kasutada, lĂ”peb mĂ€lu peagi ja sĂŒsteem ebaĂ”nnestub. Selle vĂ€ltimiseks reserveerib OS mĂ€lu protsessi jaoks, kuid ei anna seda tegelikult vĂ€lja. MĂ€lu eraldatakse ainult siis, kui protsess on tĂ”eliselt valmis seda kasutama. Juhtub, et OS-il pole vaba mĂ€lu, kuid ta eraldab mĂ€lu protsessile, ja kui protsess vajab, annab OS seda vĂ€lja, kui saab. Puuduseks on see, et mĂ”nikord reserveerib OS mĂ€lu, kuid vajaliku hetke jaoks ei ole vaba mĂ€lu ja sĂŒsteem ebaĂ”nnestub. OOM mĂ€ngib selles stsenaariumis olulist rolli ja lĂ”petab protsessid, et kaitsta tuuma paanikast. Kui PostgreSQL protsess sunnitakse lĂ”petama, ilmub logisse jĂ€rgmine sĂ”num:
Out of Memory: Tapetud protsess 12345 (postgres).Kui sĂŒsteemis on vĂ€he mĂ€lu ja seda ei saa vabastada, kutsutakse esile funktsioon out_of_memory. Sel hetkel on tal vaid ĂŒks ĂŒlesanne - lĂ”petada ĂŒks vĂ”i mitu protsessi. OOM-tapja peab kas lĂ”petama protsessi kohe vĂ”i vĂ”ime oodata? Ilmselgelt, kui tĂ”stetakse esile mĂ€lu puudumine, on see seotud sisend-vĂ€ljund operatsiooni ootamise vĂ”i lehe vahetamisega kettale. SeetĂ”ttu peab OOM-tapja esmalt tegema kontrollid ja nende pĂ”hjal otsustama, millist protsessi lĂ”petada. Kui kĂ”ik jĂ€rgmised kontrollid annavad positiivse tulemuse, lĂ”petab OOM protsessi.
Protsessi valimine
Kui mĂ€lu lĂ”peb, kutsutakse ĂŒlesanne out_of_memory(). Seal on funktsioon select_bad_process(), mis saab hinnangu funktsioonilt badness(). KĂ”ige "halvem" protsess on sihtmĂ€rk. Funktsioon badness() valib protsessi teatud reeglite alusel.
- Kern vajab mingisugust minimaalsed mÀlu enda jaoks.
- Tuleb vabastada palju mÀlu.
- Ei ole vaja lÔpetada protsesse, mis kasutavad vÀhe mÀlu.
- Tuleb lÔpetada vÀhemalt protsessid.
- Ahned algoritmid, mis suurendavad tÔenÀosust nende protsesside lÔpetamiseks, mida kasutaja soovib lÔpetada.
PÀrast nende kontrollide sooritamist uurib OOM hinnangut (oom_score). OOM mÀÀrab oom_score iga protsessile, seejÀrel korrutatakse see mÀlu mahuga. Suure vÀÀrtusega protsessidel on suurem tÔenÀosus saada OOM Killer'i ohvriks. Privilegeeritud kasutajaga seotud protsessidel on madalam skoor ja vÀhem vÔimalusi sundlÔpetamiseks.
postgres=# SELECT pg_backend_pid();
pg_backend_pidÂ
----------------
    3813
(1 row)PostgreSQL protsessi identifikaator on 3813, seega saab teises terminalis skoori saada, kasutades seda tuuma parameetrit. oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Kui te tĂ”esti ei soovi, et OOM-Killer lĂ”petaks protsessi, on veel ĂŒks tuuma parameeter: oom_score_adj. Lisage suur negatiivne vÀÀrtus, et vĂ€hendada oma oluline protsessi lĂ”petamise tĂ”enĂ€osust.
sudo echo -100 > /proc/3813/oom_score_adjSelle vÀÀrtuse seadmiseks oom_score_adj, seadke OOMScoreAdjust teenuseplokki:
[Service]
OOMScoreAdjust=-1000VÔi kasutage oomprotect komandis rcctl.
rcctl set servicename oomprotect -1000Protsessi sunnitud 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Ă”petamise signaali. Kui mĂ€lu on puudulik, oom_kill() kutsub korraldab selle funktsiooni, et saata protsessile SIGKILL signaal. SĂŒdamiku logisse kantakse teade.
MĂ€lu puudus: protsess katkestati [pid] [name].Kuidas kontrollida OOM-Killerit
Linuxis saab OOM-Killerit lubada ja keelata (kuigi viimane ei ole soovitatav). Selle lubamiseks ja keelamiseks kasutage parameetrit vm.oom-kill. OOM-Killeri lubamiseks tegevuses kÀivitage kÀsk sysctl.
sudo -s sysctl -w vm.oom-kill=1OOM-Killeri keelamiseks mÀÀrake selle sama kÀsu kaudu 0:
sudo -s sysctl -w vm.oom-kill=0Selle kĂ€su tulemus pĂŒsib ainult kuni esimeses taaskĂ€ivitamisel. Kui on vajalik rohkem pĂŒsivust, lisage see rida faili /etc/sysctl.conf:
echo vm.oom-kill=1 >> /etc/sysctl.confVeel ĂŒks viis lubamiseks ja keelamiseks on kirjutada muutuja panic_on_oom. VÀÀrtust saab alati kontrollida /proc.
$ cat /proc/sys/vm/panic_on_oom
0Kui mÀÀrata vÀÀrtus 0, siis kui mÀlu lÔpeb, ei toimu kernel panic'i.
$ echo 0 > /proc/sys/vm/panic_on_oomKui mÀÀrata vÀÀrtus 1, siis kui mÀlu lÔpeb, toimub kernel panic.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killerit saab mitte ainult sisse ja vĂ€lja lĂŒlitada. Oleme juba rÀÀkinud, et Linux vĂ”ib mÀÀrata protsessidele rohkem mĂ€lu, kui on olemas, kuid ei eralda seda tegelikult, ning selle kĂ€itumise ĂŒle juhib Linuxi tuuma parameeter. Selle eest vastutab muutuja vm.overcommit_memory.
Sellele saab mÀÀrata jÀrgmised vÀÀrtused:
0: tuum otsustab ise, kas on mÔistlik reservida liiga palju mÀlu. See on vaikimisi seadistus enamikus Linuxi versioonides.
1: tuum alati reserveerib ĂŒlemÀÀrase mĂ€lu. See on riskantne, kuna mĂ€lu vĂ”ib otsa saada, sest tĂ”enĂ€oliselt nĂ”uavad protsessid mingil hetkel vajalikku.
2: tuum ei reserveeri rohkem mÀlu, kui on mÀÀratud parameetris overcommit_ratio.
Selles parameetris mÀÀrate protsendi mĂ€lust, mille puhul on lubatud ĂŒlemÀÀrane reserveerimine. Kui selleks ei ole ruumi, ei eraldata mĂ€lu, reserveerimisest keeldutakse. See on kĂ”ige ohutum variant, mida soovitatakse PostgreSQL jaoks. OOM-Killerit mĂ”jutab veel ĂŒks tegur â vahetusfaili kasutamine, mida juhib muutuja cat /proc/sys/vm/swappiness. Need help defending against OOM conditions? Adjust the swap settings accordingly. A higher value indicates lower chances of an OOM kill, but it may negatively affect database operations due to I/O overhead. Conversely, a smaller value increases the likelihood of OOM-Killer intervention but also enhances database performance. The default is 60, but if your entire database fits in memory, itâs better to set the value to 1.
KokkuvÔte
Donât be intimidated by the 'killer' in OOM-Killer. In this context, the killer acts as a savior for your system. It 'kills' the most troublesome processes to prevent system crashes. To avoid needing OOM-Killer to terminate PostgreSQL, set it to vm.overcommit_memory the value of 2. This doesnât guarantee OOM-Killer wonât need to intervene, but it will reduce the likelihood of forcibly terminating the PostgreSQL process.
Allikas: habr.com
