Ukumisela uMbulali weMemori eNgaphandle kwiLinux yePostgreSQL

Ukumisela uMbulali weMemori eNgaphandle kwiLinux yePostgreSQL

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.

  1. I-kernel idinga ubuncinci bememori ngokwayo.
  2. Kufuneka ukhulule imemori eninzi.
  3. Akukho mfuneko yokuphelisa iinkqubo ezisebenzisa imemori encinci.
  4. Ubuncinane beenkqubo kufuneka bugqitywe.
  5. 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

Yongeza izimvo