A’ stèidheachadh Killer Out-of-Memory ann an Linux airson PostgreSQL

A’ stèidheachadh Killer Out-of-Memory ann an Linux airson PostgreSQL

Nuair a sguireas frithealaiche stòr-dàta ann an Linux gun dùil, feumaidh tu an adhbhar a lorg. Faodaidh grunn adhbharan a bhith ann. Mar eisimpleir, SIGSEGV - fàiligeadh ri linn buga san t-seirbheisiche backend. Ach tha seo tearc. Mar as trice, bidh thu dìreach a’ ruith a-mach à àite diosc no cuimhne. Ma ruitheas tu a-mach à àite diosc, chan eil ann ach aon dòigh a-mach - saor àite agus ath-thòisich an stòr-dàta.

Fear-marbhadh a-mach à cuimhne

Nuair a ruitheas frithealaiche no pròiseas a-mach à cuimhne, tha Linux a’ tabhann 2 fhuasglaidhean: cuir às don t-siostam gu lèir no cuir crìoch air a’ phròiseas (tagradh) a tha ag ithe cuimhne. Tha e nas fheàrr, gu dearbh, crìoch a chur air a 'phròiseas agus an OS a shàbhaladh bho bhith a' tuiteam. Gu h-aithghearr, tha Out-Of-Memory Killer na phròiseas a bhios a’ marbhadh tagradh gus an kernel a shàbhaladh bho bhith a ’tuiteam. Bidh e ag ìobairt an aplacaid gus an OS a chumail a ’dol. Bruidhnidh sinn an-toiseach mar a tha OOM ag obair agus mar a chumas sinn smachd air, agus an uairsin chì sinn mar a bhios OOM Killer a’ co-dhùnadh dè an tagradh a thig gu crìch.

Is e aon de na prìomh ghnìomhan aig Linux cuimhne a riarachadh gu pròiseasan nuair a dh’ iarras iad e. Mar as trice, bidh pròiseas no tagradh ag iarraidh cuimhne bhon OS, ach chan eil e ga chleachdadh gu h-iomlan. Ma bheir an t-Suirbhidh Òrdanais a-mach cuimhne dhan a h-uile duine a dh'iarras e ach aig nach eil planaichean airson a cleachdadh, gu math luath ruithidh a' chuimhne a-mach agus fàillidh an siostam. Gus seo a sheachnadh, tha an OS a 'gleidheadh ​​​​cuimhne airson a' phròiseas, ach chan eil e ga leigeil ma sgaoil. Chan eil cuimhne air a riarachadh ach nuair a tha pròiseas gu bhith ga chleachdadh. Tha e a 'tachairt nach eil cuimhne an-asgaidh aig an OS, ach bidh e a' sònrachadh cuimhne gu pròiseas, agus nuair a bhios feum air pròiseas, bidh an OS ga riarachadh mas urrainn dha. Is e an ana-cothrom gum bi an OS uaireannan a’ gleidheadh ​​​​cuimhne, ach aig an àm cheart chan eil cuimhne an-asgaidh ann, agus bidh an siostam a’ tuiteam. Tha àite cudromach aig OOM anns an t-suidheachadh seo agus a’ cur crìoch air pròiseasan gus casg a chuir air an kernel bho bhith a’ clisgeadh. Nuair a thèid pròiseas PostgreSQL a thoirt gu crìch, nochdaidh teachdaireachd sa loga:

Out of Memory: Killed process 12345 (postgres).

