Teeb tsa Out-Of-Memory Killer hauv Linux rau PostgreSQL

Teeb tsa Out-Of-Memory Killer hauv Linux rau PostgreSQL

Thaum nyob hauv Linux Lub database server kaw tsis tau npaj tseg, thiab yuav tsum tau txiav txim seb yog vim li cas. Tej zaum yuav muaj ntau yam ua rau. Piv txwv li, SIGSEGV - tsis ua hauj lwm vim muaj kab laum nyob rau hauv lub backend server. Tab sis qhov no tsis tshua muaj. Feem ntau, koj tsuas khiav tawm ntawm qhov chaw disk lossis nco. Yog tias koj khiav tawm ntawm qhov chaw disk, tsuas muaj ib txoj hauv kev tawm - tso chaw thiab rov pib dua cov ntaub ntawv.

Tawm-ntawm-Nco Killer

Thaum koj neeg rau zaub mov los yog cov txheej txheem tsis muaj lub cim xeeb lawm, Linux Tus Out-Of-Memory Killer muaj ob txoj kev daws teeb meem: ua rau tag nrho lub system puas tsuaj lossis xaus cov txheej txheem (daim ntawv thov) uas noj lub cim xeeb. Nws zoo dua, tau kawg, kom xaus cov txheej txheem thiab txuag OS kom tsis txhob poob. Hauv ntej, Out-Of-Memory Killer yog ib qho txheej txheem uas xaus ib daim ntawv thov kom txuag lub kernel kom tsis txhob poob. Nws txi daim ntawv thov kom OS khiav. Cia peb xub tham txog seb OOM ua haujlwm li cas thiab yuav tswj nws li cas, thiab tom qab ntawd saib seb OOM Killer txiav txim siab li cas rau cov ntawv thov twg.

Ib qho ntawm cov haujlwm tseem ceeb Linux — Faib lub cim xeeb rau cov txheej txheem thaum lawv thov nws. Feem ntau, ib qho txheej txheem lossis daim ntawv thov thov lub cim xeeb los ntawm OS tab sis tsis siv nws tag nrho. Yog tias OS faib lub cim xeeb rau txhua tus neeg uas thov nws tab sis tsis npaj siv nws, lub kaw lus yuav khiav tawm ntawm lub cim xeeb sai sai, thiab lub kaw lus yuav poob. Txhawm rau tiv thaiv qhov no, OS khaws lub cim xeeb rau ib qho txheej txheem tab sis tsis tau faib nws tiag tiag. Lub cim xeeb tsuas yog faib thaum ib qho txheej txheem tiag tiag npaj siab siv nws. Qee zaum OS tsis muaj lub cim xeeb dawb, tab sis nws faib lub cim xeeb rau ib qho txheej txheem, thiab thaum cov txheej txheem xav tau nws, OS faib nws yog tias nws ua tau. Qhov tsis zoo yog tias qee zaum OS khaws lub cim xeeb, tab sis thaum xav tau, tsis muaj lub cim xeeb dawb, ua rau lub kaw lus poob. OOM ua lub luag haujlwm tseem ceeb hauv qhov xwm txheej no, xaus cov txheej txheem kom tiv thaiv lub kernel los ntawm kev ntshai. Thaum PostgreSQL txheej txheem raug yuam kom xaus, cov lus hauv qab no tshwm sim hauv cov cav:

Out of Memory: Killed process 12345 (postgres).

Yog tias lub kaw lus tsis tshua muaj kev nco thiab tsis tuaj yeem tso tawm, lub luag haujlwm hu ua out_of_memory. Nyob rau theem no, nws tsuas muaj ib yam uas yuav tsum tau ua - ua kom tiav ib lossis ntau txheej txheem. Yuav tsum OOM-killer txiav cov txheej txheem tam sim lossis tuaj yeem tos? Pom tseeb, thaum out_of_memory raug hu, nws yog vim tos rau kev ua haujlwm I / O lossis paging rau disk. Yog li ntawd, OOM killer yuav tsum xub ua cov tshev thiab, raws li lawv, txiav txim siab tias cov txheej txheem yuav tsum raug txiav. Yog tias tag nrho cov kev txheeb xyuas hauv qab no yog qhov zoo, OOM yuav xaus qhov txheej txheem.

