Konfigurojmë Out-Of-Memory Killer në Linux për PostgreSQL

Konfigurojmë Out-Of-Memory Killer në Linux për PostgreSQL

Kur njĂ« server baze tĂ« dhĂ«nash Linux pĂ«rfundon papritur, Ă«shtĂ« e nevojshme tĂ« gjejmĂ« shkakun. Mund tĂ« ketĂ« disa arsye. PĂ«r shembull, SIGSEGV — njĂ« dĂ«shtim pĂ«r shkak tĂ« njĂ« gabimi nĂ« serverin backend. Por kjo Ă«shtĂ« e rrallĂ«. MĂ« shpesh, thjesht pĂ«rfundojnĂ« hapĂ«sira nĂ« disk ose memorie. NĂ«se mbaron hapĂ«sira nĂ« disk, ka njĂ« zgjidhje — çliro hapĂ«sirĂ« dhe ri-starto bazĂ«n e tĂ« dhĂ«nave.

Killer-i i Memorisë

Kur server apo procesi mbaron memorien, Linux ofron 2 mënyra zgjidhjeje: të dështojë e gjithë sistemi ose të mbyllë procesin (aplikacionin) që konsumon memorien. Më mirë është, natyrisht, të mbyllim procesin dhe të shpëtojmë OS-në nga një përfundim të papritur. Në dy fjalë, Killer-i i Memorisë është një proces që mbyll aplikacionin, për să ruajë bërthamën nga dështimi. Le të diskutojmë fillimisht se si funksionon OOM dhe si mund ta kontrollojmë, dhe pastaj do të shohim si vendos Killer-i i OOM-së se cili aplikacion të mbyllet.

Një nga detyrat kryesore të Linux-it është ndarja e memories për proceset kur ato e kërkojnë atë. Normalisht, një proces ose aplikacion kërkon memorie nga OS, por vetë e përdor atë jo plotësisht. Nëse OS-i do t'i jepte memorie të gjithëve që e kërkojnë, por nuk planifikojnë ta përdorin, shpejt do të mbaronte memoria dhe sistemi do të dështonin. Për ta evituar këtë, OS-i rezervon memorien për procesin, por në fakt nuk e jep atë. Memoria jepet vetëm kur procesi vërtet është gati ta përdorë. Ndonjëherë ndodh që OS-i nuk ka memorje të lirë, por rezervon memorie për procesin, dhe kur procesi e ka nevojë, OS-i e ndan atë, nëse është e mundur. Mangësia është se ndonjëherë OS-i rezervon memorie, por në momentin e nevojës nuk ka memorie të lirë, dhe ndodh një dështim i sistemit. OOM luan një rol të rëndësishëm në këtë skenar dhe përfundon proceset për ta mbrojtur bërthamën nga panika. Kur një proces PostgreSQL mbyllet me forcë, në log shfaqet një mesazh:

Out of Memory: U vra process 12345 (postgres).

NĂ«se sistemi ka pak memorie dhe nuk Ă«shtĂ« e mundur tĂ« lirohet, funksioni out_of_memory. NĂ« kĂ«tĂ« fazĂ«, mbetet vetĂ«m njĂ« gjĂ« — tĂ« pĂ«rfundojĂ« njĂ« ose mĂ« shumĂ« procese. OOM-killer duhet tĂ« pĂ«rfundojĂ« procesin menjĂ«herĂ« apo mund tĂ« presĂ«? ËshtĂ« e qartĂ« se kur thirret out_of_memory, kjo lidhet me pritjen e operacionit tĂ« input-it dhe output-it ose me swap-in nĂ« disk. Prandaj, OOM-killer duhet fillimisht tĂ« kryejĂ« kontrollime dhe, bazuar nĂ« ato, tĂ« vendosĂ« se cilin proces duhet tĂ« pĂ«rfundojĂ«. NĂ«se tĂ« gjitha kontrollimet e mĂ«poshtme japin njĂ« rezultat pozitiv, OOM do tĂ« pĂ«rfundojĂ« procesin.

Zgjedhja e procesit

Kur pĂ«rfundon memorie thirret funksioni. NĂ« tĂ« ka njĂ« funksion , i cili merr njĂ« vlerĂ«sim nga funksioni. Procesi mĂ« i ‘keq’ do tĂ« pĂ«rfshihet. Funksioni zgjedh njĂ« proces sipas disa rregullave.NjĂ« bĂ«rthamĂ« ka nevojĂ« pĂ«r njĂ« minimum memorie pĂ«r veten e saj. zgjedh njĂ« proces sipas disa rregullave. Duhet tĂ« lirohet shumĂ« memorie.

  1. Nuk është e nevojshme të përfundohen proceset që përdorin pak memorie.
  2. Duhet të përfundojnë një minimum procesesh.
  3. Algoritme tĂ« ndĂ«rlikuara qĂ« rrisin shanset pĂ«r pĂ«rfundimin e atyre proceseve qĂ« pĂ«rdoruesi dĂ«shiron t’i pĂ«rfundojĂ«.
  4. Pasi të kryhen të gjitha këto kontrollime, OOM shqyrton vlerësimin (
  5. oom_score

). OOM caktonrezultati_oom). OOM caktuar rezultati_oom çdo procesi, dhe pastaj e shumzon këtë vlerë me volumet e memories. Proceset që kanë vlera të larta kanë më shumë mundësi të bëhen viktima të OOM Killer. Proceset e lidhura me një përdorues me privilegje kanë një vlerësim më të ulët dhe më pak mundësi për t'u mbyllur me forcë.

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