Ma tha an siostam ìosal air cuimhne agus nach gabh a shaoradh, canar an gnìomh ris out_of_memory. Aig an ìre seo, chan eil aice ach aon rud ri dhèanamh - crìoch a chur air aon phròiseas no barrachd. Am bu chòir do OOM-killer am pròiseas a thoirt gu crìch sa bhad no an urrainn dha feitheamh? Gu follaiseach, nuair a thèid out_of_memory a ghairm, tha e mar thoradh air feitheamh ri gnìomhachd I/O no paging gu diosc. Mar sin, feumaidh an neach-marbhadh OOM sgrùdaidhean a dhèanamh an-toiseach agus, stèidhichte orra, co-dhùnadh gum feumar am pròiseas a thoirt gu crìch. Ma tha na sgrùdaidhean gu h-ìosal deimhinneach, cuiridh OOM crìoch air a’ phròiseas.

Taghadh phròiseas

Nuair a ruitheas cuimhne a-mach, canar an gnìomh ris out_of_memory(). Tha gnìomh aige select_bad_process(), a gheibh measadh bhon ghnìomh badness(). Thèid am pròiseas “as miosa” a chuimseachadh. Gnìomh badness() taghadh pròiseas a rèir riaghailtean sònraichte.

  1. Feumaidh an kernel beagan cuimhne as lugha dha fhèin.
  2. Feumaidh tu tòrr cuimhne a shaoradh.
  3. Chan eil feum air crìoch a chur air pròiseasan a tha a 'cleachdadh glè bheag de chuimhne.
  4. Feumar pròiseasan as ìsle a chrìochnachadh.
  5. Algorithms iom-fhillte a tha a 'meudachadh chothroman crìochnachaidh airson na pròiseasan sin a tha an neach-cleachdaidh fhèin airson a chrìochnachadh.

Às deidh na sgrùdaidhean sin uile a chrìochnachadh, bidh OOM a’ sgrùdadh an sgòr (oom_score). OOM a’ cur an dreuchd oom_score gach pròiseas, agus an uairsin iomadachadh an luach seo leis an ìre de chuimhne. Tha pròiseasan le luachan nas motha nas dualtaiche fulang leis an OOM Killer. Tha sgòr nas ìsle aig pròiseasan co-cheangailte ris an neach-cleachdaidh bunaiteach agus chan eil iad cho dualtach a bhith air an èigneachadh gu crìch.

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

Is e ID pròiseas Postgres 3813, agus mar sin ann an slige eile tha e comasach an sgòr fhaighinn a’ cleachdadh am paramadair kernel seo oom_score:

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

Mura h-eil thu airson gun cuir OOM-Killer am pròiseas gu bàs idir, tha roghainn kernel eile ann: oom_score_adj. Cuir luach àicheil mòr ris gus na cothroman air crìoch a chur air pròiseas a tha thu a’ cur luach a lughdachadh.

sudo echo -100 > /proc/3813/oom_score_adj

Gus luach a shuidheachadh oom_score_adj, suidhich OOMScoreAdjust anns a’ bhloc seirbheis:

[Service]
OOMScoreAdjust=-1000

No cleachd oomprotect ann an sgioba rcctl.

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

Feachd crìoch a chur air pròiseas

Nuair a tha aon phròiseas no barrachd air a thaghadh mar-thà, bidh OOM-Killer a 'gairm a' ghnìomh oom_kill_task(). Bidh an gnìomh seo a’ cur comharra crìochnachaidh chun phròiseas. Ann an cùis gainnead cuimhne oom_kill() A’ gairm a’ ghnìomh seo gus comharra SIGKILL a chuir chun phròiseas. Tha teachdaireachd air a sgrìobhadh chun log kernel.

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

Mar a chumas tu smachd air OOM-Killer

Air Linux, faodaidh tu OOM-Killer a chomasachadh no a dhì-chomasachadh (ged nach eilear a’ moladh an tè mu dheireadh). Gus am paramadair a chleachdadh no a chur à comas vm.oom-kill. Gus OOM-Killer a chomasachadh aig àm ruith, ruith an àithne sysctl.

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

Gus OOM-Killer a dhì-cheadachadh, sònraich an luach 0 san aon àithne:

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

