Stel Out-Of-Memory Killer op in Linux vir PostgreSQL

Stel Out-Of-Memory Killer op in Linux vir PostgreSQL

Wanneer in Linux Die databasisbediener beëindig onverwags, en die oorsaak moet bepaal word. Daar kan verskeie redes wees. Byvoorbeeld, SIGSEGV - mislukking as gevolg van 'n fout in die backend-bediener. Maar dit is skaars. Dikwels het jy eenvoudig nie meer skyfspasie of geheue nie. As jy nie meer skyfspasie het nie, is daar net een uitweg – maak spasie vry en herbegin die databasis.

Uit-Geheue-moordenaar

Wanneer jy bediener of die proses se geheue raak op, Linux Die Out-Of-Memory Killer bied twee oplossings: laat die hele stelsel ineenstort of beëindig die proses (toepassing) wat geheue opgebruik. Dit is natuurlik beter om die proses te beëindig en die bedryfstelsel van ineenstorting te red. Kortliks, die Out-Of-Memory Killer is 'n proses wat 'n toepassing beëindig om die kern van ineenstorting te red. Dit offer die toepassing op om die bedryfstelsel aan die gang te hou. Kom ons bespreek eers hoe OOM werk en hoe om dit te beheer, en kyk dan na hoe die OOM Killer besluit watter toepassings om te beëindig.

Een van die hooftake Linux — Ken geheue toe aan prosesse wanneer hulle dit versoek. Tipies versoek 'n proses of toepassing geheue van die bedryfstelsel, maar gebruik dit nie ten volle nie. As die bedryfstelsel geheue toeken aan almal wat dit versoek, maar nie beplan om dit te gebruik nie, sal die stelsel vinnig sonder geheue raak, en die stelsel sal ineenstort. Om dit te voorkom, reserveer die bedryfstelsel geheue vir 'n proses, maar ken dit nie eintlik toe nie. Geheue word slegs toegeken wanneer 'n proses dit eintlik wil gebruik. Soms het die bedryfstelsel nie vrye geheue nie, maar dit ken geheue toe aan 'n proses, en wanneer die proses dit nodig het, ken die bedryfstelsel dit toe as dit kan. Die nadeel is dat die bedryfstelsel soms geheue reserveer, maar wanneer dit nodig is, is daar geen vrye geheue nie, wat 'n stelselineenstorting veroorsaak. OOM speel 'n sleutelrol in hierdie scenario deur prosesse te beëindig om te verhoed dat die kern paniekerig raak. Wanneer die PostgreSQL-proses met geweld beëindig word, verskyn die volgende boodskap in die logboek:

Out of Memory: Killed process 12345 (postgres).

As die stelsel min geheue het en dit nie vrygestel kan word nie, word die funksie opgeroep out_of_memory. In hierdie stadium het sy net een ding oor om te doen – een of meer prosesse voltooi. Moet OOM-killer die proses onmiddellik beëindig of kan dit wag? Natuurlik, wanneer out_of_memory geroep word, is dit as gevolg van wag vir 'n I/O-operasie of blaai na skyf. Daarom moet die OOM-moordenaar eers tjeks uitvoer en op grond daarvan besluit dat die proses beëindig moet word. As al die tjeks hieronder positief is, sal OOM die proses beëindig.

Proses seleksie

Wanneer geheue opraak, word die funksie opgeroep out_of_memory(). Dit het 'n funksie select_bad_process(), wat 'n evaluering van die funksie ontvang badness(). Die “ergste” proses sal geteiken word. Funksie badness() kies 'n proses volgens sekere reëls.

  1. Die kern benodig 'n minimum geheue vir homself.
  2. Jy moet baie geheue vrystel.
  3. Dit is nie nodig om prosesse te beëindig wat min geheue gebruik nie.
  4. Minimum prosesse moet voltooi word.
  5. Komplekse algoritmes wat die kanse op voltooiing verhoog vir daardie prosesse wat die gebruiker self wil voltooi.

Nadat al hierdie kontroles voltooi is, ondersoek OOM die telling (oom_score). OOM toewys oom_score elke proses, en vermenigvuldig dan hierdie waarde met die hoeveelheid geheue. Prosesse met groter waardes is meer geneig om die slagoffer van die OOM-moordenaar te word. Prosesse wat met die wortelgebruiker geassosieer word, het 'n laer telling en is minder geneig om gedwing te word om te beëindig.

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

Die Postgres proses ID is 3813, so in 'n ander dop is dit moontlik om die telling te kry deur hierdie kern parameter te gebruik oom_score:

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

