Ag socrú Killer Ó Chuimhne i Linux le haghaidh PostgreSQL

Ag socrú Killer Ó Chuimhne i Linux le haghaidh PostgreSQL

Nuair a bheidh sé isteach Linux Tagann deireadh leis an bhfreastalaí bunachar sonraí gan choinne, agus ní mór an chúis a chinneadh. D’fhéadfadh roinnt cúiseanna a bheith leis sin. 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 bhíonn tú freastalaí nó ritheann an próiseas as cuimhne, Linux Cuireann an Maraitheoir Ón gCuimhne dhá réiteach ar fáil: an córas ar fad a thuairteáil nó an próiseas (an feidhmchlár) atá ag ithe suas cuimhne a fhoirceannadh. Is fearr, ar ndóigh, an próiseas a fhoirceannadh agus an córas oibriúcháin a shábháil ó thuairteáil. Go hachomair, is próiseas é an Maraitheoir Ón gCuimhne a fhoirceannann feidhmchlár chun an eithne a shábháil ó thuairteáil. Íobairtíonn sé an feidhmchlár chun an córas oibriúcháin a choinneáil ag rith. Pléifimid ar dtús conas a oibríonn OOM agus conas é a rialú, agus ansin féachfaimid ar an gcaoi a gcinneann an Maraitheoir Ón gCuimhne cé na feidhmchláir atá le foirceannadh.

Ceann de na príomhchúraimí Linux — Cuimhne a leithdháileadh ar phróisis nuair a iarrann siad í. De ghnáth, iarrann próiseas nó feidhmchlár cuimhne ón gcóras oibriúcháin ach ní úsáideann sé í go hiomlán. Má leithdháileann an córas oibriúcháin cuimhne ar gach duine a iarrann í ach nach bhfuil sé beartaithe aige í a úsáid, rithfidh an córas as cuimhne go tapa, agus tuairteálfaidh an córas. Chun seo a chosc, coimeádann an córas oibriúcháin cuimhne do phróiseas ach ní leithdháileann sé í i ndáiríre. Ní leithdháiltear cuimhne ach amháin nuair a bhíonn sé beartaithe ag próiseas í a úsáid i ndáiríre. Uaireanta ní bhíonn cuimhne shaor ag an gcóras oibriúcháin, ach leithdháileann sé cuimhne ar phróiseas, agus nuair a bhíonn sí ag teastáil ón bpróiseas, leithdháileann an córas oibriúcháin í más féidir leis. Is é an míbhuntáiste ná go gcuireann an córas oibriúcháin cuimhne i leataobh uaireanta, ach nuair is gá, ní bhíonn aon chuimhne shaor ann, rud a fhágann tuairteáil chórais. Tá ról lárnach ag OOM sa chás seo, ag foirceannadh próisis chun cosc ​​a chur ar an eithne scaoll a chur. Nuair a chuirtear deireadh leis an bpróiseas PostgreSQL go foréigneach, feictear an teachtaireacht seo a leanas 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ú

В Linux Is féidir leat OOM-Killer a chumasú nó a dhíchumasú (cé nach moltar an dara ceann). Chun é a chumasú nó a dhíchumasú, bain úsáid as an bparaiméadar 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

Is féidir OOM-Killer a chasadh air agus as, mar a luadh againn cheana féin. Linux féadfaidh sé níos mó cuimhne a chur in áirithe do phróisis ná mar atá ar fáil, ach ní féidir leis í a leithdháileadh i ndáiríre, agus rialaítear an t-iompar seo le paraiméadar eithne LinuxIs é an athróg atá freagrach as seo. vm.overcommit_memory.

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

0: Is í an eithne féin a chinneann an gcuirfidh sí an iomarca cuimhne in áirithe. Seo an luach réamhshocraithe i bhformhór na leaganacha. 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

Ceannaigh óstáil iontaofa do shuímh le cosaint DDoS, freastalaithe VPS VDS 🔥 Ceannaigh óstáil gréasáin iontaofa le cosaint DDoS, freastalaithe VPS VDS | ProHoster