Cha tèid toradh na h-àithne seo a shàbhaladh gu bràth, ach dìreach gus a’ chiad ath-thòiseachadh. Ma tha barrachd seasmhachd a dhìth ort, cuir an loidhne seo ris an fhaidhle /etc/sysctl.conf:

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

Is e dòigh eile air comas agus à comas caochladair a sgrìobhadh panic_on_oom. Faodar an luach a sgrùdadh an-còmhnaidh /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Ma shuidhicheas tu an luach gu 0, an uairsin nuair a ruitheas cuimhne a-mach, cha bhith clisgeadh kernel ann.

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

Ma shuidhicheas tu an luach gu 1, an uairsin nuair a ruitheas a’ chuimhne a-mach, thig clisgeadh kernel.

echo 1 > /proc/sys/vm/panic_on_oom

Chan urrainnear OOM-Killer a thionndadh air agus dheth a-mhàin. Tha sinn air a ràdh mar-thà gum faod Linux barrachd cuimhne a ghleidheadh ​​​​airson pròiseasan na tha ri fhaighinn gun a bhith ga riarachadh, agus tha an giùlan seo fo smachd paramadair kernel Linux. Tha uallach air an caochlaideach airson seo vm.overcommit_memory.

Faodaidh tu na luachan a leanas a shònrachadh air a shon:

0: Bidh an kernel fhèin a’ co-dhùnadh am bu chòir cus cuimhne a ghlèidheadh. Is e seo an rud bunaiteach air a’ mhòr-chuid de dhreachan de Linux.
1: Bidh an kernel an-còmhnaidh a’ gleidheadh ​​​​cuimhne a bharrachd. Tha seo cunnartach, oir faodaidh an cuimhne ruith a-mach, oir, as coltaiche, aon latha bidh feum aig na pròiseasan air.
2: cha ghlèidh an kernel barrachd cuimhne na tha air a shònrachadh sa pharameter overcommit_ratio.

Leis a 'pharaiméadar seo, bidh thu a' sònrachadh an àireamh sa cheud de chuimhne a tha ceadaichte a bhith ro-ghlèidhte. Mura h-eil àite ann air a shon, chan eil cuimhne air a riarachadh, agus thèid an glèidheadh ​​​​a dhiùltadh. Is e seo an roghainn as sàbhailte a thathar a’ moladh airson PostgreSQL. Tha eileamaid eile a’ toirt buaidh air OOM-Killer - an comas suaipidh, a tha fo smachd an caochlaideach cat /proc/sys/vm/swappiness. Tha na luachan sin ag innse don kernel mar a làimhsicheas tu paging. Mar as àirde an luach, is ann as dualtaiche a tha e gun cuir OOM crìoch air a’ phròiseas, ach mar thoradh air gnìomhachd I / O tha droch bhuaidh aige air an stòr-dàta. Agus a chaochladh - mar as ìsle an luach, is ann as àirde an coltas gum bi eadar-theachd OOM-Killer, ach tha coileanadh an stòr-dàta nas àirde cuideachd. Is e 60 an luach bunaiteach, ach ma tha an stòr-dàta gu lèir a’ freagairt air cuimhne, tha e nas fheàrr an luach a shuidheachadh gu 1.

Builean

Na leig leis an “marbhadh” ann an OOM-Killer eagal a chuir ort. Anns a ’chùis seo, bidh am marbhadh na fhear-saoraidh don t-siostam agad. Bidh e “a’ marbhadh ”na pròiseasan as miosa agus a’ sàbhaladh an t-siostam bho bhith a ’tuiteam. Gus nach fheum thu OOM-Killer a chleachdadh gus crìoch a chuir air PostgreSQL, suidhichte gu vm.overcommit_memory luach 2. Chan eil seo a’ gealltainn nach fheum OOM-Killer eadar-theachd a dhèanamh, ach lughdaichidh e an coltas gun toir e air pròiseas PostgreSQL crìochnachadh.

Source: www.habr.com

Cuir beachd ann