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

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

Thaum lub database server tawm ntawm qhov kev npaj txhij txog hauv Linux, koj yuav tsum nrhiav qhov laj thawj. Tej zaum yuav muaj ob peb yam. 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 lub server lossis cov txheej txheem khiav tawm ntawm lub cim xeeb, Linux muaj 2 txoj kev daws teeb meem: tsoo tag nrho cov kab ke lossis txiav tawm cov txheej txheem (daim ntawv thov) uas noj lub cim xeeb. Nws yog qhov zoo dua, tau kawg, txhawm rau txiav cov txheej txheem thiab txuag OS los ntawm kev sib tsoo. Hauv cov ntsiab lus, Out-Of-Memory Killer yog txheej txheem uas tua cov ntawv thov kom txuag lub ntsiav los ntawm kev poob. Nws txis daim ntawv thov kom lub OS khiav. Cia peb pib tham txog yuav ua li cas OOM ua haujlwm thiab tswj nws li cas, thiab tom qab ntawd saib seb OOM Killer txiav txim siab daim ntawv thov twg los txiav tawm.

Ib lub luag haujlwm tseem ceeb ntawm Linux yog faib lub cim xeeb rau cov txheej txheem thaum lawv thov rau nws. Feem ntau, cov txheej txheem lossis daim ntawv thov thov nco los ntawm OS, tab sis tsis siv nws tag nrho. Yog tias OS muab lub cim xeeb rau txhua tus neeg thov rau nws tab sis tsis muaj kev npaj siv nws, sai sai lub cim xeeb yuav ploj mus thiab lub kaw lus yuav ua tsis tiav. Txhawm rau zam qhov no, OS khaws cia lub cim xeeb rau cov txheej txheem, tab sis tsis tso tawm tiag tiag. Nco tau tsuas yog thaum tus txheej txheem yuav siv nws. Nws tshwm sim tias OS tsis muaj lub cim xeeb pub dawb, tab sis nws muab lub cim xeeb rau cov txheej txheem, thiab thaum cov txheej txheem xav tau, OS faib nws yog tias nws ua tau. Qhov tsis zoo yog tias qee zaum OS khaws cia lub cim xeeb, tab sis lub sijhawm yog tsis muaj lub cim xeeb dawb, thiab lub kaw lus poob. OOM ua lub luag haujlwm tseem ceeb hauv qhov xwm txheej no thiab tshem tawm cov txheej txheem los tiv thaiv cov ntsiav los ntawm kev ntshai. Thaum cov txheej txheem PostgreSQL raug yuam kom xaus, cov lus tshwm hauv lub 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

Ntawm Linux, koj tuaj yeem pab lossis lov tes taw OOM-Killer (txawm tias tom kawg tsis pom zoo). Txhawm rau qhib lossis kaw siv qhov 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 tsis tuaj yeem qhib thiab tawm xwb. Peb twb tau hais tias Linux tuaj yeem khaws cia ntau lub cim xeeb rau cov txheej txheem ntau dua li muaj yam tsis muaj kev faib tawm tiag tiag, thiab tus cwj pwm no tau tswj hwm los ntawm Linux ntsiav qhov ntsuas. Qhov sib txawv yog lub luag haujlwm 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 lawm. Qhov no yog lub neej ntawd ntawm feem ntau versions ntawm 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

Ntxiv ib saib