Kad datu bÄzes serveris negaidÄ«ti izslÄdzas operÄtÄjsistÄmÄ Linux, jums ir jÄatrod iemesls. Var bÅ«t vairÄki iemesli. PiemÄram, SIGSEGV ā kļūme aizmugursistÄmas servera kļūdas dÄļ. Bet tas ir reti. VisbiežÄk jums vienkÄrÅ”i pietrÅ«kst vietas diskÄ vai atmiÅÄ. Ja diskÄ pietrÅ«kst vietas, ir tikai viena izeja - atbrÄ«vojiet vietu un restartÄjiet datu bÄzi.
AtmiÅas slepkava
Kad serverÄ« vai procesÄ beidzas atmiÅa, Linux piedÄvÄ divus risinÄjumus: avarÄt visu sistÄmu vai pÄrtraukt procesu (lietojumprogrammu), kas patÄrÄ atmiÅu. Protams, labÄk ir pÄrtraukt procesu un glÄbt OS no avÄrijas. ÄŖsumÄ, Out-Of-Memory Killer ir process, kas nogalina lietojumprogrammu, lai glÄbtu kodolu no avÄrijas. Tas upurÄ lietojumprogrammu, lai nodroÅ”inÄtu operÄtÄjsistÄmas darbÄ«bu. Vispirms apspriedÄ«sim, kÄ OOM darbojas un kÄ to kontrolÄt, un pÄc tam redzÄsim, kÄ OOM Killer izlemj, kuru lietojumprogrammu pÄrtraukt.
Viens no galvenajiem Linux uzdevumiem ir pieŔķirt atmiÅu procesiem, kad tie to pieprasa. Parasti process vai lietojumprogramma pieprasa atmiÅu no OS, bet neizmanto to pilnÄ«bÄ. Ja OS izdala atmiÅu visiem, kas to lÅ«dz, bet neplÄno to izmantot, ļoti drÄ«z atmiÅa beigsies un sistÄma neizdosies. Lai no tÄ izvairÄ«tos, OS rezervÄ atmiÅu procesam, bet faktiski to neatbrÄ«vo. AtmiÅa tiek pieŔķirta tikai tad, kad process to faktiski izmantos. GadÄs, ka OS nav brÄ«vas atmiÅas, bet tÄ pieŔķir atmiÅu procesam, un, kad procesam tÄ ir nepiecieÅ”ama, OS to pieŔķir, ja var. NegatÄ«vÄ puse ir tÄda, ka dažreiz OS rezervÄ atmiÅu, bet Ä«stajÄ brÄ«dÄ« nav brÄ«vas atmiÅas, un sistÄma avarÄ. Å ajÄ scenÄrijÄ OOM ir svarÄ«ga loma un pÄrtrauc procesus, lai novÄrstu kodola paniku. Kad PostgreSQL process ir spiests pÄrtraukt, žurnÄlÄ tiek parÄdÄ«ts ziÅojums:
Out of Memory: Killed process 12345 (postgres).
Ja sistÄmÄ ir maz atmiÅas un to nevar atbrÄ«vot, funkcija tiek izsaukta out_of_memory
. Å ajÄ posmÄ viÅai atliek tikai viena lieta ā pabeigt vienu vai vairÄkus procesus. Vai OOM-killer nekavÄjoties jÄpÄrtrauc process vai tas var pagaidÄ«t? AcÄ«mredzot, kad tiek izsaukts out_of_memory, tas ir saistÄ«ts ar I/O operÄcijas gaidÄ«Å”anu vai peidžeru uz disku. TÄpÄc OOM slepkavam vispirms ir jÄveic pÄrbaudes un, pamatojoties uz tÄm, jÄpieÅem lÄmums, ka process ir jÄpÄrtrauc. Ja visas tÄlÄk norÄdÄ«tÄs pÄrbaudes ir pozitÄ«vas, OOM pÄrtrauks procesu.
Procesa izvÄle
Kad atmiÅa beidzas, funkcija tiek izsaukta out_of_memory()
. Tam ir funkcija select_bad_process()
, kas saÅem funkcijas novÄrtÄjumu badness()
. Tiks mÄrÄ·Äts uz āsliktÄkoā procesu. Funkcija badness()
izvÄlas procesu saskaÅÄ ar noteiktiem noteikumiem.
- Kodolam ir nepiecieÅ”ama minimÄlÄ atmiÅa.
- Jums ir jÄatbrÄ«vo daudz atmiÅas.
- Nav nepiecieÅ”ams pÄrtraukt procesus, kas izmanto maz atmiÅas.
- Ir jÄpabeidz minimÄlie procesi.
- Sarežģīti algoritmi, kas palielina to procesu pabeigÅ”anas iespÄjas, kurus lietotÄjs pats vÄlas pabeigt.
Pabeidzot visas Ŕīs pÄrbaudes, OOM pÄrbauda rezultÄtu (oom_score
). OOM pieŔķir oom_score
katru procesu un pÄc tam reizina Å”o vÄrtÄ«bu ar atmiÅas apjomu. Procesi ar lielÄkÄm vÄrtÄ«bÄm, visticamÄk, kļūs par OOM Killer upuriem. Procesiem, kas saistÄ«ti ar saknes lietotÄju, ir zemÄks rÄdÄ«tÄjs, un ir mazÄka iespÄja, ka tie bÅ«s spiesti pÄrtraukt.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)
Postgres procesa ID ir 3813, tÄpÄc citÄ ÄaulÄ ir iespÄjams iegÅ«t punktu skaitu, izmantojot Å”o kodola parametru oom_score
:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2
Ja nevÄlaties, lai OOM-Killer vispÄr nogalinÄtu procesu, ir vÄl viena kodola opcija: oom_score_adj
. Pievienojiet lielu negatÄ«vu vÄrtÄ«bu, lai samazinÄtu iespÄju pabeigt jums vÄrtÄ«go procesu.
sudo echo -100 > /proc/3813/oom_score_adj
Lai iestatÄ«tu vÄrtÄ«bu oom_score_adj
, pakalpojumu blokÄ iestatiet OOMScoreAdjust:
[Service]
OOMScoreAdjust=-1000
Vai arī izmantot oomprotect
komandÄ rcctl
.
rcctl set <i>servicename</i> oomprotect -1000
Procesa piespiedu pÄrtraukÅ”ana
Kad viens vai vairÄki procesi jau ir atlasÄ«ti, OOM-Killer izsauc funkciju oom_kill_task()
. Å Ä« funkcija procesam nosÅ«ta beigu signÄlu. AtmiÅas trÅ«kuma gadÄ«jumÄ oom_kill()
Izsauc Å”o funkciju, lai procesam nosÅ«tÄ«tu SIGKILL signÄlu. Kodola žurnÄlÄ tiek ierakstÄ«ts ziÅojums.
Out of Memory: Killed process [pid] [name].
KÄ kontrolÄt OOM-Killer
OperÄtÄjsistÄmÄ Linux varat iespÄjot vai atspÄjot OOM-Killer (lai gan pÄdÄjais nav ieteicams). Lai iespÄjotu vai atspÄjotu, izmantojiet parametru vm.oom-kill
. Lai iespÄjotu OOM-Killer izpildes laikÄ, palaidiet komandu sysctl
.
sudo -s sysctl -w vm.oom-kill = 1
Lai atspÄjotu OOM-Killer, tajÄ paÅ”Ä komandÄ norÄdiet vÄrtÄ«bu 0:
sudo -s sysctl -w vm.oom-kill = 0
Å Ä«s komandas rezultÄts netiks saglabÄts uz visiem laikiem, bet tikai lÄ«dz pirmajai atsÄknÄÅ”anai. Ja nepiecieÅ”ama lielÄka noturÄ«ba, pievienojiet Å”o rindiÅu failam /etc/sysctl.conf
:
echo vm.oom-kill = 1 >>/etc/sysctl.conf
VÄl viens veids, kÄ iespÄjot un atspÄjot, ir rakstÄ«t mainÄ«go panic_on_oom
. VÄrtÄ«bu vienmÄr var reÄ£istrÄt /proc
.
$ cat /proc/sys/vm/panic_on_oom
0
Ja iestatÄt vÄrtÄ«bu uz 0, tad, kad atmiÅa beigsies, kodola panikas nebÅ«s.
$ echo 0 > /proc/sys/vm/panic_on_oom
Ja iestatÄt vÄrtÄ«bu uz 1, tad, kad atmiÅa beigsies, radÄ«sies kodola panika.
echo 1 > /proc/sys/vm/panic_on_oom
OOM-Killer var ne tikai ieslÄgt un izslÄgt. MÄs jau teicÄm, ka Linux var rezervÄt vairÄk atmiÅas procesiem, nekÄ ir pieejams, to faktiski nepieŔķirot, un Å”o darbÄ«bu kontrolÄ Linux kodola parametrs. Par to ir atbildÄ«gs mainÄ«gais vm.overcommit_memory
.
Tam varat norÄdÄ«t Å”Ädas vÄrtÄ«bas:
0: Kodols pats izlemj, vai rezervÄt pÄrÄk daudz atmiÅas. Tas ir noklusÄjuma iestatÄ«jums lielÄkajÄ daÄ¼Ä Linux versiju.
1: Kodols vienmÄr rezervÄs papildu atmiÅu. Tas ir riskanti, jo atmiÅa var beigties, jo, visticamÄk, kÄdu dienu procesi to prasÄ«s.
2: kodols nerezervÄs vairÄk atmiÅas, nekÄ norÄdÄ«ts parametrÄ overcommit_ratio
.
Izmantojot Å”o parametru, jÅ«s norÄdÄt atmiÅas procentuÄlo daļu, kurai ir atļauts pÄrmÄrÄ«gi rezervÄt. Ja tam nav vietas, atmiÅa netiek pieŔķirta, un rezervÄcija tiks liegta. Å Ä« ir droÅ”ÄkÄ opcija, kas ieteicama PostgreSQL. OOM-Killer ietekmÄ vÄl viens elements - maiÅas iespÄja, ko kontrolÄ mainÄ«gais cat /proc/sys/vm/swappiness
. Å Ä«s vÄrtÄ«bas norÄda kodolam, kÄ rÄ«koties ar peidžeru. Jo lielÄka vÄrtÄ«ba, jo mazÄka ir iespÄjamÄ«ba, ka OOM pÄrtrauks procesu, taÄu I/O darbÄ«bu dÄļ tas negatÄ«vi ietekmÄs datu bÄzi. Un otrÄdi - jo zemÄka vÄrtÄ«ba, jo lielÄka ir OOM-Killer iejaukÅ”anÄs iespÄjamÄ«ba, taÄu arÄ« datu bÄzes veiktspÄja ir augstÄka. NoklusÄjuma vÄrtÄ«ba ir 60, bet, ja visa datu bÄze iekļaujas atmiÅÄ, labÄk ir iestatÄ«t vÄrtÄ«bu uz 1.
RezultÄti
Neļaujiet OOM-Killer "slepkavam" jÅ«s nobiedÄt. Å ajÄ gadÄ«jumÄ slepkava bÅ«s jÅ«su sistÄmas glÄbÄjs. Tas "nogalina" vissliktÄkos procesus un pasargÄ sistÄmu no avÄrijÄm. Lai PostgreSQL pÄrtraukÅ”anai nebÅ«tu jÄizmanto OOM-Killer, iestatiet uz vm.overcommit_memory
vÄrtÄ«ba 2. Tas negarantÄ, ka OOM-Killer nebÅ«s jÄiejaucas, taÄu tas samazinÄs iespÄjamÄ«bu, ka PostgreSQL process tiks pÄrtraukts.
Avots: www.habr.com