Konfigurimi i Out-Of-Memory Killer në Linux për PostgreSQL

Konfigurimi i Out-Of-Memory Killer në Linux për PostgreSQL

Kur njĂ« server baze tĂ« dhĂ«nash Linux mbyllet papritur, duhet tĂ« gjejmĂ« shkakun. Shkaqet mund tĂ« jenĂ« tĂ« ndryshme. PĂ«r shembull, SIGSEGV — njĂ« dĂ«shtim pĂ«r shkak tĂ« njĂ« defekti nĂ« serverin e prapaskenĂ«s. Por kjo ndodh rrallĂ«. Shpesh, thjesht pĂ«rfundon hapĂ«sira nĂ« disk ose memoria. NĂ«se hapĂ«sira e diskut pĂ«rfundon, ka njĂ« rrugĂ« — tĂ« lirohet hapĂ«sira dhe tĂ« ripĂ«rsĂ«ritet baze e tĂ« dhĂ«nave.

Out-Of-Memory Killer

Kur sistemi serverë apo procesi përfundon memorien, Linux ofron 2 rrugë zgjidhjeje: të shembë gjithë sistemin ose të mbyllë procesin (aplikacionin), i cili po konsumon memorien. Më mirë, sigurisht, të mbyllim procesin dhe ta shpëtojmë OS nga një mbyllje emergjente. Në dy fjalë, Out-Of-Memory Killer është një proces që mbyll aplikacionin për të shpëtuar bërthamën nga dështimi. Ai sakrifikon aplikacionin për të ruajtur funksionimin e OS. Le të diskutojmë fillimisht se si funksionon OOM dhe si e kontrollojmë, dhe më pas të shohim se si OOM Killer vendos se cilin aplikacion të mbyllë.

Një nga detyrat kryesore të Linux është caktimi i memories për proceset kur ato e kërkojnë atë. Zakonisht një proces apo aplikacion kërkon memorie nga OS, ndërsa vetë e përdor atë jo plotësisht. Nëse OS do të jepte memorie të gjithë atyre që e kërkojnë, por nuk planifikojnë ta përdorin, shumë shpejt memorja do të përfundojë, dhe sistemi do të dështojë. Për të shmangur këtë, OS rezervon memorinë për procesin, por në fakt nuk e jep atë. Memoria caktuale jepet vetëm kur procesi vërtet ka nevojë për të. Ndonjëherë ndodh që OS nuk ka memorie të lirë, por e rezervon memorien për procesin, dhe kur procesi e kërkon atë, OS e jep, nëse mundet. Problemi është që në disa raste OS rezervon memorie, por në momentin e nevojshëm, nuk ka memorie të lirë, dhe ndodh një dështim i sistemit. OOM ka një rol të rëndësishëm në këtë skenar dhe mbyll proceset për të mbrojtur bërthamën nga paniku. Kur mbyllet për forcë një proces PostgreSQL, në log shfaqet mesazh:

Out of Memory: U mbyll procesi 12345 (postgres).

Nëse në sistem ka pak memorie dhe nuk mund të lirohet, thirret funksioni out_of_memory. Në këtë fazë, i mbetet vetëm një gjë - të mbyllë një ose më shumë procese. OOM-killer duhet të mbyllë procesin menjëherë ose mund të presë? Sigurisht, kur ndodh out_of_memory, është e lidhur me pritjen për një operacion input-output ose shkëmbimin e faqeve në disk. Prandaj, OOM-killer duhet të kryejë fillimisht kontrollime dhe bazuar në to të vendosë se çfarë duhet të mbyllet. Nëse të gjitha kontrollimet e mëposhtme rezultojnë pozitive, OOM do të mbyllë procesin.

Zgjedhja e procesit

Kur mbaron memoria, thirret funksioni out_of_memory(). Në të ka një funksion select_bad_process(), i cili merr një vlerësim nga funksioni badness(). Procesi më 'i keq' do të bjerë në mëngë. Funksioni badness() zgjedh procesin sipas rregullave të caktuara.

  1. Nukorë i nevojitet një minimum i caktuar i memories për veten e tij.
  2. Duhet të lirohen shumë memoria.
  3. Nuk duhet të mbyllen proceset që përdorin pak memorie.
  4. Duhet të mbyllen minimumi i proceseve.
  5. Algoritmet komplekse, të cilat rrisin shanset për të mbyllur ato procese që përdoruesi dëshiron vetë të mbyllë.

Pas kryerjes së të gjitha këtyre kontrollimeve, OOM shqyrton vlerësimin (oom_score). OOM i cakton oom_score çdo procesi, dhe pastaj e shumzimin këtë vlerë me sasinë e memories. Proceset me vlera më të mëdha kanë më shumë shanse të bëhen viktimë e OOM Killer. Proceset që lidhen me një përdorues privilegjuar kanë një vlerësim më të ulët dhe më pak shanse për t'u mbyllur me forcë.

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

