
Noiz sartu Linux Datu-base zerbitzaria ustekabean amaitu da, eta kausa zehaztu behar da. Hainbat arrazoi egon daitezke. Adibidez, SIGSEGV — hutsegitea backend zerbitzariaren akats baten ondorioz. Baina hau arraroa da. Gehienetan, diskoko lekurik edo memoriarik gabe geratzen zara. Diskoko lekurik gabe geratzen bazara, aterabide bakarra dago: askatu lekua eta berrabiarazi datu-basea.
Memoriaz Kanpoko Hiltzailea
Zuk noiz? zerbitzaria edo prozesuak memoria agortzen du, Linux Memoria Gabeko Hiltzaileak bi irtenbide eskaintzen ditu: sistema osoa kraskatzea edo memoria kontsumitzen ari den prozesua (aplikazioa) amaitzea. Hobe da, noski, prozesua amaitzea eta sistema eragilea kraskatzea saihestea. Laburbilduz, Memoria Gabeko Hiltzailea aplikazio bat amaitzen duen prozesua da, kernela kraskatzea saihesteko. Aplikazioa sakrifikatzen du sistema eragilea martxan mantentzeko. Lehenik eta behin, OOM nola funtzionatzen duen eta nola kontrolatu azter dezagun, eta gero, OOM Hiltzaileak nola erabakitzen duen zein aplikazio amaitu.
Zeregin nagusietako bat. Linux — Esleitu memoria prozesuei eskatzen dutenean. Normalean, prozesu edo aplikazio batek memoria eskatzen dio sistema eragileari, baina ez du guztiz erabiltzen. Sistema eragileak memoria esleitzen badie eskatzen duten guztiei, baina erabiltzeko asmorik ez badu, sistema azkar agortuko da memoriarik, eta sistema kraskatu egingo da. Hori ekiditeko, sistema eragileak memoria gordetzen du prozesu batentzat, baina ez du benetan esleitzen. Memoria prozesu batek benetan erabiltzeko asmoa duenean bakarrik esleitzen da. Batzuetan sistema eragileak ez du memoria librerik, baina memoria esleitzen dio prozesu bati, eta prozesuak behar duenean, sistema eragileak esleitzen du ahal badu. Alde txarra da batzuetan sistema eragileak memoria erreserbatzen duela, baina behar denean, ez dagoela memoria librerik, eta horrek sistemaren kraskadura eragiten du. OOM-k funtsezko zeregina du egoera honetan, prozesuak amaituz kernela izutzea saihesteko. PostgreSQL prozesua indarrez amaitzen denean, mezu hau agertzen da erregistroan:
Out of Memory: Killed process 12345 (postgres).Sistemak memoria gutxi badu eta ezin bada askatu, funtzioari deitzen zaio out_of_memory. Etapa honetan, gauza bakarra geratzen zaio egiteko: prozesu bat edo gehiago osatzea. OOM-killer-ek prozesua berehala amaitu behar al du edo itxaron al dezake? Jakina, out_of_memory deitzen denean, I/O eragiketa baten zain egoteagatik edo diskoan orrialdea izateagatik da. Hori dela eta, OOM hiltzaileak egiaztapenak egin behar ditu lehenik eta, horietan oinarrituta, prozesua amaitu behar dela erabaki. Beheko egiaztapen guztiak positiboak badira, OOM-ek prozesua amaituko du.
Prozesuaren hautaketa
Memoria agortzen denean, funtzioari deitzen zaio out_of_memory(). Funtzio bat du select_bad_process(), funtzioaren ebaluazioa jasotzen duena badness(). Prozesu "txarrena" bideratuko da. Funtzioa badness() arau batzuen arabera prozesu bat hautatzen du.
- Nukleoak memoria minimo bat behar du beretzat.
- Memoria asko askatu behar duzu.
- Ez dago memoria gutxi erabiltzen duten prozesuak amaitu beharrik.
- Gutxieneko prozesuak burutu behar dira.
- Erabiltzaileak berak burutu nahi dituen prozesu horiek burutzeko aukerak areagotzen dituzten algoritmo konplexuak.
Egiaztapen hauek guztiak amaituta, OOMek puntuazioa aztertzen du (oom_score). OOM esleitzen du oom_score prozesu bakoitza, eta, ondoren, balio hori memoria kopuruarekin biderkatzen du. Balio handiagoak dituzten prozesuek OOM Killer-en biktima gehiago izango dira. Erroko erabiltzailearekin lotutako prozesuek puntuazio baxuagoa dute eta litekeena da amaitzera behartuta egotea.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Postgres prozesuaren IDa 3813 da, beraz, beste shell batean puntuazioa lor daiteke nukleoaren parametro hau erabiliz oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Ez baduzu nahi OOM-Killer-ek prozesua amaitzea, nukleoaren beste aukera bat dago: oom_score_adj. Gehitu balio negatibo handi bat baloratzen duzun prozesu bat amaitzeko aukerak murrizteko.
sudo echo -100 > /proc/3813/oom_score_adjBalio bat ezartzeko oom_score_adj, ezarri OOMScoreAdjust zerbitzu-blokean:
[Service]
OOMScoreAdjust=-1000Edo erabili oomprotect talde batean rcctl.
rcctl set <i>servicename</i> oomprotect -1000Prozesu baten amaiera behartu
Dagoeneko prozesu bat edo gehiago hautatzen direnean, OOM-Killer-ek funtzioari deitzen dio oom_kill_task(). Funtzio honek amaiera-seinalea bidaltzen dio prozesuari. Memoria eskasia izanez gero oom_kill() Funtzio honi deitzen dio SIGKILL seinale bat prozesura bidaltzeko. Mezu bat idazten da nukleoaren erregistroan.
Out of Memory: Killed process [pid] [name].Nola kontrolatu OOM-Killer
В Linux OOM-Killer gaitu edo desgaitu dezakezu (nahiz eta azken hau ez den gomendagarria). Gaitzeko edo desgaitzeko, erabili parametroa vm.oom-kill. Exekutatu momentuan OOM-Killer gaitzeko, exekutatu komandoa sysctl.
sudo -s sysctl -w vm.oom-kill = 1OOM-Killer desgaitzeko, zehaztu 0 balioa komando berean:
sudo -s sysctl -w vm.oom-kill = 0Komando honen emaitza ez da betiko gordeko, lehen berrabiarazi arte baizik. Iraunkortasun gehiago behar baduzu, gehitu lerro hau fitxategira /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confGaitzeko eta desgaitzeko beste modu bat aldagai bat idaztea da panic_on_oom. Balioa beti egiaztatu daiteke /proc.
$ cat /proc/sys/vm/panic_on_oom
00 balioa ezartzen baduzu, memoria agortzen denean, ez da nukleoaren izurik izango.
$ echo 0 > /proc/sys/vm/panic_on_oomBalioa 1ean ezartzen baduzu, memoria agortzen denean, kernel izua sortuko da.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer piztu eta itzali daiteke, aipatu dugun bezala. Linux prozesuetarako eskuragarri dagoena baino memoria gehiago gorde dezake, baina ez du benetan esleitu, eta portaera hau kernel parametro batek kontrolatzen du LinuxAldagaia da horren erantzule. vm.overcommit_memory.
Horretarako balio hauek zehaztu ditzakezu:
0: Kernelak berak erabakitzen du memoria gehiegi gorde behar duen ala ez. Bertsio gehienetan balio lehenetsia da hau. Linux.
1: Nukleoak memoria gehigarria gordeko du beti. Arriskutsua da hori, memoria agortu daitekeelako, ziurrenik egunen batean prozesuek hala eskatuko dutelako.
2: nukleoak ez du parametroan zehaztutakoa baino memoria gehiago erreserbatuko overcommit_ratio.
Parametro honekin, gehiegi erreserbatu daitekeen memoriaren ehunekoa zehazten duzu. Tokirik ez badago, ez da memoriarik esleituko, eta erreserba ukatu egingo da. Hau da PostgreSQL-rentzat gomendatutako aukerarik seguruena. OOM-Killer-ek beste elementu batek eragiten du: aldagaiak kontrolatzen duen truke-gaitasuna cat /proc/sys/vm/swappiness. Balio hauek nukleoari orria nola kudeatu esaten diote. Zenbat eta balioa handiagoa izan, orduan eta gutxiago izango da OOM-ek prozesua amaitzea, baina I/O eragiketen ondorioz datu-basean eragin negatiboa du. Eta alderantziz: zenbat eta balioa txikiagoa izan, orduan eta handiagoa da OOM-Killer esku hartzeko aukera, baina datu-basearen errendimendua ere handiagoa da. Balio lehenetsia 60 da, baina datu-base osoa memorian sartzen bada, hobe da balioa 1ean ezartzea.
Emaitzak
Ez utzi OOM-Killer-eko "hiltzaileak" ikaratzen. Kasu honetan, hiltzailea zure sistemaren salbatzailea izango da. Prozesurik txarrenak "hiltzen" ditu eta sistema hondatzetik salbatzen du. PostgreSQL amaitzeko OOM-Killer erabili beharrik ez izateko, ezarri honela vm.overcommit_memory 2. balioa. Horrek ez du bermatzen OOM-Killer-ek esku hartu beharko ez duenik, baina PostgreSQL prozesua amaitzera behartzeko aukera murriztuko du.
Iturria: www.habr.com
