Pag-set up sa Out-Of-Memory Killer sa Linux para sa PostgreSQL

Pag-set up sa Out-Of-Memory Killer sa Linux para sa PostgreSQL

Kung ang usa ka database server mohunong sa wala damha sa Linux, kinahanglan nimo pangitaon 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 ang usa ka server o proseso nahutdan sa memorya, ang Linux nagtanyag sa 2 nga mga solusyon: pag-crash sa tibuuk nga sistema o paghunong sa proseso (aplikasyon) nga mokaon sa memorya. Mas maayo, siyempre, nga tapuson ang proseso ug i-save ang OS gikan sa pagkahagsa. Sa laktud nga pagkasulti, ang Out-Of-Memory Killer usa ka proseso nga nagpatay sa usa ka aplikasyon aron maluwas ang kernel gikan sa pagkahagsa. Gisakripisyo niini ang aplikasyon aron mapadayon ang pagdagan sa OS. Atong hisgotan una kung giunsa ang pagtrabaho sa OOM ug kung giunsa kini pagkontrol, ug dayon tan-awon kung giunsa ang pagdesisyon sa OOM Killer kung unsang aplikasyon ang tapuson.

Usa sa mga nag-unang tahas sa Linux mao ang paggahin sa memorya sa mga proseso kung mangayo sila niini. Kasagaran, ang usa ka proseso o aplikasyon nangayo og memorya gikan sa OS, apan dili kini hingpit nga gigamit. Kung ang OS naghatag ug memorya sa tanan nga nangayo niini apan walay plano nga gamiton kini, sa dili madugay mahurot ang memorya ug mapakyas ang sistema. Aron malikayan kini, ang OS nagreserba sa panumduman alang sa proseso, apan dili gyud kini buhian. Ang memorya gigahin lamang kung ang usa ka proseso aktuwal nga mogamit niini. Nahitabo nga ang OS walay libre nga memorya, apan kini nag-assign sa memorya sa usa ka proseso, ug kung gikinahanglan kini sa usa ka proseso, ang OS naggahin niini kung mahimo. Ang downside mao nga usahay ang OS nagreserba sa memorya, apan sa husto nga panahon walay libre nga memorya, ug ang sistema nahagsa. Ang OOM adunay hinungdanon nga papel sa kini nga senaryo ug gitapos ang mga proseso aron mapugngan ang kernel gikan sa pagkataranta. Kung ang usa ka proseso sa PostgreSQL napugos sa pagtapos, usa ka mensahe ang 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

Sa Linux, mahimo nimong ma-enable o ma-disable ang OOM-Killer (bisan kung dili girekomenda ang naulahi). Aron ma-enable o ma-disable gamit 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

Ang OOM-Killer dili lang ma-on ug off. Nakaingon na kami nga ang Linux mahimong magreserba ug daghang memorya alang sa mga proseso kaysa magamit nga wala gyud kini gigahin, ug kini nga pamatasan gikontrol sa usa ka parameter sa kernel sa Linux. Ang variable maoy responsable niini vm.overcommit_memory.

Mahimo nimong ipiho ang mosunod nga mga kantidad alang niini:

0: Ang kernel mismo ang magdesisyon kung magreserba ba og daghang memorya. Kini ang default sa kadaghanan nga mga bersyon sa 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

Idugang sa usa ka comment