Identifikuesi i procesit Postgres është 3813, prandaj në një terminal tjetër mund të merrni vlerësimin duke përdorur këtë parametër të bërthamës. rezultati_oom:

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

Nëse nuk dëshironi fare që OOM-Killer të mbyllë procesin, ka një parametër tjetër të bërthamës: oom_score_adj. Shtoni një vlerë të madhe negative për të ulur mundësitë e mbylljes së një procesi të vlefshëm për ju.

sudo echo -100 > /proc/3813/oom_score_adj

Për të vendosur vlerën oom_score_adj, vendosni OOMScoreAdjust në blokun e shërbimit:

[Service]
OOMScoreAdjust=-1000

Ose përdorni oomprotect në komandën rcctl.

rcctl set servicename oomprotect -1000

Mbyllja 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 të përfunduar procesin. Në rastin e mungesës së memories oom_kill() thirret këtë funksion për të dërguar procesit sinjalin SIGKILL. Një mesazh regjistrohet në logun e bërthamës.

Memorie e Shkurtuar: Vrasin procesin [pid] [name].

Si të kontrolloni OOM-Killer

Në Linux, mund të aktivizoni dhe çaktivizoni OOM-Killer (megjithëse kjo e fundit nuk rekomandohet). Për ta aktivizuar dhe çaktivizuar, 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 nevojitet më shumë stabilitet, shtoni këtë rresht në skedarin /etc/sysctl.conf:

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

Një mënyrë tjetër për të aktivizuar dhe çaktivizuar është të shkruani variable panic_on_oom. Vlera gjithmonë mund të kontrollohet në /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Nëse caktoni vlerën 0, në momentin që skadon memoria, nuk do të ketë panic të bërthamës.

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

Nëse caktoni vlerën 1, në momentin që skadon memoria, do të ndodhi panic të bërthamës.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer mund të aktivizohet ose çaktivizohet. Ne kemi thënë se Linux mund të rezervojë më shumë memorie për proceset sesa ka në të vërtetë, por nuk e alokon atë, dhe ky funksion kontrollohet nga një parametër i bërthamës Linux. Kjo menaxhohet nga variabla vm.overcommit_memory.

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

0: bërthama vendos vetë nëse duhet të rezervojë shumë memorie. Kjo është vlera e paracaktuar në shumicën e versioneve të Linux-it.
1: bërthama gjithmonë do të rezervojë memorien e tepërt. Kjo është e rrezikshme, sepse memoria mund të mbarojë, sepse është shumë e mundur që një ditë proceset do të kërkojnë atë që është caktuar.
2: bërthama nuk do të rezervojë më shumë memorie se sa specifikohet në parametër overcommit_ratio.

NĂ« kĂ«tĂ« parametĂ«r specifikoni pĂ«rqindjen e memories pĂ«r tĂ« cilĂ«n Ă«shtĂ« e lejuar rezervimi i tepĂ«rt. NĂ«se nuk ka hapĂ«sirĂ«, memĂłria nuk alokohet, dhe rezerva do tĂ« refuzohet. Kjo Ă«shtĂ« opsioni mĂ« i sigurt, i rekomanduar pĂ«r PostgreSQL. OOM-Killer ndikohet edhe nga njĂ« element tjetĂ«r - mundĂ«sia e swap-it, qĂ« kontrollohet nga variabla cat /proc/sys/vm/swappiness. KĂ«to vlera i tregojnĂ« bĂ«rthamĂ«s se si tĂ« trajtojĂ« shkarkimin e faqeve. Sa mĂ« e madhe tĂ« jetĂ« vlere, aq mĂ« pak Ă«shtĂ« probabiliteti qĂ« OOM tĂ« pĂ«rfundojĂ« procesin, por pĂ«r shkak tĂ« operacioneve tĂ« hyrjes-daljes, kjo ndikon negativisht te baza e tĂ« dhĂ«nave. E anasjellta — sa mĂ« e vogĂ«l tĂ« jetĂ« vlere, aq mĂ« e lartĂ« Ă«shtĂ« probabiliteti i ndĂ«rhyrjes nga OOM-Killer, por gjithashtu performanca e bazĂ«s sĂ« tĂ« dhĂ«nave Ă«shtĂ« mĂ« e lartĂ«. Vlera e parazgjedhur Ă«shtĂ« 60, por nĂ«se e gjithĂ« baza e tĂ« dhĂ«nave Ă«shtĂ« nĂ« memorie, Ă«shtĂ« mĂ« mirĂ« tĂ« vendosni vlerĂ«n 1.

Përfundimet

Mos u trembni 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 ndërprerjet emergjente. Për të mos përdorur OOM-Killer për të përfunduar PostgreSQL, vendosni për vm.overcommit_memory vlerën 2. Kjo nuk garanton që OOM-Killer nuk do të duhet të ndërhyjë, por do të ulë probabilitetin e ndalimit të detyruar të procesit PostgreSQL.

Burimi: habr.com

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