
NĂ„r du er inne Linux Databaseserveren avsluttes uventet, og Ă„rsaken mĂ„ fastslĂ„s. Det kan vĂŠre flere Ă„rsaker. For eksempel, SIGSEGV â feil pĂ„ grunn av en feil i backend-serveren. Men dette er sjeldent. Oftest gĂ„r du rett og slett tom for diskplass eller minne. Hvis du gĂ„r tom for diskplass, er det bare Ă©n vei ut â frigjĂžr plass og start databasen pĂ„ nytt.
Ut-av-minnet morder
NÄr du server eller prosessen gÄr tom for minne, Linux Out-Of-Memory Killer tilbyr to lÞsninger: krasje hele systemet eller avslutte prosessen (applikasjonen) som spiser opp minne. Det er selvfÞlgelig bedre Ä avslutte prosessen og redde operativsystemet fra Ä krasje. Kort sagt er Out-Of-Memory Killer en prosess som avslutter et program for Ä redde kjernen fra Ä krasje. Den ofrer programmet for Ä holde operativsystemet i gang. La oss fÞrst diskutere hvordan OOM fungerer og hvordan vi kontrollerer det, og deretter se pÄ hvordan OOM Killer bestemmer hvilke programmer som skal avsluttes.
En av hovedoppgavene Linux â Tildel minne til prosesser nĂ„r de ber om det. Vanligvis ber en prosess eller et program om minne fra operativsystemet, men bruker det ikke fullt ut. Hvis operativsystemet tildeler minne til alle som ber om det, men ikke planlegger Ă„ bruke det, vil systemet raskt gĂ„ tom for minne, og systemet vil krasje. For Ă„ forhindre dette reserverer operativsystemet minne for en prosess, men tildeler det ikke. Minne tildeles bare nĂ„r en prosess faktisk har til hensikt Ă„ bruke det. Noen ganger har ikke operativsystemet ledig minne, men det tildeler minne til en prosess, og nĂ„r prosessen trenger det, tildeler operativsystemet det hvis det kan. Ulempen er at noen ganger reserverer operativsystemet minne, men nĂ„r det er nĂždvendig, er det ikke ledig minne, noe som forĂ„rsaker systemkrasj. OOM spiller en nĂžkkelrolle i dette scenariet, ved Ă„ avslutte prosesser for Ă„ forhindre at kjernen fĂ„r panikk. NĂ„r PostgreSQL-prosessen tvangsavsluttes, vises fĂžlgende melding i loggen:
Out of Memory: Killed process 12345 (postgres).Hvis systemet har lite minne og det ikke kan frigjĂžres, kalles funksjonen opp out_of_memory. PĂ„ dette stadiet har hun bare Ă©n ting igjen Ă„ gjĂžre â fullfĂžre en eller flere prosesser. BĂžr OOM-killer avslutte prosessen umiddelbart eller kan den vente? Ă
penbart, nÄr out_of_memory kalles, er det pÄ grunn av venting pÄ en I/O-operasjon eller personsÞking til disk. Derfor mÄ OOM-morderen fÞrst utfÞre kontroller og, basert pÄ dem, bestemme at prosessen mÄ avsluttes. Hvis alle sjekkene nedenfor er positive, vil OOM avslutte prosessen.
Prosessvalg
NÄr minnet gÄr tom, kalles funksjonen opp out_of_memory(). Den har en funksjon select_bad_process(), som mottar en evaluering fra funksjonen badness(). Den "verste" prosessen vil bli mÄlrettet. Funksjon badness() velger en prosess i henhold til visse regler.
- Kjernen trenger et minimumsminne for seg selv.
- Du mÄ frigjÞre mye minne.
- Det er ikke nĂždvendig Ă„ avslutte prosesser som bruker lite minne.
- Minimumsprosesser mÄ fullfÞres.
- Komplekse algoritmer som Ăžker sjansene for gjennomfĂžring for de prosessene som brukeren selv Ăžnsker Ă„ fullfĂžre.
Etter Ă„ ha fullfĂžrt alle disse kontrollene, undersĂžker OOM poengsummen (oom_score). OOM tildeler oom_score hver prosess, og multipliserer deretter denne verdien med mengden minne. Prosesser med stĂžrre verdier er mer sannsynlig Ă„ bli offer for OOM-morderen. Prosesser knyttet til root-brukeren har lavere poengsum og er mindre sannsynlig at de blir tvunget til Ă„ avslutte.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Postgres prosess ID er 3813, sÄ i et annet skall er det mulig Ä fÄ poengsummen ved Ä bruke denne kjerneparameteren oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Hvis du ikke vil at OOM-Killer skal drepe prosessen i det hele tatt, er det et annet kjernealternativ: oom_score_adj. Legg til en stor negativ verdi for Ă„ redusere sjansene for Ă„ fullfĂžre en prosess du verdsetter.
sudo echo -100 > /proc/3813/oom_score_adjFor Ă„ angi en verdi oom_score_adj, sett OOMScoreAdjust i serviceblokken:
[Service]
OOMScoreAdjust=-1000Eller bruk oomprotect pÄ et lag rcctl.
rcctl set <i>servicename</i> oomprotect -1000Tvinge avslutning av en prosess
NÄr en eller flere prosesser allerede er valgt, kaller OOM-Killer opp funksjonen oom_kill_task(). Denne funksjonen sender et avslutningssignal til prosessen. Ved minnemangel oom_kill() Kaller denne funksjonen for Ä sende et SIGKILL-signal til prosessen. En melding skrives til kjerneloggen.
Out of Memory: Killed process [pid] [name].Hvordan kontrollere OOM-Killer
Đ Linux Du kan aktivere eller deaktivere OOM-Killer (selv om sistnevnte ikke anbefales). For Ă„ aktivere eller deaktivere den, bruk parameteren vm.oom-kill. For Ă„ aktivere OOM-Killer under kjĂžretid, kjĂžr kommandoen sysctl.
sudo -s sysctl -w vm.oom-kill = 1For Ă„ deaktivere OOM-Killer, spesifiser verdien 0 i samme kommando:
sudo -s sysctl -w vm.oom-kill = 0Resultatet av denne kommandoen vil ikke bli lagret for alltid, men bare til fĂžrste omstart. Hvis du trenger mer utholdenhet, legg til denne linjen i filen /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confEn annen mÄte Ä aktivere og deaktivere er Ä skrive en variabel panic_on_oom. Verdien kan alltid sjekkes inn /proc.
$ cat /proc/sys/vm/panic_on_oom
0Hvis du setter verdien til 0, vil det ikke vÊre noen kjernepanikk nÄr minnet gÄr tom.
$ echo 0 > /proc/sys/vm/panic_on_oomHvis du setter verdien til 1, vil en kjernepanikk oppstÄ nÄr minnet gÄr tom.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer kan slÄs av og pÄ, som vi allerede har nevnt. Linux kan reservere mer minne for prosesser enn det som er tilgjengelig, men ikke faktisk allokere det, og denne oppfÞrselen styres av en kjerneparameter LinuxVariabelen er ansvarlig for dette. vm.overcommit_memory.
Du kan angi fĂžlgende verdier for det:
0: Kjernen bestemmer selv om den skal reservere for mye minne. Dette er standardverdien i de fleste versjoner. Linux.
1: Kjernen vil alltid reservere ekstra minne. Dette er risikabelt, fordi minnet kan gÄ tom, fordi, mest sannsynlig, en dag vil prosessene kreve det.
2: kjernen vil ikke reservere mer minne enn spesifisert i parameteren overcommit_ratio.
Med denne parameteren spesifiserer du prosentandelen av minnet som er tillatt Ä vÊre overreservert. Hvis det ikke er plass til det, blir det ikke tildelt noe minne, og reservasjonen vil bli avvist. Dette er det sikreste alternativet som anbefales for PostgreSQL. OOM-Killer pÄvirkes av et annet element - byttefunksjonen, som styres av variabelen cat /proc/sys/vm/swappiness. Disse verdiene forteller kjernen hvordan den skal hÄndtere personsÞking. Jo hÞyere verdi, jo mindre sannsynlig er det at OOM vil avslutte prosessen, men pÄ grunn av I/O-operasjoner har det en negativ innvirkning pÄ databasen. Og omvendt - jo lavere verdi, jo hÞyere er sannsynligheten for OOM-Killer-intervensjon, men databaseytelsen er ogsÄ hÞyere. Standardverdien er 60, men hvis hele databasen fÄr plass i minnet, er det bedre Ä sette verdien til 1.
Resultater av
Ikke la "morderen" i OOM-Killer skremme deg. I dette tilfellet vil morderen vÊre redningen av systemet ditt. Det "dreper" de verste prosessene og redder systemet fra Ä krasje. For Ä unngÄ Ä mÄtte bruke OOM-Killer for Ä avslutte PostgreSQL, sett til vm.overcommit_memory verdi 2. Dette garanterer ikke at OOM-Killer ikke trenger Ä gripe inn, men det vil redusere sannsynligheten for Ä tvinge PostgreSQL-prosessen til Ä avslutte.
Kilde: www.habr.com