Identifikuesi i procesit Postgres është 3813, kështu që në një shell tjetër mund të merrni vlerësimin duke përdorur këtë parametrin e bërthamës oom_score:

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

Nëse nuk dëshiron që OOM-Killer të mbyllë procesin, ka një tjetër parametrin e bërthamës: oom_score_adj. Shtoni një vlerë shumë negative për të ulur shanset për të mbyllur procesin që ju intereson.

sudo echo -100 > /proc/3813/oom_score_adj

Për të caktuar vlerën oom_score_adj, vendosni OOMScoreAdjust në bllokun e shërbimit:

[Shërbimi]
OOMScoreAdjust=-1000

Ose përdorni oomprotect në komandë rcctl.

rcctl set emri i shërbimit oomprotect -1000

Mbyllja e detyruar e procesit

Kur një ose më shumë procese janë zgjedhur tashmë, OOM-Killer thërret funksionin oom_kill_task(). Ky funksion dërgon një sinjal për mbyllje në proces. Në rast mungese të memories oom_kill() thërret këtë funksion për të dërguar procesit sinjalin SIGKILL. Një mesazh regjistrohet në logun e bërthamës.

Out of Memory: Procesi u mbyll [pid] [emri].

Si si duhet të kontrolloni OOM-Killer

Në Linux mund të aktivizoni dhe çaktivizoni OOM-Killer (megjithëse e fundit nuk rekomandohet). Përdorni parametrin vm.oom-kill. Për të aktivizuar OOM-Killer në mjedisin e ekzekutimit, ekzekutoni komandën sysctl.

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

Për të çaktivizuar OOM-Killer, caktoni vlerën 0 në këtë komandë të njëjtë:

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

Rezultati i kësaj komande do të ruhet përkohësisht, deri në rinisjen e parë. Nëse kërkoni më shumë qëndrueshmëri, shtoni këtë rresht në skedarin /etc/sysctl.conf:

echo vm.oom-kill = 1 >> /etc/sysctl.conf

Një mënyrë tjetër për ta aktivizuar dhe çaktivizuar - shkruani variablën panic_on_oom. Vlera mund të verifikohet gjithmonë në /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Nëse vendosni vlerën 0, kur mbaron memoria, nuk do të ketë panic të kernel-it.

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

Nëse vendosni vlerën 1, kur mbaron memoria, do të ndodhë panic i kernel-it.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer mund të aktivizohet dhe çaktivizohet. Ne tashmë e kemi thënë se Linux mund të rezervojë për proceset më shumë memorie se sa ka në dispozicion, por nuk e alokon atë në fakt, dhe ky sjellje kontrollohet nga parametrat e kernel-it të Linux. Kjo është përgjegjësia e variablës vm.overcommit_memory.

Për të mund të caktohen vlerat e mëposhtme:

0: kernel-i vendos vetë nëse duhet të rezervojë më shumë memorie. Kjo është vlera e paracaktuar në shumicën e versioneve të Linux-it.
1: kernel-i gjithmonë do të rezervojë memori të tepërt. Kjo është rrezikshme, sepse memoria mund të mbarojë, sepse shumë mundësi procesesh mund të kërkojnë atë që është e caktuar.
2: kernel-i nuk do të rezervojë më shumë memorie se sa e caktuar në parametrin overcommit_ratio.

Në këtë parametr ka një përqindje të memories për të cilën lejohet rezervimi i tepërt. Nëse nuk ka hapësirë për të, memoria nuk alokohet, dhe rezervimi nuk do të bëhet. Kjo është mundësia më e sigurt, e rekomanduar për PostgreSQL. Një element tjetër që ndikon në OOM-Killer është mundësia e swap-it, që kontrollohet nga variabla cat /proc/sys/vm/swappiness. Këto vlera u japin udhëzime kernel-it se si të trajtojë pagesat e swap-it. Sa më e lartë të jetë vlera, aq më pak është e mundur që OOM të përfundojë një proces, por për shkak të operacioneve të hyrjes-daljes, kjo ndikon negativisht në bazën e të dhënave. E kundërta - sa më e ulët të jetë vlera, aq më e lartë është mundësia që OOM-Killer të ndërhyjë, por gjithashtu performanca e bazës së të dhënave është më e lartë. Vlera e paracaktuar është 60, por nëse e gjithë baza e të dhënave është në memorie, është më mirë të vendosni vlerën 1.

Përfundime

Mos u friksoni nga "vrasësi" në OOM-Killer. Në këtë rast, vrasësi do të jetë shpëtimtari i sistemit tuaj. Ai "vret" proceset më problematike dhe shpëton sistemin nga përfundimi i papritur. Për të shmangur përdorimin e OOM-Killer për përfundimin e PostgreSQL, vendosni për vm.overcommit_memory vlerën 2. Kjo nuk garanton që OOM-Killer nuk do të kërkojë ndërhyrje, por do të ulë probabilitetin e përfundimit të detyrueshëm të procesit PostgreSQL.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster