Setja upp Out-Of-Memory Killer í Linux fyrir PostgreSQL

Setja upp Out-Of-Memory Killer í Linux fyrir PostgreSQL

Þegar gagnagrunnsþjónn hættir óvænt í Linux þarftu að finna ástæðuna. Það geta verið nokkrar ástæður. Til dæmis, SIGSEGV — bilun vegna villu í bakendaþjóninum. En þetta er sjaldgæft. Oftast verður þú einfaldlega uppiskroppa með pláss eða minni. Ef þú verður uppiskroppa með pláss er aðeins ein leið út - losaðu um pláss og endurræstu gagnagrunninn.

Minnislaus Killer

Þegar þjónn eða ferli klárast af minni býður Linux upp á 2 lausnir: hrun allt kerfið eða stöðva ferlið (forritið) sem er að éta upp minni. Það er auðvitað betra að hætta ferlinu og bjarga stýrikerfinu frá því að hrynja. Í hnotskurn, Out-Of-Memory Killer er ferli sem drepur forrit til að bjarga kjarnanum frá því að hrynja. Það fórnar forritinu til að halda stýrikerfinu gangandi. Við skulum fyrst ræða hvernig OOM virkar og hvernig á að stjórna því, og sjáum síðan hvernig OOM Killer ákveður hvaða forriti á að hætta.

Eitt helsta verkefni Linux er að úthluta minni til ferla þegar þeir biðja um það. Venjulega biður ferli eða forrit um minni frá stýrikerfinu en notar það ekki að fullu. Ef stýrikerfið gefur út minni til allra sem biðja um það en hafa engin áform um að nota það, mun minnið fljótlega klárast og kerfið bilar. Til að forðast þetta geymir stýrikerfið minni fyrir ferlið en losar það ekki í raun. Minni er aðeins úthlutað þegar ferli er í raun að fara að nota það. Það kemur fyrir að stýrikerfið hefur ekki laust minni, en það úthlutar minni til ferlis, og þegar ferli þarfnast þess úthlutar stýrikerfið því ef það getur. Gallinn er sá að stundum geymir stýrikerfið minni, en á réttum tíma er ekkert laust minni og kerfið hrynur. OOM gegnir mikilvægu hlutverki í þessari atburðarás og lýkur ferlum til að koma í veg fyrir að kjarninn skelfist. Þegar PostgreSQL ferli neyðist til að slíta birtast skilaboð í skránni:

Out of Memory: Killed process 12345 (postgres).

Ef minnið er lítið í kerfinu og ekki er hægt að losa það, er aðgerðin kölluð out_of_memory. Á þessu stigi á hún aðeins eftir að gera eitt - klára eitt eða fleiri ferli. Ætti OOM-killer að hætta ferlinu strax eða getur það beðið? Augljóslega, þegar out_of_memory er kallað, er það vegna þess að beðið er eftir I/O aðgerð eða síðuskipun á disk. Þess vegna verður OOM morðinginn fyrst að framkvæma athuganir og, á grundvelli þeirra, ákveða að stöðva þurfi ferlið. Ef allar athuganir hér að neðan eru jákvæðar mun OOM slíta ferlinu.

Val á ferli

Þegar minnið klárast er aðgerðin kölluð out_of_memory(). Það hefur virkni select_bad_process(), sem fær mat frá aðgerðinni badness(). Miðað verður við „versta“ ferlið. Virka badness() velur ferli eftir ákveðnum reglum.

  1. Kjarninn þarf lágmarksminni fyrir sjálfan sig.
  2. Þú þarft að losa um mikið minni.
  3. Það er engin þörf á að slíta ferlum sem nota lítið minni.
  4. Ljúka þarf lágmarksferlum.
  5. Flóknar reiknirit sem auka líkur á að þeim lýkur fyrir þá ferla sem notandinn vill sjálfur klára.

Eftir að hafa lokið öllum þessum athugunum skoðar OOM stigið (oom_score). OOM úthlutar oom_score hvert ferli og margfaldar síðan þetta gildi með minnismagninu. Ferlar með stærri gildi eru líklegri til að verða fórnarlamb OOM Killer. Ferlar sem tengjast rótnotandanum hafa lægri einkunn og ólíklegri til að neyðast til að hætta.

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

Postgres ferli ID er 3813, þannig að í annarri skel er hægt að fá stigið með því að nota þessa kjarnabreytu oom_score:

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

