Ukusetha I-Off-Of-Memory Killer ku-Linux ye-PostgreSQL

Ukusetha I-Off-Of-Memory Killer ku-Linux ye-PostgreSQL

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.

  1. I-kernel idinga ubuncane bememori ngokwayo.
  2. Udinga ukukhulula inkumbulo eningi.
  3. Asikho isidingo sokunqamula izinqubo ezisebenzisa inkumbulo encane.
  4. Izinqubo ezincane zidinga ukuqedwa.
  5. 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

Engeza amazwana