Out-Of-Memory Killer op Linux fir PostgreSQL opsetzen

Out-Of-Memory Killer op Linux fir PostgreSQL opsetzen

Wann en Datebankserver onerwaart op Linux ophält, musst Dir de Grond fannen. Et kann e puer Grënn ginn. Zum Beispill, SIGSEGV - Echec wéinst engem Feeler am Backend Server. Awer dëst ass rar. Meeschtens leeft Dir einfach aus Plaatz oder Erënnerung. Wann Dir keng Plaatz Plaz hutt, gëtt et nëmmen ee Wee eraus - fräi Plaz befreien an d'Datebank nei starten.

Out-Of-Memory Killer

Wann e Server oder Prozess aus Erënnerung leeft, bitt Linux 2 Léisungen: Crash de ganze System oder Enn de Prozess (Applikatioun) déi Erënnerung ësst. Et ass besser, natierlech, de Prozess ofzeschléissen an d'OS vum Crash ze retten. An enger Nossschuel, Out-Of-Memory Killer ass e Prozess deen eng Applikatioun ëmbréngt fir de Kernel vum Crash ze retten. Et offréiert d'Applikatioun fir d'OS lafen ze halen. Loosst eis als éischt diskutéieren wéi OOM funktionnéiert a wéi et kontrolléiert gëtt, a kuckt dann wéi OOM Killer decidéiert wéi eng Applikatioun ofgeschloss gëtt.

Eng vun den Haaptaufgaben vu Linux ass d'Erënnerung un d'Prozesser ze verdeelen wa se et froen. Typesch freet e Prozess oder Applikatioun Erënnerung vum OS, awer benotzt se net voll. Wann d'OS Erënnerung un jiddereen gëtt, deen et freet, awer keng Pläng huet et ze benotzen, ganz séier wäert d'Erënnerung auslafen an de System versoen. Fir dëst ze vermeiden, reservéiert d'OS Erënnerung fir de Prozess, awer verëffentlecht se net tatsächlech. Erënnerung gëtt nëmmen zougewisen wann e Prozess et tatsächlech benotzt. Et geschitt datt den OS kee fräie Gedächtnis huet, awer et gëtt Erënnerung un e Prozess zou, a wann e Prozess et brauch, verdeelt d'OS et wann et kann. Den Nodeel ass datt heiansdo d'OS Erënnerung reservéiert, awer zu der richteger Zäit gëtt et kee fräie Gedächtnis, an de System klappt. OOM spillt eng wichteg Roll an dësem Szenario a schléisst Prozesser of, fir datt de Kernel net panikéiert. Wann e PostgreSQL Prozess gezwongen ass opzehalen, erschéngt e Message am Logbuch:

Out of Memory: Killed process 12345 (postgres).

Wann de System wéineg Erënnerung ass an et kann net befreit ginn, gëtt d'Funktioun genannt out_of_memory. Op dëser Etapp huet si just nach eng Saach ze maachen - een oder méi Prozesser ofzeschléissen. Sollt OOM-Killer de Prozess direkt ofschléissen oder kann et waarden? Natierlech, wann out_of_memory genannt gëtt, ass et wéinst der Waarde op eng I/O Operatioun oder Paging op Disk. Dofir muss den OOM Killer als éischt Kontrollen ausféieren an op Basis vun hinnen entscheeden datt de Prozess muss ofgeschloss ginn. Wann all d'Schecken hei ënnen positiv sinn, wäert OOM de Prozess ofschléissen.

Prozess Auswiel

Wann Erënnerung leeft aus, der Funktioun genannt out_of_memory(). Et huet eng Funktioun select_bad_process(), déi eng Evaluatioun vun der Funktioun kritt badness(). De "schlëmmste" Prozess gëtt gezielt. Funktioun badness() wielt e Prozess no bestëmmte Regelen.

  1. De Kernel brauch e Minimum Erënnerung fir sech selwer.
  2. Dir musst vill Erënnerung befreien.
  3. Et gëtt kee Besoin fir Prozesser ofzeschléissen déi wéineg Erënnerung benotzen.
  4. Minimum Prozesser mussen ofgeschloss ginn.
  5. Komplex Algorithmen déi d'Chancen fir d'Réalisatioun vun deene Prozesser erhéijen, déi de Benotzer selwer wëll fäerdeg bréngen.

Nodeems Dir all dës Kontrollen ofgeschloss hutt, iwwerpréift OOM de Score (oom_score). OOM ernannt oom_score all Prozess, an multiplizéiert dann dëse Wäert mat der Quantitéit vun Erënnerung. Prozesser mat méi grousse Wäerter si méi wahrscheinlech Affer vum OOM Killer ze falen. Prozesser, déi mam Root-Benotzer verbonne sinn, hunn e méi nidderegen Score a si manner wahrscheinlech gezwongen opzehalen.

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

De Postgres Prozess ID ass 3813, also an enger anerer Shell ass et méiglech de Score mat dësem Kernelparameter ze kréien oom_score:

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

