Ukusetha i-Out-Of-Memory Killer ku Linux ye-PostgreSQL

Ukusetha i-Out-Of-Memory Killer ku Linux ye-PostgreSQL

Uma ungenile Linux сервер базы данных непредвиденно завершает работу, нужно найти причину. Причин может быть несколько. Например, 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 wena iseva или процесса заканчивается память, Linux предлагает 2 пути решения: обрушить всю систему или завершить процесс (приложение), который съедает память. Лучше, конечно, завершить процесс и спасти ОС от аварийного завершения. В двух словах, Out-Of-Memory Killer — это процесс, который завершает приложение, чтобы спасти ядро от сбоя. Он жертвует приложением, чтобы сохранить работу ОС. Давайте сначала обсудим, как работает OOM и как его контролировать, а потом посмотрим, как OOM Killer решает, какое приложение завершить.

Одна из главных задач Linux — выделять память процессам, когда они ее просят. Обычно процесс или приложение запрашивают у ОС память, а сами используют ее не полностью. Если ОС будет выдавать память всем, кто ее просит, но не планирует использовать, очень скоро память закончится, и система откажет. Чтобы этого избежать, ОС резервирует память за процессом, но фактически не выдает ее. Память выделяется, только когда процесс действительно собирается ее использовать. Случается, что у ОС нет свободной памяти, но она закрепляет память за процессом, и когда процессу она нужна, ОС выделяет ее, если может. Минус в том, что иногда ОС резервирует память, но в нужный момент свободной памяти нет, и происходит сбой системы. OOM играет важную роль в этом сценарии и завершает процессы, чтобы уберечь ядро от паники. Когда принудительно завершается процесс PostgreSQL, в логе появляется сообщение:

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

В Linux можно включать и отключать OOM-Killer (хотя последнее не рекомендуется). Для включения и отключения используйте параметр 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

OOM-Killer можно не только включать и выключать. Мы уже говорили, что Linux может зарезервировать для процессов больше памяти, чем есть, но не выделять ее по факту, и этим поведением управляет параметр ядра Linux. За это отвечает переменная vm.overcommit_memory.

Ungawacacisela amanani alandelayo:

0: ядро само решает, стоит ли резервировать слишком много памяти. Это значение по умолчанию в большинстве версий 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

Thenga ukusingathwa okuthembekile kwamasayithi anokuvikelwa kwe-DDoS, amaseva e-VPS VDS 🔥 Thenga ukusingathwa kwewebhusayithi okuthembekile ngokuvikelwa kwe-DDoS, amaseva e-VPS VDS | ProHoster