
Kur nĂ« Linux Serveri i bazĂ«s sĂ« tĂ« dhĂ«nave ndĂ«rpritet papritur dhe shkaku duhet tĂ« pĂ«rcaktohet. Mund tĂ« ketĂ« disa arsye. PĂ«r shembull, SIGSEGV â dĂ«shtimi pĂ«r shkak tĂ« njĂ« gabimi nĂ« serverin mbĂ«shtetĂ«s. Por kjo Ă«shtĂ« e rrallĂ«. MĂ« shpesh, thjesht ju mbaron hapĂ«sira nĂ« disk ose memorie. NĂ«se ju mbaron hapĂ«sira nĂ« disk, ka vetĂ«m njĂ« rrugĂ«dalje - lironi hapĂ«sirĂ«n dhe rinisni bazĂ«n e tĂ« dhĂ«nave.
Vrasës jashtë kujtesës
Kur ti server ose procesi mbaron memoria, Linux Vrasësi i Memorjes së Pambaruar ofron dy zgjidhje: të bllokojë të gjithë sistemin ose të ndërpresë procesin (aplikacionin) që po konsumon memorie. Sigurisht, është më mirë të ndërpritet procesi dhe të shpëtohet sistemi operativ nga bllokimi. Shkurt, Vrasësi i Memorjes së Pambaruar është një proces që ndërpret një aplikacion për të shpëtuar bërthamën nga bllokimi. Ai sakrifikon aplikacionin për ta mbajtur sistemin operativ në punë. Le të diskutojmë së pari se si funksionon OOM dhe si ta kontrollojmë atë, dhe pastaj të shohim se si Vrasësi i Memorjes së Pambaruar vendos se cilat aplikacione të ndërpriten.
NjĂ« nga detyrat kryesore Linux â Caktoni memorie pĂ«r proceset kur ato e kĂ«rkojnĂ«. Zakonisht, njĂ« proces ose aplikacion kĂ«rkon memorie nga sistemi operativ, por nuk e pĂ«rdor atĂ« plotĂ«sisht. NĂ«se sistemi operativ cakton memorie pĂ«r tĂ« gjithĂ« ata qĂ« e kĂ«rkojnĂ«, por nuk planifikojnĂ« ta pĂ«rdorin atĂ«, sistemi do tĂ« mbetet shpejt pa memorie dhe sistemi do tĂ« rrĂ«zohet. PĂ«r ta parandaluar kĂ«tĂ«, sistemi operativ rezervon memorie pĂ«r njĂ« proces, por nĂ« tĂ« vĂ«rtetĂ« nuk e cakton atĂ«. Memoria caktohet vetĂ«m kur njĂ« proces synon ta pĂ«rdorĂ« atĂ«. NdonjĂ«herĂ« sistemi operativ nuk ka memorie tĂ« lirĂ«, por i cakton memorie njĂ« procesi, dhe kur procesi ka nevojĂ« pĂ«r tĂ«, sistemi operativ e cakton atĂ« nĂ«se mundet. Ana negative Ă«shtĂ« se ndonjĂ«herĂ« sistemi operativ rezervon memorie, por kur Ă«shtĂ« e nevojshme, nuk ka memorie tĂ« lirĂ«, duke shkaktuar njĂ« rrĂ«zim tĂ« sistemit. OOM luan njĂ« rol kyç nĂ« kĂ«tĂ« skenar, duke i ndĂ«rprerĂ« proceset pĂ«r tĂ« parandaluar panikun e bĂ«rthamĂ«s. Kur procesi PostgreSQL ndĂ«rpritet me forcĂ«, mesazhi i mĂ«poshtĂ«m shfaqet nĂ« regjistĂ«r:
Out of Memory: Killed process 12345 (postgres).Nëse sistemi ka memorie të ulët dhe nuk mund të lirohet, thirret funksioni out_of_memory. Në këtë fazë, asaj i mbetet vetëm një gjë për të bërë - të përfundojë një ose më shumë procese. A duhet që OOM-vrasësi ta përfundojë procesin menjëherë apo mund të presë? Natyrisht, kur thirret out_of_memory, është për shkak të pritjes për një operacion I/O ose paging në disk. Prandaj, vrasësi i OOM duhet së pari të kryejë kontrolle dhe, në bazë të tyre, të vendosë që procesi duhet të përfundojë. Nëse të gjitha kontrollet e mëposhtme janë pozitive, OOM do të përfundojë procesin.
Zgjedhja e procesit
Kur kujtesa mbaron, funksioni thirret out_of_memory(). Ka një funksion select_bad_process(), e cila merr një vlerësim nga funksioni badness(). Procesi "më i keq" do të jetë në shënjestër. Funksioni badness() zgjedh një proces sipas rregullave të caktuara.
- Kerneli ka nevojë për një memorie minimale për vete.
- Ju duhet të lironi shumë memorie.
- Nuk ka nevojë të përfundoni proceset që përdorin pak memorie.
- Proceset minimale duhet të kryhen.
- Algoritme komplekse që rrisin shanset e përfundimit për ato procese që vetë përdoruesi dëshiron të përfundojë.
Pasi ka përfunduar të gjitha këto kontrolle, OOM shqyrton rezultatin (oom_score). OOM emëron oom_score çdo proces, dhe më pas e shumëzon këtë vlerë me sasinë e memories. Proceset me vlera më të mëdha kanë më shumë gjasa të bien viktimë e Vrasësit të OOM. Proceset e lidhura me përdoruesin rrënjë kanë një rezultat më të ulët dhe kanë më pak gjasa të detyrohen të përfundojnë.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)ID-ja e procesit Postgres është 3813, kështu që në një predhë tjetër është e mundur të merret rezultati duke përdorur këtë parametër kernel oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Nëse nuk dëshironi që OOM-Killer të vrasë fare procesin, ekziston një opsion tjetër i kernelit: oom_score_adj. Shtoni një vlerë të madhe negative për të zvogëluar shanset për të përfunduar një proces që vlerësoni.
sudo echo -100 > /proc/3813/oom_score_adjPër të vendosur një vlerë oom_score_adj, vendosni OOMScoreAdjust në bllokun e shërbimit:
[Service]
OOMScoreAdjust=-1000Ose përdorni oomprotect në një ekip rcctl.
rcctl set <i>servicename</i> oomprotect -1000Përfundimi me forcë i një procesi
Kur një ose më shumë procese janë zgjedhur tashmë, OOM-Killer thërret funksionin oom_kill_task(). Ky funksion i dërgon procesit një sinjal përfundimi. Në rast të mungesës së memories oom_kill() E thërret këtë funksion për të dërguar një sinjal SIGKILL në proces. Një mesazh është shkruar në regjistrin e kernelit.
Out of Memory: Killed process [pid] [name].Si të kontrolloni OOM-Killer
РLinux Mund ta aktivizoni ose çaktivizoni OOM-Killer (megjithëse kjo e fundit nuk rekomandohet). Për ta aktivizuar ose çaktivizuar, përdorni parametrin vm.oom-kill. Për të aktivizuar OOM-Killer në kohën e ekzekutimit, ekzekutoni komandën sysctl.
sudo -s sysctl -w vm.oom-kill = 1Për të çaktivizuar OOM-Killer, specifikoni vlerën 0 në të njëjtën komandë:
sudo -s sysctl -w vm.oom-kill = 0Rezultati i kësaj komande nuk do të ruhet përgjithmonë, por vetëm deri në rindezjen e parë. Nëse keni nevojë për më shumë këmbëngulje, shtoni këtë rresht në skedar /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confNjë mënyrë tjetër për të aktivizuar dhe çaktivizuar është të shkruani një ndryshore panic_on_oom. Vlera mund të kontrollohet gjithmonë /proc.
$ cat /proc/sys/vm/panic_on_oom
0Nëse e vendosni vlerën në 0, atëherë kur kujtesa të mbarojë, nuk do të ketë panik të kernelit.
$ echo 0 > /proc/sys/vm/panic_on_oomNëse e vendosni vlerën në 1, atëherë kur kujtesa të mbarojë, do të ndodhë një panik kernel.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer mund të aktivizohet dhe çaktivizohet, siç e kemi përmendur tashmë. Linux mund të rezervojë më shumë memorie për proceset sesa është e disponueshme, por në fakt nuk e ndan atë, dhe kjo sjellje kontrollohet nga një parametër kernel LinuxVariabli është përgjegjës për këtë. vm.overcommit_memory.
Ju mund të specifikoni vlerat e mëposhtme për të:
0: Vetë bërthama vendos nëse do të rezervojë shumë memorie. Kjo është vlera parazgjedhur në shumicën e versioneve. Linux.
1: Kerneli do të rezervojë gjithmonë memorie shtesë. Kjo është e rrezikshme, sepse kujtesa mund të mbarojë, sepse, me shumë mundësi, një ditë proceset do ta kërkojnë atë.
2: kerneli nuk do të rezervojë më shumë memorie sesa është specifikuar në parametër overcommit_ratio.
Me këtë parametër, ju specifikoni përqindjen e memories që lejohet të mbi-rezervohet. Nëse nuk ka vend për të, nuk ndahet memorie dhe rezervimi do të refuzohet. Ky është opsioni më i sigurt i rekomanduar për PostgreSQL. OOM-Killer ndikohet nga një element tjetër - aftësia e shkëmbimit, e cila kontrollohet nga ndryshorja cat /proc/sys/vm/swappiness. Këto vlera i tregojnë kernelit se si të trajtojë paging. Sa më e lartë të jetë vlera, aq më pak ka gjasa që OOM të përfundojë procesin, por për shkak të operacioneve I/O ka një ndikim negativ në bazën e të dhënave. Dhe anasjelltas - sa më e ulët të jetë vlera, aq më e lartë është gjasat e ndërhyrjes OOM-Killer, por performanca e bazës së të dhënave është gjithashtu më e lartë. Vlera e paracaktuar është 60, por nëse e gjithë baza e të dhënave përshtatet në memorie, është më mirë të vendosni vlerën në 1.
Rezultatet e
Mos lejoni që "vrasësi" në OOM-Killer t'ju trembë. Në këtë rast, vrasësi do të jetë shpëtimtari i sistemit tuaj. Ai "vras" proceset më të këqija dhe e shpëton sistemin nga përplasja. Për të shmangur nevojën për të përdorur OOM-Killer për të përfunduar PostgreSQL, vendosni në vm.overcommit_memory vlera 2. Kjo nuk garanton që OOM-Killer nuk do të duhet të ndërhyjë, por do të zvogëlojë gjasat për të detyruar procesin e PostgreSQL të përfundojë.
Burimi: www.habr.com
