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

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

Når du er i Linux Databaseserveren afsluttes uventet, og årsagen skal findes. 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 du server eller processen løber tør for hukommelse, Linux Out-Of-Memory Killer tilbyder to løsninger: at få hele systemet til at gå ned eller afslutte den proces (applikation), der bruger hukommelse. Det er selvfølgelig bedre at afslutte processen og redde operativsystemet fra at gå ned. Kort sagt er Out-Of-Memory Killer en proces, der afslutter en applikation for at redde kernen fra at gå ned. Den ofrer applikationen for at holde operativsystemet kørende. Lad os først diskutere, hvordan OOM fungerer, og hvordan man styrer det, og derefter se på, hvordan OOM Killer bestemmer, hvilke applikationer der skal afsluttes.

En af hovedopgaverne Linux — Alloker hukommelse til processer, når de anmoder om det. Typisk anmoder en proces eller et program om hukommelse fra operativsystemet, men bruger den ikke fuldt ud. Hvis operativsystemet allokerer hukommelse til alle, der anmoder om det, men ikke planlægger at bruge den, vil systemet hurtigt løbe tør for hukommelse, og systemet vil gå ned. For at forhindre dette reserverer operativsystemet hukommelse til en proces, men allokerer den faktisk ikke. Hukommelse allokeres kun, når en proces rent faktisk har til hensigt at bruge den. Nogle gange har operativsystemet ikke ledig hukommelse, men det allokerer hukommelse til en proces, og når processen har brug for det, allokerer operativsystemet den, hvis det kan. Ulempen er, at operativsystemet nogle gange reserverer hukommelse, men når det er nødvendigt, er der ingen ledig hukommelse, hvilket forårsager et systemnedbrud. OOM spiller en nøglerolle i dette scenarie ved at afslutte processer for at forhindre kernen i at gå i panik. Når PostgreSQL-processen tvangsafsluttes, vises følgende 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

В Linux Du kan aktivere eller deaktivere OOM-Killer (selvom sidstnævnte ikke anbefales). For at aktivere eller deaktivere det skal du bruge parameteren 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 tændes og slukkes, som vi allerede har nævnt. Linux kan reservere mere hukommelse til processer end der er tilgængelig, men ikke rent faktisk allokere den, og denne adfærd styres af en kerneparameter LinuxVariablen 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 standardværdien i de fleste versioner. 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

Køb pålidelig hosting til websteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster