
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.
- Nuk është e nevojshme të përfundohen proceset që përdorin pak memorie.
- Duhet të përfundojnë një minimum procesesh.
- Algoritme tĂ« ndĂ«rlikuara qĂ« rrisin shanset pĂ«r pĂ«rfundimin e atyre proceseve qĂ« pĂ«rdoruesi dĂ«shiron tâi pĂ«rfundojĂ«.
- Pasi të kryhen të gjitha këto kontrollime, OOM shqyrton vlerësimin (
- 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
2Në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_adjPër të vendosur vlerën oom_score_adj, vendosni OOMScoreAdjust në blokun e shërbimit:
[Service]
OOMScoreAdjust=-1000Ose përdorni oomprotect në komandën rcctl.
rcctl set servicename oomprotect -1000Mbyllja 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 = 1Për të çaktivizuar OOM-Killer, caktoni vlerën 0 në këtë komandë të njëjtë:
sudo -s sysctl -w vm.oom-kill = 0Rezultati 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.confNjë 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
0Në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_oomNë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_oomOOM-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
