
Xa ungenile Linux Iseva yedathabheyisi iyaphela ngokungalindelekanga, kwaye unobangela kufuneka uchongwe. Kunokubakho izizathu ezininzi. Umzekelo, SIGSEGV — ukusilela ngenxa yegciwane kumncedisi ongasemva. Kodwa oku kunqabile. Amaxesha amaninzi, uvele uphelelwe yindawo yedisk okanye inkumbulo. Ukuba uphelelwa yindawo yedisk, kukho enye indlela yokuphuma - khulula indawo kwaye uqalise kwakhona i-database.
Umbulali weMemori wangaphandle
Xa wena umncedisi okanye inkqubo iphelelwa yinkumbulo, Linux I-Out-Of-Memory Killer inikezela ngezisombululo ezibini: ukuqhekeza yonke inkqubo okanye ukuphelisa inkqubo (usetyenziso) oludla imemori. Kungcono, ewe, ukuphelisa inkqubo nokusindisa i-OS ekuqhekekeni. Ngamafutshane, i-Out-Of-Memory Killer yinkqubo ephelisa usetyenziso ukuze isindise i-kernel ekuqhekekeni. Incama usetyenziso ukuze igcine i-OS isebenza. Masiqale sixoxe ngendlela esebenza ngayo i-OOM kunye nendlela yokuyilawula, size sijonge indlela i-OOM Killer egqiba ngayo ukuba zeziphi usetyenziso ekufuneka zigqitywe.
Omnye wemisebenzi ephambili Linux — Yabela imemori kwiinkqubo xa beyicela. Ngokwesiqhelo, inkqubo okanye usetyenziso lucela imemori kwi-OS kodwa aluyisebenzisi ngokupheleleyo. Ukuba i-OS yabela imemori kuye wonke umntu oyicelayo kodwa engacebi ukuyisebenzisa, inkqubo iya kuphelelwa yimemori ngokukhawuleza, kwaye inkqubo iya kuwa. Ukuthintela oku, i-OS igcina imemori yenkqubo kodwa ayiyabelanga ngokwenene. Imemori yabelwa kuphela xa inkqubo iceba ukuyisebenzisa. Ngamanye amaxesha i-OS ayinayo imemori yasimahla, kodwa yabela imemori kwinkqubo, kwaye xa inkqubo iyidinga, i-OS iyabela ukuba inako. Ingxaki kukuba ngamanye amaxesha i-OS igcina imemori, kodwa xa ifuneka, akukho memori yasimahla, nto leyo ebangela ukuba inkqubo iwe. I-OOM idlala indima ebalulekileyo kule meko, iphelisa iinkqubo zokuthintela i-kernel ekubeni ixhalabe. Xa inkqubo yePostgreSQL inqanyulwa ngenkani, umyalezo olandelayo uvela kwilog:
Out of Memory: Killed process 12345 (postgres).Ukuba inkqubo iphantsi kwimemori kwaye ayikwazi ukukhululwa, umsebenzi ubizwa out_of_memory. Kweli nqanaba, unento enye kuphela eseleyo-ukugqiba inkqubo enye okanye ngaphezulu. Ngaba i-OOM-killer kufuneka iyiphelise inkqubo ngokukhawuleza okanye inokulinda? Ngokucacileyo, xa kubizwa i-out_of_memory, kungenxa yokulinda ukusebenza kwe-I / O okanye ukupakisha kwidiski. Ke ngoko, umbulali we-OOM kufuneka aqale enze iitshekhi kwaye, ngokusekelwe kubo, agqibe ukuba inkqubo kufuneka ipheliswe. Ukuba zonke iitshekhi ezingezantsi zilungile, i-OOM iya kuyiphelisa inkqubo.
Ukukhetha inkqubo
Xa imemori iphela, umsebenzi ubizwa out_of_memory(). Inomsebenzi select_bad_process(), efumana uvavanyo kumsebenzi badness(). Inkqubo “embi” iya kujoliswa. Umsebenzi badness() ukhetha inkqubo ngokwemigaqo ethile.
- I-kernel idinga ubuncinci bememori ngokwayo.
- Kufuneka ukhulule imemori eninzi.
- Akukho mfuneko yokuphelisa iinkqubo ezisebenzisa imemori encinci.
- Ubuncinane beenkqubo kufuneka bugqitywe.
- Ii-algorithms eziyinkimbinkimbi ezandisa amathuba okugqitywa kwezo nkqubo umsebenzisi ngokwakhe afuna ukuzigqiba.
Ukugqiba zonke ezi zitshekisho, i-OOM ivavanya amanqaku (oom_score). Ukwabela kwe-OOM oom_score inkqubo nganye, kwaye iphinda-phinda eli xabiso ngobungakanani benkumbulo. Iinkqubo ezinamaxabiso amakhulu kunokwenzeka ukuba zibe lixhoba le-OOM Killer. Iinkqubo ezinxulumene nomsebenzisi wengcambu zinamanqaku aphantsi kwaye azifane zinyanzeliswe ukuba zipheliswe.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)I-ID yenkqubo ye-Postgres yi-3813, ngoko ke kwelinye iqokobhe kuyenzeka ukuba ufumane amanqaku usebenzisa le parameter yekernel. oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Ukuba awufuni ukuba i-OOM-Killer ibulale inkqubo kwaphela, kukho enye inketho ye-kernel: oom_score_adj. Yongeza ixabiso elibi elikhulu ukunciphisa amathuba okugqiba inkqubo oyixabisileyo.
sudo echo -100 > /proc/3813/oom_score_adjUkuseta ixabiso oom_score_adj, seta i-OOMScoreAdjust kwibhloko yenkonzo:
[Service]
OOMScoreAdjust=-1000Okanye sebenzisa oomprotect kwiqela rcctl.
rcctl set <i>servicename</i> oomprotect -1000Nyanzela ukupheliswa kwenkqubo
Xa inkqubo enye okanye ezininzi sele zikhethiwe, i-OOM-Killer ibiza umsebenzi oom_kill_task(). Lo msebenzi uthumela isignali yokuphelisa kwinkqubo. Kwimeko yokunqongophala kwememori oom_kill() Ibiza lo msebenzi ukuthumela i SIGKILL uphawu kwinkqubo. Umyalezo ubhalwa kwi kernel log.
Out of Memory: Killed process [pid] [name].Uyilawula njani i-OOM-Killer
В Linux Ungayivula okanye uyicime i-OOM-Killer (nangona le yokugqibela ingacetyiswa). Ukuze uyivule okanye uyicime, sebenzisa ipharamitha vm.oom-kill. Ukwenza i-OOM-Killer ngexesha lokusebenza, sebenzisa umyalelo sysctl.
sudo -s sysctl -w vm.oom-kill = 1Ukuvala i-OOM-Killer, khankanya ixabiso elingu-0 kumyalelo ofanayo:
sudo -s sysctl -w vm.oom-kill = 0Isiphumo salo myalelo asiyi kugcinwa ngonaphakade, kodwa kuphela de uqale ngokutsha. Ukuba ufuna ukuzingisa okungakumbi, yongeza lo mgca kwifayile /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confEnye indlela yokwenza kunye nokuvala kukubhala inguqu panic_on_oom. Ixabiso lingasoloko likhangelwa /proc.
$ cat /proc/sys/vm/panic_on_oom
0Ukuba umisela ixabiso ku-0, ngoko xa inkumbulo iphelile, akusayi kubakho panic ye-kernel.
$ echo 0 > /proc/sys/vm/panic_on_oomUkuba ubeka ixabiso ku-1, ngoko xa imemori iphelile, i-kernel panic iya kwenzeka.
echo 1 > /proc/sys/vm/panic_on_oomI-OOM-Killer ingavulwa kwaye icinywe, njengoko sele sitshilo. Linux ingagcina imemori engaphezulu kwiinkqubo kunokuba ikhona, kodwa ingayibeki ngokwayo, kwaye olu hlobo lokuziphatha lulawulwa yiparameter yekernel LinuxInguqu inoxanduva loku. vm.overcommit_memory.
Ungayichaza la maxabiso alandelayo:
0: I-kernel ngokwayo igqiba ekubeni igcine imemori eninzi na. Eli lixabiso elimiselweyo kwiinguqulelo ezininzi. Linux.
1: I-kernel iyakuhlala igcina imemori eyongezelelweyo. Oku kuyingozi, kuba imemori inokuphela, kuba, mhlawumbi, ngolunye usuku iinkqubo ziya kuyifuna.
2: i kernel ayizukugcina inkumbulo engaphezulu kune ichazwe kwi parameter overcommit_ratio.
Ngale parameter, ukhankanya ipesenti yenkumbulo evumelekileyo ukuba igcinwe ngokugqithisileyo. Ukuba akukho ndawo yayo, akukho memori yabelweyo, kwaye ugcino luya kwaliwa. Le yeyona ndlela ikhuselekileyo ecetyisiweyo kwiPostgreSQL. I-OOM-Killer ichaphazeleka yenye into - amandla okutshintsha, olawulwa yi-variable cat /proc/sys/vm/swappiness. La maxabiso axelela i-kernel indlela yokuphatha i-pageging. Ixabiso eliphezulu, kuncinci ukuba i-OOM iya kuyiphelisa inkqubo, kodwa ngenxa yemisebenzi ye-I/O inefuthe elibi kwisiseko sedatha. Kwaye ngokuchaseneyo - ixabiso eliphantsi, liphezulu amathuba okungenelela kwe-OOM-Killer, kodwa ukusebenza kwedatha kuphezulu. Ixabiso elingagqibekanga ngama-60, kodwa ukuba yonke idatabase ingena kwinkumbulo, kungcono ukuseta ixabiso ku-1.
Iziphumo
Ungavumeli "umbulali" kwi-OOM-Killer akoyikise. Kule meko, umbulali uya kuba ngumsindisi wenkqubo yakho. "Ibulala" iinkqubo ezimbi kakhulu kwaye igcina inkqubo ekuqhekekeni. Ukunqanda ukusebenzisa i-OOM-Killer ukuphelisa i-PostgreSQL, seta ku vm.overcommit_memory ixabiso 2. Oku akuqinisekisi ukuba i-OOM-Killer ayiyi kufuneka ingenelele, kodwa iya kunciphisa amathuba okunyanzela inkqubo ye-PostgreSQL ukuba iphele.
umthombo: www.habr.com
