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 bhios e a-staigh Linux Thig frithealaiche an stòr-dàta gu crìch gun dùil, agus feumar an t-adhbhar a dhearbhadh. Dh’ fhaodadh 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 bhios tu frithealaiche no ruithidh am pròiseas a-mach à cuimhne, Linux Tha an Out-Of-Memory Killer a’ tabhann dà fhuasgladh: an siostam gu lèir a mhilleadh no am pròiseas (an tagradh) a tha ag ithe suas cuimhne a thoirt gu crìch. Tha e nas fheàrr, gu dearbh, am pròiseas a thoirt gu crìch agus an siostam obrachaidh a shàbhaladh bho bhith a’ tuiteam. Ann an ùine ghoirid, is e pròiseas a th’ anns an Out-Of-Memory Killer a chuireas crìoch air tagradh gus an eithne a shàbhaladh bho bhith a’ tuiteam. Bidh e ag ìobairt an tagraidh gus an siostam obrachaidh a chumail a’ ruith. Bruidhnidh sinn an toiseach air mar a tha OOM ag obair agus mar a chumas sinn smachd air, agus an uairsin coimheadaidh sinn air mar a cho-dhùineas an OOM Killer dè na tagraidhean a chuireas iad gu crìch.

Aon de na prìomh ghnìomhan Linux — Cuimhne a riarachadh do phròiseasan nuair a dh’iarras iad i. Mar as trice, bidh pròiseas no aplacaid ag iarraidh cuimhne bhon t-siostam obrachaidh ach chan eil e ga cleachdadh gu tur. Ma riaraicheas an siostam obrachaidh cuimhne do gach neach a dh’iarras i ach nach eil e an dùil a cleachdadh, ruithidh an siostam a-mach à cuimhne gu sgiobalta, agus tuitidh an siostam. Gus casg a chuir air seo, bidh an siostam obrachaidh a’ gleidheadh ​​cuimhne airson pròiseas ach chan eil e ga riarachadh dha-rìribh. Chan eil cuimhne air a riarachadh ach nuair a tha pròiseas an dùil a chleachdadh. Aig amannan chan eil cuimhne shaor aig an t-siostam obrachaidh, ach bidh e a’ riarachadh cuimhne do phròiseas, agus nuair a dh’ fheumas am pròiseas i, bidh an siostam obrachaidh ga riarachadh ma ghabhas e dèanamh. Is e an taobh àicheil gu bheil an siostam obrachaidh uaireannan a’ gleidheadh ​​cuimhne, ach nuair a bhios feum air, chan eil cuimhne shaor ann, ag adhbhrachadh tubaist siostaim. Tha OOM a’ cluich prìomh dhreuchd san t-suidheachadh seo, a’ cur crìoch air pròiseasan gus casg a chuir air an eithne bho bhith a’ gabhail dragh. Nuair a thèid crìoch a chuir air a’ phròiseas PostgreSQL gu làidir, nochdaidh an teachdaireachd a leanas anns an 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

В Linux ’S urrainn dhut OOM-Killer a chomasachadh no a dhì-chomasachadh (ged nach eilear a’ moladh an tè mu dheireadh). Gus a chomasachadh no a dhì-chomasachadh, cleachd am paramadair 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

Faodar OOM-Killer a thionndadh air agus dheth, mar a thuirt sinn mu thràth. Linux faodaidh e barrachd cuimhne a ghleidheadh ​​airson phròiseasan na tha ri fhaighinn, ach gun a bhith ga riarachadh dha-rìribh, agus tha am paramadair eithne a’ cumail smachd air a’ ghiùlan seo LinuxTha an caochladair an urra ri seo. vm.overcommit_memory.

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

0: Bidh an eithne fhèin a’ co-dhùnadh am bu chòir cus cuimhne a ghleidheadh. Is e seo an luach bunaiteach anns a’ mhòr-chuid de dhreachan. 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

Ceannaich aoigheachd earbsach airson làraich le dìon DDoS, frithealaichean VPS VDS 🔥 Ceannaich aoigheachd làrach-lìn earbsach le dìon DDoS, frithealaichean VPS VDS | ProHoster