Ef þú vilt alls ekki að OOM-Killer drepi ferlið, þá er annar kjarnavalkostur: oom_score_adj. Bættu við miklu neikvæðu gildi til að draga úr líkunum á að ljúka ferli sem þú metur.

sudo echo -100 > /proc/3813/oom_score_adj

Til að stilla gildi oom_score_adj, stilltu OOMScoreAdjust í þjónustublokkinni:

[Service]
OOMScoreAdjust=-1000

Eða nota oomprotect í liði rcctl.

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

Þvinga fram lokun á ferli

Þegar eitt eða fleiri ferli eru þegar valin kallar OOM-Killer á aðgerðina oom_kill_task(). Þessi aðgerð sendir stöðvunarmerki til ferlisins. Ef minnisskortur er oom_kill() Kallar þessa aðgerð til að senda SIGKILL merki í ferlið. Skilaboð eru skrifuð í kjarnaskrána.

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

Hvernig á að stjórna OOM-Killer

Á Linux geturðu virkjað eða slökkt á OOM-Killer (þó ekki sé mælt með því síðarnefnda). Til að virkja eða slökkva skaltu nota færibreytuna vm.oom-kill. Til að virkja OOM-Killer á keyrslutíma skaltu keyra skipunina sysctl.

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

Til að slökkva á OOM-Killer skaltu tilgreina gildið 0 í sömu skipun:

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

Niðurstaða þessarar skipunar verður ekki vistuð að eilífu, heldur aðeins þar til fyrstu endurræsingu. Ef þú þarft meiri þrautseigju skaltu bæta þessari línu við skrána /etc/sysctl.conf:

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

Önnur leið til að virkja og slökkva á er að skrifa breytu panic_on_oom. Það er alltaf hægt að innrita gildið /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Ef þú stillir gildið á 0, þá verður engin kjarna læti þegar minnið klárast.

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

Ef þú stillir gildið á 1, þá mun kjarna læti eiga sér stað þegar minnið klárast.

echo 1 > /proc/sys/vm/panic_on_oom

Ekki er aðeins hægt að kveikja og slökkva á OOM-Killer. Við höfum þegar sagt að Linux getur frátekið meira minni fyrir ferla en er í boði án þess að úthluta því í raun, og þessari hegðun er stjórnað af Linux kjarna færibreytu. Breytan ber ábyrgð á þessu vm.overcommit_memory.

Þú getur tilgreint eftirfarandi gildi fyrir það:

0: Kjarninn sjálfur ákveður hvort hann geymir of mikið minni. Þetta er sjálfgefið í flestum útgáfum af Linux.
1: Kjarninn mun alltaf geyma aukaminni. Þetta er áhættusamt, vegna þess að minnið gæti klárast, vegna þess að einn daginn munu ferlin krefjast þess.
2: kjarninn mun ekki taka frá meira minni en tilgreint er í færibreytunni overcommit_ratio.

Með þessari færibreytu tilgreinirðu hlutfall minnis sem leyfilegt er að vera of frátekið. Ef það er ekki pláss fyrir það er engu minni úthlutað og pöntuninni verður hafnað. Þetta er öruggasti kosturinn sem mælt er með fyrir PostgreSQL. OOM-Killer hefur áhrif á annan þátt - skiptigetu, sem er stjórnað af breytunni cat /proc/sys/vm/swappiness. Þessi gildi segja kjarnanum hvernig á að höndla síðuskipti. Því hærra sem gildið er, því minni líkur eru á að OOM stöðvi ferlið, en vegna I/O aðgerða hefur það neikvæð áhrif á gagnagrunninn. Og öfugt - því lægra sem gildið er, því meiri líkur eru á inngripi OOM-Killer, en árangur gagnagrunnsins er líka meiri. Sjálfgefið gildi er 60, en ef allur gagnagrunnurinn passar í minni er betra að stilla gildið á 1.

Niðurstöður

Ekki láta "morðingjann" í OOM-Killer hræða þig. Í þessu tilviki mun morðinginn vera bjargvættur kerfisins þíns. Það „drepur“ verstu ferlana og bjargar kerfinu frá því að hrynja. Til að forðast að þurfa að nota OOM-Killer til að slíta PostgreSQL skaltu stilla á vm.overcommit_memory gildi 2. Þetta tryggir ekki að OOM-Killer þurfi ekki að grípa inn í, en það mun draga úr líkum á því að PostgreSQL ferlinu verði hætt.

Heimild: www.habr.com

Bæta við athugasemd