Opsætning af Out-Of-Memory Killer i Linux til PostgreSQL

Opsætning af Out-Of-Memory Killer i Linux til PostgreSQL

Når en databaseserver lukker uventet i Linux, skal du finde årsagen. Der kan være flere årsager. For eksempel, SIGSEGV — fejl på grund af en fejl i backend-serveren. Men dette er sjældent. Oftest løber du simpelthen tør for diskplads eller hukommelse. Løber du tør for diskplads, er der kun én vej ud – frigør plads og genstart databasen.

Out-of-Memory Killer

Når en server eller proces løber tør for hukommelse, tilbyder Linux 2 løsninger: crash hele systemet eller afslut processen (applikationen), der æder hukommelsen. Det er selvfølgelig bedre at afslutte processen og redde OS fra at gå ned. I en nøddeskal er Out-Of-Memory Killer en proces, der dræber et program for at redde kernen fra at gå ned. Det ofrer applikationen for at holde OS kørende. Lad os først diskutere, hvordan OOM fungerer, og hvordan man kontrollerer det, og derefter se, hvordan OOM Killer beslutter, hvilket program der skal afsluttes.

En af Linux hovedopgaver er at allokere hukommelse til processer, når de beder om det. Typisk anmoder en proces eller applikation om hukommelse fra operativsystemet, men bruger den ikke fuldt ud. Hvis operativsystemet giver hukommelse til alle, der beder om det, men ikke har planer om at bruge det, vil hukommelsen meget snart løbe tør, og systemet vil svigte. For at undgå dette reserverer operativsystemet hukommelse til processen, men frigiver den faktisk ikke. Hukommelse tildeles kun, når en proces rent faktisk skal bruge den. Det sker, at OS ikke har ledig hukommelse, men det tildeler hukommelse til en proces, og når en proces har brug for det, tildeler OS det, hvis det kan. Ulempen er, at nogle gange reserverer operativsystemet hukommelse, men på det rigtige tidspunkt er der ingen ledig hukommelse, og systemet går ned. OOM spiller en vigtig rolle i dette scenarie og afslutter processer for at forhindre kernen i at gå i panik. Når en PostgreSQL-proces tvinges til at afslutte, vises en meddelelse i loggen:

Out of Memory: Killed process 12345 (postgres).

Hvis systemet mangler hukommelse, og det ikke kan frigøres, kaldes funktionen out_of_memory. På dette stadie har hun kun én ting tilbage at gøre – gennemføre en eller flere processer. Skal OOM-killer afslutte processen med det samme, eller kan den vente? Når out_of_memory kaldes, skyldes det naturligvis at vente på en I/O-operation eller paging til disk. Derfor skal OOM-morderen først udføre kontroller og ud fra dem beslutte, at processen skal afsluttes. Hvis alle nedenstående kontroller er positive, vil OOM afslutte processen.

Procesvalg

Når hukommelsen løber tør, kaldes funktionen out_of_memory(). Det har en funktion select_bad_process(), som modtager en evaluering fra funktionen badness(). Den "værste" proces vil blive målrettet. Fungere badness() vælger en proces efter bestemte regler.

  1. Kernen har brug for et minimum af hukommelse til sig selv.
  2. Du skal frigøre en masse hukommelse.
  3. Der er ingen grund til at afslutte processer, der bruger lidt hukommelse.
  4. Minimumsprocesser skal gennemføres.
  5. Komplekse algoritmer, der øger chancerne for gennemførelse af de processer, som brugeren selv ønsker at gennemføre.

Efter at have gennemført alle disse kontroller, undersøger OOM scoren (oom_score). OOM tildeler oom_score hver proces, og derefter gange denne værdi med mængden af ​​hukommelse. Processer med større værdier er mere tilbøjelige til at blive ofre for OOM-morderen. Processer forbundet med root-brugeren har en lavere score og er mindre tilbøjelige til at blive tvunget til at afslutte.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

Postgres-proces-id'et er 3813, så i en anden shell er det muligt at få scoren ved hjælp af denne kerneparameter oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Hvis du slet ikke vil have OOM-Killer til at dræbe processen, er der en anden kernemulighed: oom_score_adj. Tilføj en stor negativ værdi for at reducere chancerne for at gennemføre en proces, du værdsætter.

