Killer As-Chuimhne a bhunú i Linux do PostgreSQL

Killer As-Chuimhne a bhunú i Linux do PostgreSQL

Nuair a scoireann freastalaí bunachar sonraí i Linux gan choinne, ní mór duit an chúis a aimsiú. D’fhéadfadh go mbeadh cúiseanna éagsúla ann. Mar shampla, SIGSEGV — teip mar gheall ar fhabht sa fhreastalaí inneall. Ach tá sé seo annamh. Is minic a ritheann tú as spás diosca nó cuimhne. Má ritheann tú as spás diosca, níl ach bealach amháin amach - saor spás agus atosú ar an mbunachar sonraí.

Killer As-Chuimhne

Nuair a ritheann freastalaí nó próiseas as cuimhne, cuireann Linux 2 réiteach ar fáil: tuairteála an córas ar fad nó deireadh a chur leis an bpróiseas (iarratas) atá ag ithe suas cuimhne. Tá sé níos fearr, ar ndóigh, an próiseas a fhoirceannadh agus an OS a shábháil ó crashing. Go hachomair, is próiseas é Killer As-Memory a mharaíonn feidhmchlár chun an eithne a shábháil ó thuairteáil. Íobairtí sé an t-iarratas a choinneáil ar an OS ag rith. Déanaimis plé ar dtús ar an gcaoi a n-oibríonn OOM agus conas é a rialú, agus ansin féachaint conas a chinneann OOM Killer cén t-iarratas a fhoirceannfar.

Ceann de na príomhthascanna atá ag Linux ná cuimhne a leithdháileadh ar phróisis nuair a iarrann siad é. De ghnáth, iarrann próiseas nó feidhmchlár cuimhne ón OS, ach ní úsáideann sé go hiomlán é. Má thugann an OS cuimhne amach do gach duine a iarrann é ach nach bhfuil aon phlean aige í a úsáid, go han-luath rithfidh an chuimhne amach agus teipfidh an córas. Chun é seo a sheachaint, coimeádann an OS cuimhne don phróiseas, ach ní scaoileann sé é i ndáiríre. Ní leithdháiltear cuimhne ach amháin nuair a bhíonn próiseas i ndáiríre chun é a úsáid. Tarlaíonn sé nach bhfuil cuimhne in aisce ag an OS, ach sannann sé cuimhne do phróiseas, agus nuair a bhíonn gá le próiseas, leithdháileann an OS é más féidir. Is é an míbhuntáiste ná go gcoimeádann an OS cuimhne uaireanta, ach ag an am ceart níl aon chuimhne saor in aisce ann, agus tuairteanna an chórais. Tá ról tábhachtach ag OOM sa chás seo agus cuireann sé deireadh le próisis chun an eithne a chosc ó scaoll. Nuair a chuirtear iachall ar phróiseas PostgreSQL a fhoirceannadh, feictear teachtaireacht sa loga:

Out of Memory: Killed process 12345 (postgres).

Má tá cuimhne íseal ar an gcóras agus nach féidir é a shaoradh, tugtar an fheidhm out_of_memory. Ag an gcéim seo, níl ach rud amháin fágtha aici - próiseas amháin nó níos mó a chur i gcrích. Ar cheart do OOM-killer an próiseas a fhoirceannadh láithreach nó an féidir leis fanacht? Ar ndóigh, nuair a ghlaoitear out_of_memory, tá sé mar gheall ar fanacht le hoibríocht I/O nó glaoireachta ar diosca. Dá bhrí sin, ní mór don killer OOM seiceálacha a dhéanamh ar dtús agus, bunaithe orthu, cinneadh a dhéanamh gur gá an próiseas a fhoirceannadh. Má tá na seiceálacha go léir thíos dearfach, cuirfidh OOM deireadh leis an bpróiseas.

Roghnú próisis

Nuair a ritheann cuimhne amach, tugtar an fheidhm out_of_memory(). Tá feidhm aige select_bad_process(), a fhaigheann meastóireacht ón bhfeidhm badness(). Díreofar ar an bpróiseas “is measa”. Feidhm badness() roghnaíonn sé próiseas de réir rialacha áirithe.

  1. Teastaíonn íoschuimhne ón eithne dó féin.
  2. Ní mór duit a lán cuimhne a shaoradh.
  3. Ní gá deireadh a chur le próisis a úsáideann beagán cuimhne.
  4. Ní mór próisis íosta a chomhlánú.
  5. Algartaim chasta a mhéadaíonn an seans go gcríochnófar na próisis sin is mian leis an úsáideoir é féin a chur i gcrích.

Tar éis na seiceálacha seo go léir a chur i gcrích, scrúdaíonn OOM an scór (oom_score). Sannann OOM oom_score gach próiseas, agus ansin iolraíonn sé an luach seo faoin méid cuimhne. Is mó an seans go dtitfidh próisis le luachanna níos mó mar íospartach don OOM Killer. Tá scór níos ísle ag próisis a bhaineann leis an úsáideoir fréimhe agus is lú an seans go gcuirfear iallach orthu foirceannadh.

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

