
Nigbati o wọle Linux Ẹ̀rọ ìpamọ́ dátà náà máa ń parí láìròtẹ́lẹ̀, a sì gbọ́dọ̀ mọ ìdí rẹ̀. Ọ̀pọ̀ ìdí ló lè wà. Fún àpẹẹrẹ, SIGSEGV - ikuna nitori kokoro kan ninu olupin ẹhin. Ṣugbọn eyi jẹ toje. Ni ọpọlọpọ igba, o kan sare kuro ni aaye disk tabi iranti. Ti o ba pari ni aaye disk, ọna kan nikan ni o wa - laaye aaye ki o tun bẹrẹ data naa.
Jade-Of-Memory apani
Nígbà tí ìwọ olupin tabi ilana naa pari lati iranti, Linux Apànìyàn Ìta-Ìrántí ní ojútùú méjì: kí gbogbo ètò náà ba gbogbo rẹ̀ jẹ́ tàbí kí ó fòpin sí ìlànà (ìlò) tí ó ń jẹ ìrántí run. Ó sàn láti fòpin sí ìlànà náà kí ó sì gba OS náà lọ́wọ́ ìfọ́. Ní kúkúrú, Apànìyàn Ìta-Ìrántí jẹ́ ìlànà kan tí ó ń fòpin sí ètò kan láti gba ekuro náà lọ́wọ́ ìfọ́. Ó ń fi ohun èlò náà sílẹ̀ láti jẹ́ kí OS náà máa ṣiṣẹ́. Ẹ jẹ́ kí a kọ́kọ́ jíròrò bí OOM ṣe ń ṣiṣẹ́ àti bí a ṣe lè ṣàkóso rẹ̀, lẹ́yìn náà, wo bí OOM Apànìyàn ṣe ń pinnu àwọn ohun èlò tí yóò fòpin sí.
Ọkan ninu awọn iṣẹ-ṣiṣe akọkọ Linux — Yí ìrántí sí àwọn ìlànà nígbà tí wọ́n bá béèrè fún un. Lọ́pọ̀ ìgbà, ìlànà tàbí ohun èlò kan ń béèrè fún ìrántí láti ọ̀dọ̀ OS ṣùgbọ́n kò lò ó pátápátá. Tí OS bá pín ìrántí sí gbogbo ẹni tí ó béèrè fún un ṣùgbọ́n tí kò gbèrò láti lò ó, ètò náà yóò yára tán nínú ìrántí, ètò náà yóò sì bàjẹ́. Láti dènà èyí, OS náà ń tọ́jú ìrántí fún ìlànà kan ṣùgbọ́n kò pín in síta ní gidi. A ń pín ìrántí síta kìkì nígbà tí ìlànà kan bá fẹ́ lò ó ní gidi. Nígbà míìràn OS kò ní ìrántí ọ̀fẹ́, ṣùgbọ́n ó ń pín ìrántí sí ìlànà kan, nígbà tí ìlànà náà bá nílò rẹ̀, OS náà ń pín in síta tí ó bá lè ṣe é. Àbùkù ni pé nígbà míìràn OS ń tọ́jú ìrántí, ṣùgbọ́n nígbà tí ó bá pọndandan, kò sí ìrántí ọ̀fẹ́, tí ó ń fa ìkọlù ètò. OOM ń kó ipa pàtàkì nínú ìṣẹ̀lẹ̀ yìí, ó ń dá àwọn ìlànà dúró láti dènà kí ekuro má baà bẹ̀rù. Nígbà tí a bá fi agbára mú ìlànà PostgreSQL, ìránṣẹ́ tí ó tẹ̀lé yìí yóò farahàn nínú àkọsílẹ̀ náà:
Out of Memory: Killed process 12345 (postgres).Ti eto naa ba kere si iranti ati pe ko le ni ominira, iṣẹ naa ni a pe out_of_memory. Ni ipele yii, ohun kan ni o kù lati ṣe - pari ọkan tabi diẹ sii awọn ilana. O yẹ ki OOM-apaniyan fopin si ilana lẹsẹkẹsẹ tabi o le duro? O han ni, nigbati a pe out_of_memory, o jẹ nitori iduro fun iṣẹ I/O tabi paging si disk. Nitorinaa, apaniyan OOM gbọdọ kọkọ ṣe awọn sọwedowo ati, da lori wọn, pinnu pe ilana naa nilo lati fopin si. Ti gbogbo awọn sọwedowo ni isalẹ jẹ rere, OOM yoo fopin si ilana naa.
Aṣayan ilana
Nigbati iranti ba jade, a pe iṣẹ naa out_of_memory(). O ni iṣẹ kan select_bad_process(), eyi ti o gba igbelewọn lati iṣẹ naa badness(). Ilana "buru" yoo wa ni ìfọkànsí. Išẹ badness() yan ilana ni ibamu si awọn ofin kan.
- Ekuro nilo diẹ ninu iranti iranti fun ararẹ.
- O nilo lati fi ọpọlọpọ iranti silẹ.
- Ko si ye lati fopin si awọn ilana ti o nlo iranti kekere.
- Awọn ilana ti o kere julọ nilo lati pari.
- Awọn algoridimu eka ti o pọ si awọn aye ti ipari fun awọn ilana wọnyẹn ti olumulo funrararẹ fẹ lati pari.
Lẹhin ti pari gbogbo awọn sọwedowo wọnyi, OOM ṣe idanwo Dimegilio (oom_score). OOM ṣe ipinnu oom_score kọọkan ilana, ati ki o si isodipupo yi iye nipa iye ti iranti. Awọn ilana pẹlu awọn iye nla jẹ diẹ sii lati ṣubu ni olufaragba si Apaniyan OOM. Awọn ilana ti o ni nkan ṣe pẹlu olumulo root ni Dimegilio kekere ati pe o kere julọ lati fi agbara mu lati fopin si.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)ID ilana Postgres jẹ 3813, nitorinaa ninu ikarahun miiran o ṣee ṣe lati gba Dimegilio nipa lilo paramita ekuro yii oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Ti o ko ba fẹ OOM-Killer lati pa ilana naa rara, aṣayan ekuro miiran wa: oom_score_adj. Ṣafikun iye odi nla lati dinku awọn aye ti ipari ilana ti o ni idiyele.
sudo echo -100 > /proc/3813/oom_score_adjLati ṣeto iye kan oom_score_adj, ṣeto OOMScoreṢatunṣe ni bulọọki iṣẹ:
[Service]
OOMScoreAdjust=-1000Tabi lo oomprotect ninu egbe kan rcctl.
rcctl set <i>servicename</i> oomprotect -1000Ifopinsi ipa ti ilana kan
Nigbati ọkan tabi diẹ sii awọn ilana ti yan tẹlẹ, OOM-Killer pe iṣẹ naa oom_kill_task(). Iṣẹ yii nfi ifihan agbara ifopinsi ranṣẹ si ilana naa. Ni ọran ti aito iranti oom_kill() Awọn ipe iṣẹ yii lati fi ami ifihan SIGKILL ranṣẹ si ilana naa. Ifiranṣẹ kan ti kọ si akọọlẹ ekuro.
Out of Memory: Killed process [pid] [name].Bii o ṣe le ṣakoso OOM-Killer
В Linux O le mu OOM-Killer ṣiṣẹ tabi mu kuro (botilẹjẹpe a ko ṣeduro eyi ti o kẹhin). Lati mu ṣiṣẹ tabi mu kuro, lo paramita naa vm.oom-kill. Lati mu OOM-Killer ṣiṣẹ ni akoko asiko, ṣiṣe aṣẹ naa sysctl.
sudo -s sysctl -w vm.oom-kill = 1Lati mu OOM-Killer ṣiṣẹ, pato iye 0 ni aṣẹ kanna:
sudo -s sysctl -w vm.oom-kill = 0Abajade aṣẹ yii kii yoo ni fipamọ lailai, ṣugbọn titi di atunbere akọkọ. Ti o ba nilo itẹramọṣẹ diẹ sii, ṣafikun laini yii si faili naa /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confOna miiran lati mu ṣiṣẹ ati mu ṣiṣẹ ni lati kọ oniyipada kan panic_on_oom. Iye le nigbagbogbo ṣayẹwo ni /proc.
$ cat /proc/sys/vm/panic_on_oom
0Ti o ba ṣeto iye si 0, lẹhinna nigbati iranti ba pari, ko ni si ijaaya kernel.
$ echo 0 > /proc/sys/vm/panic_on_oomTi o ba ṣeto iye si 1, lẹhinna nigbati iranti ba pari, ijaaya ekuro yoo waye.
echo 1 > /proc/sys/vm/panic_on_oomA le tan OOM-Killer ati pa, gẹgẹ bi a ti sọ tẹlẹ. Linux le pamọ́ iranti diẹ sii fun awọn ilana ju ti o wa lọ, ṣugbọn kii ṣe pinpin rẹ ni otitọ, ati pe iwa yii ni a ṣakoso nipasẹ paramita kernel kan LinuxOniruuru naa ni o ni ojuse fun eyi. vm.overcommit_memory.
O le pato awọn iye wọnyi fun rẹ:
0: Kéréènì fúnra rẹ̀ ló máa pinnu bóyá ó máa tọ́jú ìrántí púpọ̀ jù. Èyí ni iye àìyípadà nínú ọ̀pọ̀lọpọ̀ àwọn ẹ̀yà. Linux.
1: Ekuro yoo nigbagbogbo ni ipamọ afikun iranti. Eyi jẹ eewu, nitori iranti le pari, nitori, o ṣeese, ni ọjọ kan awọn ilana yoo nilo rẹ.
2: ekuro yoo ko ni ipamọ diẹ iranti ju pato ninu awọn paramita overcommit_ratio.
Pẹlu paramita yii, o pato ipin ogorun iranti ti o gba laaye lati wa ni ipamọ ju. Ti ko ba si aaye fun o, ko si iranti ti wa ni soto, ati awọn ifiṣura yoo wa ni sẹ. Eyi ni aṣayan aabo julọ ti a ṣeduro fun PostgreSQL. OOM-Killer ni ipa nipasẹ nkan miiran - agbara swapping, eyiti o jẹ iṣakoso nipasẹ oniyipada cat /proc/sys/vm/swappiness. Awọn iye wọnyi sọ fun ekuro bi o ṣe le ṣe itọju paging. Iwọn ti o ga julọ, o kere si pe OOM yoo fopin si ilana naa, ṣugbọn nitori awọn iṣẹ I / O o ni ipa odi lori aaye data. Ati ni idakeji - iye ti o dinku, o ṣeeṣe ti o ṣeeṣe ti OOM-Killer intervention, ṣugbọn iṣẹ data tun ga julọ. Iwọn aiyipada jẹ 60, ṣugbọn ti gbogbo data data ba baamu ni iranti, o dara lati ṣeto iye si 1.
Awọn esi
Maṣe jẹ ki "apaniyan" ni OOM-Killer dẹruba ọ. Ni idi eyi, apaniyan yoo jẹ olugbala ti eto rẹ. O "pa" awọn ilana ti o buru julọ ati fi eto pamọ lati jamba. Lati yago fun nini lati lo OOM-Killer lati fopin si PostgreSQL, ṣeto si vm.overcommit_memory iye 2. Eyi ko ṣe idaniloju pe OOM-Killer kii yoo ni lati laja, ṣugbọn yoo dinku o ṣeeṣe lati fi ipa mu ilana PostgreSQL lati fopin si.
orisun: www.habr.com
