
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.
- Feumaidh an kernel beagan cuimhne as lugha dha fhèin.
- Feumaidh tu tòrr cuimhne a shaoradh.
- Chan eil feum air crÏoch a chur air pròiseasan a tha a 'cleachdadh glè bheag de chuimhne.
- Feumar pròiseasan as Ïsle a chrÏochnachadh.
- 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
2Mura 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_adjGus luach a shuidheachadh oom_score_adj, suidhich OOMScoreAdjust anns aâ bhloc seirbheis:
[Service]
OOMScoreAdjust=-1000No cleachd oomprotect ann an sgioba rcctl.
rcctl set <i>servicename</i> oomprotect -1000Feachd 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 = 1Gus OOM-Killer a dhÏ-cheadachadh, sònraich an luach 0 san aon à ithne:
sudo -s sysctl -w vm.oom-kill = 0Cha 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.confIs 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
0Ma 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_oomMa 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_oomFaodar 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
