Pag-setup sa Out-Of-Memory Killer Linux para sa PostgreSQL

Pag-setup sa Out-Of-Memory Killer Linux para sa PostgreSQL

Kon naa sa Linux Ang database server matapos nga wala damha, ug kinahanglan nga mahibal-an ang hinungdan. Mahimong adunay daghang mga hinungdan. Pananglitan, SIGSEGV — kapakyasan tungod sa usa ka bug sa backend server. Apan kini talagsaon. Kasagaran, nahutdan ka lang sa disk space o memorya. Kung nahutdan ka sa wanang sa disk, adunay usa ra ka paagi nga makagawas - libre nga wanang ug i-restart ang database.

Out-Of-Memory Killer

Kung ikaw server o mahurot ang memorya sa proseso, Linux Ang Out-Of-Memory Killer nagtanyag og duha ka solusyon: pag-crash sa tibuok sistema o pagtapos sa proseso (aplikasyon) nga nagkaon sa memorya. Mas maayo, siyempre, nga tapuson ang proseso ug luwason ang OS gikan sa pag-crash. Sa laktod nga pagkasulti, ang Out-Of-Memory Killer usa ka proseso nga nagtapos sa usa ka aplikasyon aron maluwas ang kernel gikan sa pag-crash. Gisakripisyo niini ang aplikasyon aron magpadayon ang pagdagan sa OS. Atong hisgutan una kung giunsa paglihok ang OOM ug kung giunsa kini pagkontrol, ug dayon tan-awon kung giunsa sa OOM Killer pagdesisyon kung unsang mga aplikasyon ang tapuson.

Usa sa mga nag-unang buluhaton Linux — Pag-allocate og memory sa mga proseso kon ilang hangyoon kini. Kasagaran, ang usa ka proseso o aplikasyon mangayo og memory gikan sa OS apan dili kini hingpit nga gamiton. Kon ang OS mo-allocate og memory sa tanan nga mo-allocate niini apan wala magplano nga gamiton kini, ang sistema dali nga mahutdan og memory, ug ang sistema ma-crash. Aron malikayan kini, ang OS mo-reserve og memory para sa usa ka proseso apan dili gyud kini i-allocate. Ang memory i-allocate lang kon ang usa ka proseso aktuwal nga mo-design niini. Usahay ang OS walay free memory, apan mo-allocate kini og memory sa usa ka proseso, ug kon gikinahanglan kini sa proseso, ang OS mo-allocate niini kon mahimo. Ang disbentaha mao nga usahay ang OS mo-reserve og memory, apan kon gikinahanglan, walay free memory, nga hinungdan sa system crash. Ang OOM adunay importanteng papel niini nga senaryo, nga mo-terminate sa mga proseso aron malikayan ang pagka-panic sa kernel. Kon ang PostgreSQL process pugson nga tapuson, ang mosunod nga mensahe makita sa log:

Out of Memory: Killed process 12345 (postgres).

Kung ang sistema ubos sa memorya ug dili kini mapagawas, ang function gitawag out_of_memory. Niini nga yugto, usa na lang ka butang ang nahabilin - pagkompleto sa usa o daghang mga proseso. Kinahanglan ba nga tapuson dayon sa OOM-killer ang proseso o makahulat ba kini? Dayag nga, kung gitawag ang out_of_memory, kini tungod sa paghulat sa usa ka operasyon sa I/O o paging sa disk. Busa, ang mamumuno sa OOM kinahanglan una nga maghimo mga pagsusi ug, base sa kanila, magdesisyon nga ang proseso kinahanglan nga tapuson. Kung ang tanan nga mga pagsusi sa ubos positibo, ang OOM mohunong sa proseso.

Pagpili sa proseso

Kung mahurot ang memorya, ang function gitawag out_of_memory(). Kini adunay function select_bad_process(), nga makadawat og ebalwasyon gikan sa function badness(). Ang "labing daotan" nga proseso ipunting. Kalihokan badness() mipili sa usa ka proseso sumala sa pipila ka mga lagda.

  1. Ang kernel nagkinahanglan og pipila ka minimum nga memorya alang sa iyang kaugalingon.
  2. Kinahanglan nimo nga buhian ang daghang memorya.
  3. Dili kinahanglan nga tapuson ang mga proseso nga naggamit gamay nga memorya.
  4. Minimum nga mga proseso kinahanglan nga makompleto.
  5. Ang mga komplikadong algorithm nga nagdugang sa mga kahigayonan sa pagkompleto alang sa mga proseso nga gusto sa user nga makompleto.

Pagkahuman sa tanan niini nga mga pagsusi, gisusi sa OOM ang marka (oom_score). Gitudlo sa OOM oom_score matag proseso, ug dayon padaghanon kini nga kantidad sa gidaghanon sa memorya. Ang mga proseso nga adunay dagkong kantidad mas lagmit nga mabiktima sa OOM Killer. Ang mga proseso nga may kalabutan sa gamut nga tiggamit adunay mas ubos nga marka ug dili kaayo mapugos sa pagtapos.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

Ang proseso sa Postgres ID mao ang 3813, mao nga sa laing kabhang posible nga makuha ang iskor gamit kini nga kernel parameter oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Kung dili nimo gusto nga patyon sa OOM-Killer ang proseso, adunay lain nga kapilian sa kernel: oom_score_adj. Pagdugang usa ka dako nga negatibo nga kantidad aron makunhuran ang mga kahigayonan sa pagkompleto sa usa ka proseso nga imong gipabilhan.

