🥇Hvordan finne programmeringskurs og hva jobbgarantiene er verdt | ProHoster.

🥇Hvordan finne programmeringskurs og hva jobbgarantiene er verdt | ProHoster.

Når en Linux-database сервер uventet avslutter, må årsaken finnes. Det kan være flere grunner. For eksempel, SIGSEGV — en feil forårsaket av en bug i backend-serveren. Men dette er sjeldent. Ofte er det bare at diskplass eller minne er oppbrukt. Hvis diskplassen er oppbrukt, er løsningen enkel — frigjør plass og start databasen på nytt.

Out-Of-Memory Killer

Når serveren eller prosessen løper tom for minne, tilbyr Linux 2 løsninger: å styrte hele systemet eller avslutte prosessen (programmet) som bruker opp minnet. Det er bedre å avslutte prosessen og redde OS fra en krasj. Kort sagt, Out-Of-Memory Killer er en prosess som avslutter applikasjonen for å redde kjernen fra å krasje. Den ofrer applikasjonen for å opprettholde driften av OS. La oss først diskutere hvordan OOM fungerer og hvordan det kontrolleres, og deretter se på hvordan OOM Killer avgjør hvilken applikasjon som skal avsluttes.

En av de viktigste oppgavene til Linux er å tildele minne til prosesser når de ber om det. Vanligvis ber en prosess eller applikasjon operativsystemet om minne, mens de selv ikke bruker alt. Hvis operativsystemet gir minne til alle som ber om det, men ikke planlegger å bruke det, vil minnet raskt gå tomt, og systemet vil feile. For å unngå dette, reserverer operativsystemet minne for prosessen, men gir det faktisk ikke ut. Minne tildeles bare når prosessen virkelig skal bruke det. Det skjer at operativsystemet ikke har ledig minne, men det holder minne for prosessen, og når prosessen trenger det, tildeler operativsystemet det hvis det kan. Problemet er at noen ganger reserverer operativsystemet minne, men i det kritiske øyeblikket er det ikke ledig minne, og systemet krasjer. OOM spiller en viktig rolle i dette scenariet og avslutter prosesser for å beskytte kjernen mot panikk. Når prosessen PostgreSQL blir avsluttet tvangsmessig, vises en melding i loggen:

Out of Memory: Killed process 12345 (postgres).

Hvis det er lite minne i systemet og det ikke kan frigjøres, kalles funksjonen out_of_memory. På dette tidspunkt er der kun én ting tilbage — at afslutte en eller flere processer. Skal OOM-killer straks afslutte processen, eller kan man vente? Det er klart, at når out_of_memory kaldes, skyldes det venten på en I/O-operation eller sideudveksling til disken. Derfor skal OOM-killer først udføre kontroller og beslutte på baggrund af dem, hvilken proces der skal afsluttes. Hvis alle nedenstående kontroller giver et positivt resultat, afslutter OOM processen.

Valg af proces

Når hukommelsen slutter, kaldes funktionen out_of_memory(). Den indeholder funktionen select_bad_process(), som får en vurdering fra funktionen badness(). Den 'minste' proces rammes. Funktionen badness() vælger processen efter bestemte regler.

  1. Kernen har brug for et minimum af hukommelse til sig selv.
  2. Mange hukommelse skal frigøres.
  3. Processer, der bruger lidt hukommelse, skal ikke afsluttes.
  4. Der skal afsluttes mindst en proces.
  5. Komplekse algoritmer, der øger chancerne for at afslutte de processer, som brugeren selv ønsker at afslutte.

Efter at have udført alle disse kontroller, undersøger OOM vurderingen (oom_score). OOM tildeler oom_score hvert proces en score, som derefter udfoldes med hukommelsesmængden. Processer med høje værdier har større chance for at blive ofre for OOM Killer. Processer tilknyttet privilegerede brugere har en lavere score og mindre chance for at blive tvangsafsluttet.

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

Postgres-proces-id er 3813, så i et andet shell kan man få vurderingen ved at bruge denne kerneparameter oom_score:

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