Txheej txheem xaiv

Thaum lub cim xeeb khiav tawm, lub luag haujlwm hu ua out_of_memory(). Nws muaj kev ua haujlwm select_bad_process(), uas tau txais kev ntsuam xyuas los ntawm kev ua haujlwm badness(). Cov txheej txheem "phem tshaj" yuav raug tsom. Muaj nuj nqi badness() xaiv cov txheej txheem raws li qee txoj cai.

  1. Lub kernel xav tau qee qhov tsawg kawg nkaus nco rau nws tus kheej.
  2. Koj yuav tsum tso tseg ntau lub cim xeeb.
  3. Tsis tas yuav txiav cov txheej txheem uas siv lub cim xeeb me me.
  4. Yam tsawg kawg nkaus yuav tsum tau ua kom tiav.
  5. Complex algorithms uas ua rau kom muaj feem ua tiav rau cov txheej txheem uas tus neeg siv nws tus kheej xav ua kom tiav.

Tom qab ua tiav tag nrho cov tshev no, OOM tshuaj xyuas cov qhab nia (oom_score). OOM assigns oom_score txhua tus txheej txheem, thiab tom qab ntawd muab tus nqi no los ntawm tus nqi nco. Cov txheej txheem nrog cov txiaj ntsig loj dua yuav poob rau tus neeg raug tsim txom OOM Killer. Cov txheej txheem cuam tshuam nrog tus neeg siv hauv paus muaj qhov qhab nia qis dua thiab tsis tshua muaj peev xwm raug yuam kom txiav tawm.

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

Cov txheej txheem Postgres ID yog 3813, yog li nyob rau hauv lwm lub plhaub nws muaj peev xwm kom tau txais cov qhab nia uas siv cov kernel parameter no. oom_score:

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

Yog tias koj tsis xav kom OOM-Killer tua cov txheej txheem txhua, muaj lwm txoj kev xaiv: oom_score_adj. Ntxiv tus nqi tsis zoo los txo qhov muaj feem ua tiav cov txheej txheem koj muaj nuj nqis.

sudo echo -100 > /proc/3813/oom_score_adj

Txhawm rau teeb tsa tus nqi oom_score_adj, teeb OOMScoreAdjust hauv qhov kev pabcuam thaiv:

[Service]
OOMScoreAdjust=-1000

Los yog siv oomprotect hauv ib pab neeg rcctl.

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

Kev quab yuam txiav tawm ntawm ib txoj kev

Thaum ib lossis ntau cov txheej txheem tau xaiv lawm, OOM-Killer hu rau txoj haujlwm oom_kill_task(). Qhov kev ua haujlwm no xa cov teeb liab txiav tawm mus rau cov txheej txheem. Thaum nco tsis txaus oom_kill() Hu rau qhov kev ua haujlwm no kom xa cov teeb liab SIGKILL rau cov txheej txheem. Ib tsab ntawv tau sau rau lub kernel cav.

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

Yuav ua li cas tswj OOM-Killer

В Linux Koj tuaj yeem qhib lossis kaw OOM-Killer (txawm hais tias qhov tom kawg tsis pom zoo). Txhawm rau qhib lossis kaw nws, siv cov parameter vm.oom-kill. Txhawm rau pab kom OOM-Killer ntawm lub sijhawm ua haujlwm, khiav cov lus txib sysctl.

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

Txhawm rau kaw OOM-Killer, qhia tus nqi 0 hauv tib lo lus txib:

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

Qhov tshwm sim ntawm cov lus txib no yuav tsis raug cawm mus ib txhis, tab sis tsuas yog txog thaum thawj reboot. Yog tias koj xav tau ntau ntxiv, ntxiv cov kab no rau hauv cov ntaub ntawv /etc/sysctl.conf:

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