Is é 3813 ID phróiseas Postgres, mar sin is féidir an scór a fháil ag baint úsáide as an bparaiméadar eithne seo i mblaosc eile oom_score:

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

Mura mian leat OOM-Killer an próiseas a mharú ar chor ar bith, tá rogha eithne eile ann: oom_score_adj. Cuir luach diúltach mór leis chun an seans go gcríochnófar próiseas a bhfuil meas agat air a laghdú.

sudo echo -100 > /proc/3813/oom_score_adj

Chun luach a shocrú oom_score_adj, socraigh OOMScoreAdjust sa bhloc seirbhíse:

[Service]
OOMScoreAdjust=-1000

Nó úsáid oomprotect i bhfoireann rcctl.

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

Foirceannadh próisis i bhfeidhm

Nuair a bhíonn próiseas amháin nó níos mó roghnaithe cheana féin, glaonn OOM-Killer an fheidhm oom_kill_task(). Cuireann an fheidhm seo comhartha foirceanta chuig an bpróiseas. I gcás ganntanas cuimhne oom_kill() Glaonna ar an bhfeidhm seo chun comhartha SIGKILL a sheoladh chuig an bpróiseas. Scríobhtar teachtaireacht chuig an loga eithne.

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

Conas OOM-Killer a rialú

Ar Linux, is féidir leat OOM-Killer a chumasú nó a dhíchumasú (cé nach moltar an dara ceann). Úsáid an paraiméadar chun é a chumasú nó a dhíchumasú vm.oom-kill. Chun OOM-Killer a chumasú ag am rite, rith an t-ordú sysctl.

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

Chun OOM-Killer a dhíchumasú, sonraigh an luach 0 san ordú céanna:

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

Ní shábhálfar toradh an ordaithe seo go deo, ach go dtí an chéad atosaigh. Má theastaíonn tuilleadh marthanachta uait, cuir an líne seo leis an gcomhad /etc/sysctl.conf:

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

Bealach eile le cumasú agus díchumasú ná athróg a scríobh panic_on_oom. Is féidir an luach a sheiceáil i gcónaí /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Má shocraíonn tú an luach go 0, ansin nuair a ritheann an chuimhne amach, ní bheidh aon scaoll eithne.

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

Má shocraíonn tú an luach go 1, ansin nuair a ritheann an chuimhne amach, tarlóidh scaoll eithne.

echo 1 > /proc/sys/vm/panic_on_oom

Ní féidir OOM-Killer a chasadh air agus as. Táimid tar éis a rá cheana féin gur féidir le Linux níos mó cuimhne a chur in áirithe do phróisis ná mar atá ar fáil gan é a leithdháileadh i ndáiríre, agus tá an iompar seo á rialú ag paraiméadar eithne Linux. Tá an t-athróg freagrach as seo vm.overcommit_memory.

Is féidir leat na luachanna seo a leanas a shonrú dó:

0: Cinneann an eithne féin cé acu an iomarca cuimhne a chur in áirithe. Is é seo an réamhshocrú ar fhormhór na leaganacha de Linux.
1: Coimeádfaidh an eithne cuimhne bhreise i gcónaí. Tá sé seo contúirteach, toisc go bhféadfadh an chuimhne éirí as, mar, is dócha, lá amháin beidh gá leis na próisis.
2: ní choimeádfaidh an eithne níos mó cuimhne ná mar atá sonraithe sa pharaiméadar overcommit_ratio.

Leis an bparaiméadar seo, sonraíonn tú céatadán na cuimhne a cheadaítear a bheith ró-áirithinte. Mura bhfuil spás ann dó, ní leithdháiltear aon chuimhne, agus diúltófar an áirithint. Is é seo an rogha is sábháilte a mholtar do PostgreSQL. Bíonn tionchar ag eilimint eile ar OOM-Killer - an cumas babhtála, atá á rialú ag an athróg cat /proc/sys/vm/swappiness. Insíonn na luachanna seo don eithne conas glaoireachta a láimhseáil. Dá airde an luach, is lú an seans go gcuirfidh OOM deireadh leis an bpróiseas, ach mar gheall ar oibríochtaí I/O bíonn tionchar diúltach aige ar an mbunachar sonraí. Agus vice versa - dá ísle an luach, is airde an dóchúlacht go dtarlóidh idirghabháil OOM-Killer, ach tá feidhmíocht an bhunachair shonraí níos airde freisin. Is é 60 an luach réamhshocraithe, ach má oireann an bunachar sonraí iomlán sa chuimhne, is fearr an luach a shocrú go 1.

Torthaí

Ná lig don "killer" in OOM-Killer tú a scanradh. Sa chás seo, beidh an killer an Slánaitheoir ar do chóras. “Maraíonn” sé na próisis is measa agus sábhálann sé an córas ó thuairteáil. Chun nach mbeidh ort OOM-Killer a úsáid chun PostgreSQL a fhoirceannadh, socraigh go vm.overcommit_memory luach 2. Ní ráthaíonn sé seo nach mbeidh ar OOM-Killer idirghabháil a dhéanamh, ach laghdóidh sé an dóchúlacht go gcuirfear deireadh le próiseas PostgreSQL.

Foinse: will.com

Add a comment