As jy glad nie wil hê OOM-Killer moet die proses doodmaak nie, is daar nog 'n kernopsie: oom_score_adj. Voeg 'n groot negatiewe waarde by om die kanse te verminder om 'n proses te voltooi wat jy waardeer.

sudo echo -100 > /proc/3813/oom_score_adj

Om 'n waarde te stel oom_score_adj, stel OOMScoreAdjust in die diensblok:

[Service]
OOMScoreAdjust=-1000

Of gebruik oomprotect in 'n span rcctl.

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

Forseer beëindiging van 'n proses

Wanneer een of meer prosesse reeds gekies is, roep OOM-Killer die funksie oom_kill_task(). Hierdie funksie stuur 'n beëindigingssein na die proses. In die geval van geheue tekort oom_kill() Roep hierdie funksie op om 'n SIGKILL-sein na die proses te stuur. 'n Boodskap word na die kernlogboek geskryf.

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

Hoe om OOM-Killer te beheer

В Linux Jy kan OOM-Killer aktiveer of deaktiveer (alhoewel laasgenoemde nie aanbeveel word nie). Om dit te aktiveer of deaktiveer, gebruik die parameter vm.oom-kill. Om OOM-Killer tydens hardlooptyd te aktiveer, voer die opdrag uit sysctl.

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

Om OOM-Killer te deaktiveer, spesifiseer die waarde 0 in dieselfde opdrag:

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

Die resultaat van hierdie opdrag sal nie vir ewig gestoor word nie, maar slegs tot die eerste herlaai. As jy meer volharding nodig het, voeg hierdie reël by die lêer /etc/sysctl.conf:

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

Nog 'n manier om te aktiveer en deaktiveer is om 'n veranderlike te skryf panic_on_oom. Die waarde kan altyd ingeboek word /proc.

$ cat /proc/sys/vm/panic_on_oom
0

As jy die waarde op 0 stel, sal daar geen kernpaniek wees wanneer geheue opraak nie.

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

As jy die waarde op 1 stel, sal 'n kernpaniek voorkom wanneer die geheue opraak.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer kan aan- en afgeskakel word, soos ons reeds genoem het. Linux mag meer geheue vir prosesse reserveer as wat beskikbaar is, maar dit nie eintlik toewys nie, en hierdie gedrag word beheer deur 'n kernparameter LinuxDie veranderlike is hiervoor verantwoordelik. vm.overcommit_memory.

U kan die volgende waardes daarvoor spesifiseer:

0: Die kern besluit self of te veel geheue gereserveer moet word. Dit is die standaardwaarde in die meeste weergawes. Linux.
1: Die kern sal altyd ekstra geheue reserveer. Dit is riskant, want die geheue kan opraak, want heel waarskynlik sal die prosesse dit eendag vereis.
2: die kern sal nie meer geheue reserveer as wat in die parameter gespesifiseer is nie overcommit_ratio.

Met hierdie parameter spesifiseer jy die persentasie geheue wat toegelaat word om oorgereserveer te word. As daar nie plek daarvoor is nie, word geen geheue toegeken nie, en die bespreking sal geweier word. Dit is die veiligste opsie wat aanbeveel word vir PostgreSQL. OOM-Killer word deur 'n ander element beïnvloed - die ruilvermoë, wat deur die veranderlike beheer word cat /proc/sys/vm/swappiness. Hierdie waardes vertel die kern hoe om blaai te hanteer. Hoe hoër die waarde, hoe minder waarskynlik is dit dat OOM die proses sal beëindig, maar as gevolg van I/O-bewerkings het dit wel 'n negatiewe impak op die databasis. En omgekeerd - hoe laer die waarde, hoe groter is die waarskynlikheid van OOM-Killer-ingryping, maar die databasisprestasie is ook hoër. Die verstekwaarde is 60, maar as die hele databasis in die geheue pas, is dit beter om die waarde op 1 te stel.

Resultate van

Moenie dat die "moordenaar" in OOM-Killer jou bang maak nie. In hierdie geval sal die moordenaar die redder van jou stelsel wees. Dit "maak dood" die ergste prosesse en red die stelsel van ineenstorting. Om te verhoed dat u OOM-Killer moet gebruik om PostgreSQL te beëindig, stel op vm.overcommit_memory waarde 2. Dit waarborg nie dat OOM-Killer nie hoef in te gryp nie, maar dit sal die waarskynlikheid verminder om die PostgreSQL-proses te dwing om te beëindig.

Bron: will.com

Koop betroubare hosting vir werwe met DDoS-beskerming, VPS VDS-bedieners 🔥 Koop betroubare webwerfhosting met DDoS-beskerming, VPS VDS-bedieners | ProHoster