Uma iseva yesizindalwazi iyeka ngokungalindelekile ku-Linux, udinga ukuthola isizathu. Kungase kube nezizathu eziningana. Ngokwesibonelo, I-SIGSEGV - ukwehluleka ngenxa yesiphazamisi kuseva engemuva. Kodwa lokhu akuvamile. Ngokuvamile, uvele uphelelwe isikhala sediski noma inkumbulo. Uma uphelelwa isikhala sediski, kunendlela eyodwa kuphela yokuphuma - khulula isikhala bese uqala kabusha isizindalwazi.
Umbulali Ongaphandle Kwenkumbulo
Uma iseva noma inqubo iphelelwa yinkumbulo, i-Linux inikeza izixazululo ezi-2: phahlazeka isistimu yonke noma nqamula inqubo (uhlelo lokusebenza) edla inkumbulo. Kungcono, vele, ukumisa inqubo futhi usindise i-OS ekushayekeni. Kafushane, I-Out-Of-Memory Killer iyinqubo ebulala uhlelo lokusebenza ukusindisa i-kernel ekuphahlazekeni. Idela uhlelo lokusebenza ukugcina i-OS isebenza. Ake siqale sixoxe ngokuthi i-OOM isebenza kanjani nokuthi ungayilawula kanjani, bese sibona ukuthi u-OOM Killer unquma kanjani ukuthi yiluphi uhlelo lokusebenza okufanele luqedwe.
Omunye wemisebenzi esemqoka ye-Linux ukwabela inkumbulo ezinqubweni lapho beyicela. Ngokuvamile, inqubo noma uhlelo lokusebenza lucela inkumbulo ku-OS, kodwa aluyisebenzisi ngokugcwele. Uma i-OS inikeza inkumbulo kuwo wonke umuntu oyicelayo kodwa engenazo izinhlelo zokuyisebenzisa, maduze nje inkumbulo izophela futhi uhlelo luzohluleka. Ukuze ugweme lokhu, i-OS igcina inkumbulo yenqubo, kodwa empeleni ayiyikhiphi. Imemori inikezwa kuphela uma inqubo izoyisebenzisa. Kwenzeka ukuthi i-OS ayinayo inkumbulo yamahhala, kodwa inika inkumbulo kwinqubo, futhi uma inqubo iyidinga, i-OS iyaba uma ingakwazi. Okubi ukuthi ngezinye izikhathi i-OS igcina inkumbulo, kodwa ngesikhathi esifanele ayikho inkumbulo yamahhala, futhi uhlelo luyaphahlazeka. I-OOM idlala indima ebalulekile kulesi simo futhi inqamula izinqubo zokuvimbela uhlamvu ukuba lungatatazeli. Lapho inqubo ye-PostgreSQL iphoqeleka ukuthi iqedwe, umlayezo uvela kulogi:
Out of Memory: Killed process 12345 (postgres).
Uma uhlelo lunenkumbulo encane futhi lungakwazi ukukhululeka, umsebenzi ubizwa out_of_memory
. Kulesi sigaba, unento eyodwa kuphela esele okufanele ayenze - ukuqedela inqubo eyodwa noma ngaphezulu. Ingabe i-OOM-killer kufanele inqamule inqubo ngokushesha noma ingalinda? Ngokusobala, uma kubizwa i-out_of_memory, kungenxa yokulinda ukusebenza kwe-I/O noma ukuphegena kudiski. Ngakho-ke, umbulali we-OOM kufanele aqale enze amasheke futhi, ngokusekelwe kuwo, anqume ukuthi inqubo idinga ukunqanyulwa. Uma wonke amasheke angezansi enza kahle, i-OOM izonqamula inqubo.
Ukukhetha inqubo
Uma imemori iphela, umsebenzi uyabizwa out_of_memory()
. Inomsebenzi select_bad_process()
, ethola ukuhlola emsebenzini badness()
. Inqubo "embi kakhulu" izoqondiswa. Umsebenzi badness()
ukhetha inqubo ngokwemithetho ethile.
- I-kernel idinga ubuncane bememori ngokwayo.
- Udinga ukukhulula inkumbulo eningi.
- Asikho isidingo sokunqamula izinqubo ezisebenzisa inkumbulo encane.
- Izinqubo ezincane zidinga ukuqedwa.
- Ama-algorithms ayinkimbinkimbi akhulisa amathuba okuqeda lezo zinqubo umsebenzisi afuna ukuziqedela.
Ngemva kokuqeda konke lokhu kuhlola, i-OOM ihlola amaphuzu (oom_score
). I-OOM iyaqoka oom_score
inqubo ngayinye, bese iphindaphinda leli nani ngenani lememori. Izinqubo ezinamavelu amakhulu kungenzeka zibe yisisulu se-OOM Killer. Izinqubo ezihlotshaniswa nomsebenzisi wempande zinamaphuzu aphansi futhi mancane amathuba okuthi ziphoqeleke ukuthi ziqedwe.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)
I-ID yenqubo ye-Postgres ingu-3813, ngakho kwelinye igobolondo kungenzeka ukuthi uthole amaphuzu usebenzisa le parameter ye-kernel. oom_score
:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2
Uma ungafuni ukuthi i-OOM-Killer ibulale inqubo nhlobo, kukhona enye inketho ye-kernel: oom_score_adj
. Engeza inani elikhulu elinegethivu ukuze unciphise amathuba okuqeda inqubo oyithandayo.
sudo echo -100 > /proc/3813/oom_score_adj
Ukusetha inani oom_score_adj
, setha i-OOMScoreAdjust kubhlokhi yesevisi:
[Service]
OOMScoreAdjust=-1000
Noma sebenzisa oomprotect
eqenjini rcctl
.
rcctl set <i>servicename</i> oomprotect -1000
Phoqa ukunqanyulwa kwenqubo
Uma inqubo eyodwa noma eziningi sezikhethiwe, i-OOM-Killer ibiza umsebenzi oom_kill_task()
. Lo msebenzi uthumela isignali yokunqamula inqubo. Uma kwenzeka ukuntuleka kwenkumbulo oom_kill()
Ishayela lo msebenzi ukuthumela isignali ye-SIGKILL enqubeni. Umlayezo ubhalwa ku-kernel log.
Out of Memory: Killed process [pid] [name].
Ungayilawula kanjani i-OOM-Killer
Ku-Linux, unganika amandla noma ukhubaze i-OOM-Killer (yize lena yokugcina inganconywa). Ukuze unike amandla noma ukhubaze sebenzisa ipharamitha vm.oom-kill
. Ukuze unike amandla i-OOM-Killer ngesikhathi sokusebenza, sebenzisa umyalo sysctl
.
sudo -s sysctl -w vm.oom-kill = 1
Ukuze ukhubaze i-OOM-Killer, cacisa inani elingu-0 kumyalo ofanayo:
sudo -s sysctl -w vm.oom-kill = 0
Umphumela walo myalo ngeke ulondolozwe unomphela, kodwa kuze kube yilapho uqala kabusha okokuqala. Uma udinga ukuphikelela okwengeziwe, engeza lo mugqa kufayela /etc/sysctl.conf
:
echo vm.oom-kill = 1 >>/etc/sysctl.conf
Enye indlela yokunika amandla nokukhubaza ukubhala okuguquguqukayo panic_on_oom
. Inani lingahlolwa njalo /proc
.
$ cat /proc/sys/vm/panic_on_oom
0
Uma usetha inani libe ngu-0, lapho inkumbulo iphela, ngeke kube khona ukwethuka kwe-kernel.
$ echo 0 > /proc/sys/vm/panic_on_oom
Uma usetha inani ku-1, lapho inkumbulo iphela, uvalo lwe-kernel luzokwenzeka.
echo 1 > /proc/sys/vm/panic_on_oom
I-OOM-Killer ayikwazi ukuvulwa nokucishwa kuphela. Sesivele sishilo ukuthi i-Linux ingagcina inkumbulo eningi yezinqubo kunaleyo etholakalayo ngaphandle kokuyabela, futhi lokhu kuziphatha kulawulwa ipharamitha ye-Linux kernel. Okuguquguqukayo kunesibopho salokhu vm.overcommit_memory
.
Ungawacacisela amanani alandelayo:
0: I-kernel ngokwayo inquma ukuthi igcine inkumbulo eningi kakhulu. Lokhu okuzenzakalelayo kuzinguqulo eziningi ze-Linux.
1: I-kernel izohlala igcina inkumbulo eyengeziwe. Lokhu kuyingozi, ngoba inkumbulo ingase iphele, ngoba, cishe, ngolunye usuku izinqubo zizoyidinga.
2: i-kernel ngeke igcine inkumbulo engaphezu kwaleyo eshiwo kupharamitha overcommit_ratio
.
Ngale pharamitha, ucacisa iphesenti lememori elivunyelwe ukuthi ligcinwe kakhulu. Uma ingekho indawo yakho, ayikho inkumbulo enikeziwe, futhi ukubhukha kuzonqatshelwa. Lena inketho ephephe kunazo zonke enconyelwe i-PostgreSQL. I-OOM-Killer ithintwa enye into - amandla okushintshanisa, alawulwa ukuguquguquka cat /proc/sys/vm/swappiness
. Lawa manani atshela i-kernel ukuthi iphathwa kanjani ukupeyisha. Uma inani liphezulu, mancane amathuba okuthi i-OOM inqamule inqubo, kodwa ngenxa yemisebenzi ye-I/O inomthelela omubi kusizindalwazi. Futhi okuphambene nalokho - lapho inani eliphansi liphansi, ayanda amathuba okungenelela kwe-OOM-Killer, kodwa ukusebenza kwesizindalwazi nakho kuphezulu. Inani elizenzakalelayo lingu-60, kodwa uma yonke imininingwane ilingana enkumbulweni, kungcono ukusetha inani libe ngu-1.
Imiphumela
Ungavumeli "umbulali" ku-OOM-Killer akwesabise. Kulokhu, umbulali uzoba umsindisi wesistimu yakho. "Ibulala" izinqubo ezimbi kakhulu futhi isindisa uhlelo ekushayekeni. Ukuze ugweme ukusebenzisa i-OOM-Killer ukunqamula i-PostgreSQL, setha ukuthi vm.overcommit_memory
inani 2. Lokhu akuqinisekisi ukuthi i-OOM-Killer ngeke kudingeke ingenele, kodwa kuzonciphisa amathuba okuphoqa inqubo ye-PostgreSQL ukuthi inqanyulwe.
Source: www.habr.com