sudo echo -100 > /proc/3813/oom_score_adj

Sa pagtakda og bili oom_score_adj, ibutang ang OOMScoreAdjust sa service block:

[Service]
OOMScoreAdjust=-1000

O gamiton oomprotect sa usa ka team rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Puwersa ang pagtapos sa usa ka proseso

Kung ang usa o daghan pa nga mga proseso napili na, ang OOM-Killer nagtawag sa function oom_kill_task(). Kini nga function nagpadala usa ka signal sa pagtapos sa proseso. Sa kaso sa kakulang sa memorya oom_kill() Gitawag kini nga function aron magpadala usa ka signal sa SIGKILL sa proseso. Usa ka mensahe ang gisulat sa kernel log.

Out of Memory: Killed process [pid] [name].

Giunsa makontrol ang OOM-Killer

В Linux Mahimo nimong i-enable o i-disable ang OOM-Killer (bisan kung dili girekomenda ang ulahi). Aron i-enable o i-disable kini, gamita ang parameter vm.oom-kill. Aron mahimo ang OOM-Killer sa runtime, padagana ang command sysctl.

sudo -s sysctl -w vm.oom-kill = 1

Aron ma-disable ang OOM-Killer, ipiho ang kantidad nga 0 sa parehas nga mando:

sudo -s sysctl -w vm.oom-kill = 0

Ang resulta niini nga sugo dili maluwas sa walay katapusan, apan lamang hangtud sa unang reboot. Kung kinahanglan nimo ang dugang nga pagpadayon, idugang kini nga linya sa file /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

Ang laing paagi sa pag-enable ug pag-disable mao ang pagsulat og variable panic_on_oom. Ang bili mahimong masusi kanunay /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Kung imong gibutang ang kantidad sa 0, unya kung mahurot ang memorya, wala’y kernel panic.

$ echo 0 > /proc/sys/vm/panic_on_oom

Kung imong gibutang ang bili sa 1, unya kung mahurot na ang memorya, mahitabo ang usa ka kernel panic.

echo 1 > /proc/sys/vm/panic_on_oom

Mahimong i-on ug i-off ang OOM-Killer, sama sa nahisgotan na nato. Linux mahimong magreserba og dugang memorya para sa mga proseso kay sa anaa, apan dili gyud kini igahin, ug kini nga pamatasan gikontrolar sa usa ka kernel parameter LinuxAng variable mao ang responsable niini. vm.overcommit_memory.

Mahimo nimong ipiho ang mosunod nga mga kantidad alang niini:

0: Ang kernel mismo ang modesisyon kung magreserba ba og sobra nga memorya. Kini ang default nga kantidad sa kadaghanan sa mga bersyon. Linux.
1: Ang kernel kanunay nga magreserba ug dugang nga memorya. Kini peligroso, tungod kay ang panumduman mahimong mahurot, tungod kay, lagmit, usa ka adlaw ang mga proseso magkinahanglan niini.
2: ang kernel dili magreserba ug dugang nga memorya kay sa gitakda sa parameter overcommit_ratio.

Uban niini nga parameter, imong gitakda ang porsyento sa panumduman nga gitugotan nga ma-over-reserve. Kung wala’y lugar alang niini, wala’y panumduman nga gigahin, ug ang reserbasyon ipanghimakak. Kini ang labing luwas nga kapilian nga girekomenda alang sa PostgreSQL. Ang OOM-Killer naapektuhan sa laing elemento - ang kapabilidad sa pagbayloay, nga kontrolado sa variable cat /proc/sys/vm/swappiness. Kini nga mga kantidad nagsulti sa kernel kung giunsa pagdumala ang paging. Kon mas taas ang bili, mas gamay ang posibilidad nga ang OOM mohunong sa proseso, apan tungod sa mga operasyon sa I/O kini adunay negatibong epekto sa database. Ug vice versa - mas ubos ang bili, mas taas ang posibilidad sa OOM-Killer intervention, apan ang performance sa database mas taas usab. Ang default nga kantidad mao ang 60, apan kung ang tibuuk nga database mohaum sa memorya, mas maayo nga ibutang ang kantidad sa 1.

Mga resulta

Ayaw itugot nga ang "killer" sa OOM-Killer mahadlok kanimo. Sa kini nga kaso, ang mamumuno mao ang manluluwas sa imong sistema. Kini "mopatay" sa pinakagrabe nga mga proseso ug makaluwas sa sistema gikan sa pagkahagsa. Aron malikayan ang paggamit sa OOM-Killer aron tapuson ang PostgreSQL, itakda sa vm.overcommit_memory bili 2. Dili kini garantiya nga ang OOM-Killer dili kinahanglan nga mangilabot, apan kini makapakunhod sa kalagmitan sa pagpugos sa proseso sa PostgreSQL sa pagtapos.

Source: www.habr.com

Pagpalit kasaligan nga pag-host alang sa mga site nga adunay proteksyon sa DDoS, mga server sa VPS VDS 🔥 Pagpalit og kasaligang website hosting nga adunay proteksyon sa DDoS, VPS VDS servers | ProHoster