Wann Dir net wëllt datt OOM-Killer de Prozess iwwerhaapt ëmbréngt, gëtt et eng aner Kerneloptioun: oom_score_adj. Füügt e groussen negativen Wäert fir d'Chancen ze reduzéieren fir e Prozess ze kompletéieren deen Dir schätzt.

sudo echo -100 > /proc/3813/oom_score_adj

Fir e Wäert ze setzen oom_score_adj, setzen OOMScoreAdjust am Serviceblock:

[Service]
OOMScoreAdjust=-1000

Oder benotzen oomprotect an engem Team rcctl.

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

Force Enn vun engem Prozess

Wann een oder méi Prozesser schonn ausgewielt sinn, rifft OOM-Killer d'Funktioun oom_kill_task(). Dës Funktioun schéckt en Ennsignal un de Prozess. Am Fall vun Erënnerung Mangel oom_kill() Rufft dës Funktioun fir e SIGKILL Signal un de Prozess ze schécken. E Message gëtt an de Kernel Log geschriwwe.

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

Wéi kontrolléiert OOM-Killer

Op Linux kënnt Dir OOM-Killer aktivéieren oder deaktivéieren (obwuel déi lescht net recommandéiert ass). Fir aktivéieren oder deaktivéieren benotzt de Parameter vm.oom-kill. Fir OOM-Killer beim Runtime z'aktivéieren, lafen de Kommando sysctl.

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

Fir OOM-Killer auszeschalten, spezifizéiert de Wäert 0 am selwechte Kommando:

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

D'Resultat vun dësem Kommando gëtt net fir ëmmer gespäichert, awer nëmmen bis den éischte Restart. Wann Dir méi Persistenz braucht, füügt dës Linn an d'Datei /etc/sysctl.conf:

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

Eng aner Manéier fir z'aktivéieren an auszeschalten ass eng Variabel ze schreiwen panic_on_oom. De Wäert kann ëmmer iwwerpréift ginn /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Wann Dir de Wäert op 0 setzt, da wann d'Erënnerung aus ass, gëtt et keng Kernelpanik.

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

Wann Dir de Wäert op 1 setzt, da wann d'Erënnerung aus ass, wäert eng Kernel Panik optrieden.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer kann net nëmmen un an ausgeschalt ginn. Mir hu scho gesot datt Linux méi Erënnerung fir Prozesser reservéiere kann wéi verfügbar ass ouni et tatsächlech ze verdeelen, an dëst Verhalen gëtt vun engem Linux Kernel Parameter kontrolléiert. D'Variabel ass dofir verantwortlech vm.overcommit_memory.

Dir kënnt déi folgend Wäerter fir et uginn:

0: De Kär selwer entscheet ob ze vill Erënnerung reservéiert. Dëst ass de Standard op de meeschte Versioune vu Linux.
1: De Kärel wäert ëmmer extra Erënnerung reservéieren. Dëst ass geféierlech, well d'Erënnerung kann auslafen, well wahrscheinlech enges Daags d'Prozesser et erfuerderen.
2: de Kernel wäert net méi Erënnerung reservéieren wéi am Parameter spezifizéiert overcommit_ratio.

Mat dësem Parameter spezifizéiert Dir de Prozentsaz vun der Erënnerung déi erlaabt ass ze reservéieren. Wann et keng Plaz fir et ass, gëtt keng Erënnerung zougewisen, an d'Reservatioun gëtt refuséiert. Dëst ass déi sécherst Optioun recommandéiert fir PostgreSQL. OOM-Killer gëtt vun engem aneren Element beaflosst - d'Austauschfäegkeet, déi vun der Variabel kontrolléiert gëtt cat /proc/sys/vm/swappiness. Dës Wäerter soen de Kärel wéi de Paging behandelt gëtt. Wat méi héich de Wäert ass, wat manner wahrscheinlech ass et datt OOM de Prozess ofschléisst, awer wéinst I/O Operatiounen huet et en negativen Impakt op d'Datebank. A vice versa - wat méi niddereg de Wäert ass, wat méi héich ass d'Wahrscheinlechkeet vun der OOM-Killer Interventioun, awer d'Datebankleistung ass och méi héich. De Standardwäert ass 60, awer wann déi ganz Datebank an d'Erënnerung passt, ass et besser de Wäert op 1 ze setzen.

Resultater

Loosst de "Killer" am OOM-Killer net Angscht maachen. An dësem Fall wäert de Killer de Retter vun Ärem System sinn. Et "killt" déi schlëmmste Prozesser a rett de System vum Crash. Fir ze vermeiden OOM-Killer ze benotzen fir PostgreSQL ofzeschléissen, setzt op vm.overcommit_memory Wäert 2. Dëst garantéiert net datt OOM-Killer net intervenéiere muss, awer et wäert d'Wahrscheinlechkeet reduzéieren fir de PostgreSQL-Prozess opzehalen.

Source: will.com

Setzt e Commentaire