Xa iseva yedatha iyeka ngokungalindelekanga kwiLinux, kufuneka ufumane isizathu. Kusenokubakho 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 umncedisi okanye inkqubo iphelelwa yinkumbulo, iLinux inikezela ngezisombululo ezi-2: ingqube yonke inkqubo okanye uphelise inkqubo (isicelo) etya inkumbulo. Kungcono, ewe, ukuphelisa inkqubo kwaye ugcine i-OS ekuqhekekeni. Ngamafutshane, i-Of-Of-Memory Killer yinkqubo ebulala isicelo sokugcina i-kernel ekuweni. Incama isicelo ukugcina i-OS isebenza. Masiqale sixoxe ngendlela i-OOM esebenza ngayo kunye nendlela yokulawula, kwaye emva koko sibone indlela u-OOM Killer agqiba ngayo ukuba sesiphi isicelo emasipheliswe.
Omnye wemisebenzi ephambili yeLinux kukwabela imemori kwiinkqubo xa beyicela. Ngokuqhelekileyo, inkqubo okanye isicelo sicela imemori kwi-OS, kodwa ayisebenzisi ngokupheleleyo. Ukuba i-OS inika inkumbulo kuye wonke umntu oyicelayo kodwa engenazicwangciso zokuyisebenzisa, kungekudala imemori iya kuphelelwa kwaye inkqubo iya kusilela. Ukunqanda oku, i-OS igcina imemori yenkqubo, kodwa ayiyikhuphi ngokwenene. Imemori yabelwe kuphela xa inkqubo iza kuyisebenzisa ngokwenene. Kwenzeka ukuba i-OS ayinayo imemori yamahhala, kodwa inika imemori kwinkqubo, kwaye xa inkqubo ifuna, i-OS iyaba ukuba iyakwazi. I-downside kukuba ngamanye amaxesha i-OS igcina imemori, kodwa ngexesha elifanelekileyo akukho memori yamahhala, kwaye inkqubo iyawa. I-OOM idlala indima ebalulekileyo kule meko kwaye iphelisa iinkqubo zokuthintela i-kernel ekuphakuzeleni. Xa inkqubo yePostgreSQL inyanzeliswa ukuba iyeke, umyalezo 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
2
Ukuba 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_adj
Ukuseta ixabiso oom_score_adj
, seta i-OOMScoreAdjust kwibhloko yenkonzo:
[Service]
OOMScoreAdjust=-1000
Okanye sebenzisa oomprotect
kwiqela rcctl
.
rcctl set <i>servicename</i> oomprotect -1000
Nyanzela 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
Kwi-Linux, unokwenza okanye uvale i-OOM-Killer (nangona le yokugqibela ingakhuthazwa). Ukwenza okanye ukuvala sebenzisa iparamitha vm.oom-kill
. Ukwenza i-OOM-Killer ngexesha lokusebenza, sebenzisa umyalelo sysctl
.
sudo -s sysctl -w vm.oom-kill = 1
Ukuvala i-OOM-Killer, khankanya ixabiso elingu-0 kumyalelo ofanayo:
sudo -s sysctl -w vm.oom-kill = 0
Isiphumo 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.conf
Enye indlela yokwenza kunye nokuvala kukubhala inguqu panic_on_oom
. Ixabiso lingasoloko likhangelwa /proc
.
$ cat /proc/sys/vm/panic_on_oom
0
Ukuba umisela ixabiso ku-0, ngoko xa inkumbulo iphelile, akusayi kubakho panic ye-kernel.
$ echo 0 > /proc/sys/vm/panic_on_oom
Ukuba ubeka ixabiso ku-1, ngoko xa imemori iphelile, i-kernel panic iya kwenzeka.
echo 1 > /proc/sys/vm/panic_on_oom
I-OOM-Killer ayinakuvulwa kwaye icinywe kuphela. Sele sitshilo ukuba iLinux inokugcinela inkumbulo eninzi yeenkqubo kunekhoyo ngaphandle kokuyabela, kwaye oku kuziphatha kulawulwa yiLinux kernel parameter. I-variable inoxanduva loku vm.overcommit_memory
.
Ungayichaza la maxabiso alandelayo:
0: I-kernel ngokwayo ithatha isigqibo sokuba igcine imemori eninzi kakhulu. Oku kusisiseko kwiinguqulelo ezininzi ze 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