Lwm txoj hauv kev los pab thiab lov tes taw yog sau qhov sib txawv panic_on_oom. Tus nqi ib txwm tuaj yeem kuaj xyuas /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Yog tias koj teeb tsa tus nqi rau 0, tom qab ntawd thaum lub cim xeeb khiav tawm, yuav tsis muaj kev ceeb toom kernel.

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

Yog tias koj teeb tsa tus nqi rau 1, tom qab ntawd thaum lub cim xeeb khiav tawm, lub ntsiav tshuaj yuav tshwm sim.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer tuaj yeem qhib thiab kaw, raws li peb tau hais lawm. Linux tej zaum yuav khaws cia ntau lub cim xeeb rau cov txheej txheem ntau dua li muaj, tab sis tsis tau faib nws tiag tiag, thiab tus cwj pwm no raug tswj hwm los ntawm kernel parameter LinuxTus variable yog tus lav ris rau qhov no. vm.overcommit_memory.

Koj tuaj yeem qhia cov txiaj ntsig hauv qab no rau nws:

0: Lub kernel nws tus kheej txiav txim siab seb puas yuav khaws cia ntau dhau ntawm lub cim xeeb. Qhov no yog tus nqi qub hauv feem ntau cov versions. Linux.
1: Lub kernel yuav nco ntsoov khaws cia ntxiv. Qhov no yog qhov txaus ntshai, vim tias lub cim xeeb yuav ploj mus, vim tias, feem ntau yuav, ib hnub cov txheej txheem yuav xav tau nws.
2: lub kernel yuav tsis khaws cia ntau dua li teev nyob rau hauv parameter overcommit_ratio.

Nrog rau qhov kev ntsuas no, koj qhia qhov feem pua ​​​​ntawm cov cim xeeb uas tau tso cai rau ntau tshaj. Yog tias tsis muaj chaw rau nws, tsis muaj lub cim xeeb raug faib, thiab qhov kev tshwj tseg yuav raug tsis lees paub. Qhov no yog qhov kev xaiv zoo tshaj plaws pom zoo rau PostgreSQL. OOM-Killer cuam tshuam los ntawm lwm lub caij - lub peev xwm sib pauv, uas yog tswj los ntawm qhov sib txawv cat /proc/sys/vm/swappiness. Cov txiaj ntsig no qhia cov kernel yuav ua li cas thiaj li tswj tau cov nplooj ntawv. Tus nqi siab dua, qhov tsawg dua yog tias OOM yuav txiav tawm cov txheej txheem, tab sis vim yog I / O kev ua haujlwm nws muaj kev cuam tshuam tsis zoo rau cov ntaub ntawv. Thiab vice versa - tus nqi qis dua, qhov ua tau zoo ntawm OOM-Killer cuam tshuam, tab sis qhov kev ua tau zoo ntawm cov ntaub ntawv kuj tseem siab dua. Tus nqi pib yog 60, tab sis yog tias tag nrho cov ntaub ntawv haum rau hauv lub cim xeeb, nws yog qhov zoo dua los teeb tsa tus nqi rau 1.

Cov txiaj ntsim tau los

Tsis txhob cia tus "killer" hauv OOM-Killer ntshai koj. Hauv qhov no, tus neeg tua neeg yuav yog tus cawm seej ntawm koj lub cev. Nws "tua" cov txheej txheem phem tshaj plaws thiab txuag lub kaw lus los ntawm kev sib tsoo. Txhawm rau zam kom tsis txhob siv OOM-Killer kom xaus PostgreSQL, teeb tsa rau vm.overcommit_memory tus nqi 2. Qhov no tsis tau lees paub tias OOM-Killer yuav tsis muaj kev cuam tshuam, tab sis nws yuav txo qhov kev pheej hmoo ntawm kev yuam cov txheej txheem PostgreSQL kom xaus.

Tau qhov twg los: www.hab.com

Yuav txhim khu kev qha hosting rau cov chaw nrog DDoS tiv thaiv, VPS VDS servers 🔥 Yuav lub vev xaib hosting txhim khu kev qha nrog kev tiv thaiv DDoS, VPS VDS servers | ProHoster