sudo echo -100 > /proc/3813/oom_score_adj

For at indstille en værdi oom_score_adj, indstil OOMScoreAdjust i serviceblokken:

[Service]
OOMScoreAdjust=-1000

Eller brug oomprotect i et hold rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Tving afslutning af en proces

Når en eller flere processer allerede er valgt, kalder OOM-Killer funktionen oom_kill_task(). Denne funktion sender et afslutningssignal til processen. I tilfælde af hukommelsesmangel oom_kill() Kalder denne funktion for at sende et SIGKILL-signal til processen. En besked skrives til kerneloggen.

Out of Memory: Killed process [pid] [name].

Sådan styres OOM-Killer

På Linux kan du aktivere eller deaktivere OOM-Killer (selvom sidstnævnte ikke anbefales). Brug parameteren for at aktivere eller deaktivere vm.oom-kill. Kør kommandoen for at aktivere OOM-Killer under kørsel sysctl.

sudo -s sysctl -w vm.oom-kill = 1

For at deaktivere OOM-Killer skal du angive værdien 0 i samme kommando:

sudo -s sysctl -w vm.oom-kill = 0

Resultatet af denne kommando vil ikke blive gemt for evigt, men kun indtil den første genstart. Hvis du har brug for mere vedholdenhed, skal du tilføje denne linje til filen /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

En anden måde at aktivere og deaktivere er at skrive en variabel panic_on_oom. Værdien kan altid tjekkes ind /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Hvis du indstiller værdien til 0, vil der ikke være nogen kernepanik, når hukommelsen løber tør.

$ echo 0 > /proc/sys/vm/panic_on_oom

Hvis du indstiller værdien til 1, vil der opstå en kernepanik, når hukommelsen løber tør.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer kan ikke kun tændes og slukkes. Vi har allerede sagt, at Linux kan reservere mere hukommelse til processer, end der er tilgængeligt uden faktisk at allokere det, og denne adfærd styres af en Linux-kerneparameter. Variablen er ansvarlig for dette vm.overcommit_memory.

Du kan angive følgende værdier for det:

0: Kernen bestemmer selv, om der skal reserveres for meget hukommelse. Dette er standarden på de fleste versioner af Linux.
1: Kernen vil altid reservere ekstra hukommelse. Dette er risikabelt, fordi hukommelsen kan løbe tør, fordi processerne højst sandsynligt en dag vil kræve det.
2: kernen vil ikke reservere mere hukommelse end angivet i parameteren overcommit_ratio.

Med denne parameter angiver du den procentdel af hukommelsen, der må overreserveres. Hvis der ikke er plads til det, tildeles der ingen hukommelse, og reservationen vil blive afvist. Dette er den sikreste mulighed, der anbefales til PostgreSQL. OOM-Killer er påvirket af et andet element - swapping-evnen, som styres af variablen cat /proc/sys/vm/swappiness. Disse værdier fortæller kernen, hvordan man håndterer personsøgning. Jo højere værdi, jo mindre sandsynligt er det, at OOM vil afslutte processen, men på grund af I/O-operationer har det en negativ indvirkning på databasen. Og omvendt - jo lavere værdi, jo højere er sandsynligheden for OOM-Killer-intervention, men databasens ydeevne er også højere. Standardværdien er 60, men hvis hele databasen passer i hukommelsen, er det bedre at indstille værdien til 1.

Resultaterne af

Lad ikke "morderen" i OOM-Killer skræmme dig. I dette tilfælde vil morderen være dit systems redning. Det "dræber" de værste processer og redder systemet fra at gå ned. For at undgå at skulle bruge OOM-Killer til at afslutte PostgreSQL skal du indstille til vm.overcommit_memory værdi 2. Dette garanterer ikke, at OOM-Killer ikke behøver at gribe ind, men det vil reducere sandsynligheden for at tvinge PostgreSQL-processen til at afslutte.

Kilde: www.habr.com

Tilføj en kommentar