Hvis du ikke ønsker, at OOM-Killer skal afslutte processen, er der en anden kerneparameter: oom_score_adj. Tilføj en stor negativ værdi for at reducere chancerne for at afslutte din vigtige proces.

sudo echo -100 > /proc/3813/oom_score_adj

For at indstille værdien oom_score_adj, angiv OOMScoreAdjust i serviceblokken:

[Service]
OOMScoreAdjust=-1000

Eller brug oomprotect i kommandoen rcctl.

rcctl set servicename oomprotect -1000

Tvangsafslutning af processen

Når en eller flere processer allerede er udvalgt, kalder OOM-Killer funktionen oom_kill_task(). Denne funktion sender en afslutningssignal til processen. Hvis der er mangel på hukommelse oom_kill() kalder denne funktion for at sende SIGKILL-signal til processen. En meddelelse logges i kernen.

Minne: Drepa prosess [pid] [name].

Slik kontrollerer du OOM-Killer

I Linux kan OOM-Killer slås av og på (selv om sistnevnte ikke anbefales). Bruk parameteren vm.oom-kill. For å aktivere OOM-Killer i kjøringen, kjør kommandoen sysctl.

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

For å deaktivere OOM-Killer, angi verdien 0 i denne samme kommandoen:

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

Resultatet av denne kommandoen vil ikke være permanent, men opprettholdes kun til første omstart. Hvis mer varighet er nødvendig, legg til denne linjen i filen /etc/sysctl.conf:

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

En annen måte å aktivere og deaktivere er å skrive variabelen panic_on_oom. Verdien kan alltid sjekkes i /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Hvis verdien settes til 0, vil det ikke oppstå kernel panic når minnet tar slutt.

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

Hvis verdien settes til 1, vil det oppstå kernel panic når minnet tar slutt.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer kan ikke bare slås av og på. Vi har allerede nevnt at Linux kan reservere mer minne for prosesser enn det som faktisk finnes, men ikke tildele det, og denne oppførselen styres av en kjerneparameter. Dette håndteres av variabelen vm.overcommit_memory.

For denne kan følgende verdier angis:

0: Kjernen bestemmer selv om det er hensiktsmessig å reservere for mye minne. Denne verdien er standard i de fleste versjoner av Linux.
1: Kjernen vil alltid reservere ekstra minne. Dette er risikabelt, siden minnet kan ta slutt, ettersom prosessene mest sannsynlig vil kreve det de har rett på.
2: Kjernen vil ikke reservere mer minne enn det som er angitt i parameteren overcommit_ratio.

I denne parameteren spesifiserer du prosentandelen av minnet som er akseptabelt for overforbruk. Hvis det ikke er plass til dette, blir minnet ikke tildelt, og det vil bli nektet overforbruk. Dette er det tryggeste alternativet, anbefalt for PostgreSQL. OOM-Killer påvirkes også av en annen faktor — swap-muligheten, som styres av variabelen cat /proc/sys/vm/swappiness. Disse verdiene angir fordelingen til kjernen om hvordan sidebytting skal håndteres. Jo høyere verdi, jo mindre sjanse er det for at OOM vil avslutte prosessen, men på grunn av I/O-operasjoner påvirker det databasen negativt. Omvendt, jo lavere verdi, desto høyere er sjansen for OOM-Killer-intervensjon, men ytelsen til databasen er også bedre. Standardverdien er 60, men hvis hele databasen får plass i minnet, er det bedre å sette verdien til 1.

Resultater

La deg ikke skremme av «killer» i OOM-Killer. I dette tilfellet vil killer være redningsmannen for systemet ditt. Den «dreper» de mest uønskede prosessene og redder systemet fra nødavslutning. For å unngå å måtte bruke OOM-Killer for å avslutte PostgreSQL, sett for vm.overcommit_memory verdi 2. Dette garanterer ikke at OOM-Killer ikke vil måtte gripe inn, men det reduserer sannsynligheten for en tvangsavslutning av PostgreSQL-prosessen.

Kilde: habr.com

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster