Kumisikidza Out-Of-Memory Killer muLinux yePostgreSQL

Kumisikidza Out-Of-Memory Killer muLinux yePostgreSQL

Kana sevha yedatabase inosiya zvisingatarisirwi muLinux, unofanirwa kuwana chikonzero. Panogona kuva nezvikonzero zvakawanda. Semuyenzaniso, SIGSEGV -kutadza nekuda kwebug mubackend server. Asi izvi hazviwanzoitiki. Kazhinji, iwe unongopererwa nedhisiki nzvimbo kana ndangariro. Kana iwe ukapera dhisiki nzvimbo, pane imwe chete nzira yekubuda - kusunungura nzvimbo uye tangazve dhatabhesi.

Out-Of-Memory Killer

Kana sevha kana maitiro apera mundangariro, Linux inopa 2 mhinduro: kurovera sisitimu yese kana kumisa maitiro (application) iri kudya ndangariro. Zviri nani, hongu, kumisa maitiro uye kuchengetedza OS kubva pakuparara. Muchidimbu, Out-Of-Memory Killer inzira inouraya application kuchengetedza kernel kubva pakudonha. Inopira iyo application kuchengetedza OS ichimhanya. Ngatitangei takurukura kuti OOM inoshanda sei uye kuti tingaidzora sei, tozoona kuti OOM Killer inosarudza kuti ndeipi application yekumisa.

Rimwe remabasa makuru eLinux nderekugovera ndangariro kumaitiro kana vachinge vakumbira. Kazhinji, maitiro kana application inokumbira ndangariro kubva kuOS, asi haishandise zvizere. Kana iyo OS ikapa ndangariro kune wese anoibvunza asi asina hurongwa hwekuishandisa, munguva pfupi ndangariro ichapera uye sisitimu inotadza. Kuti udzivise izvi, iyo OS inochengeta ndangariro yemaitiro, asi hainyatso kuiburitsa. Memory inopihwa chete kana maitiro achizoishandisa. Izvo zvinoitika kuti OS haina ndangariro yemahara, asi inopa ndangariro kune imwe nzira, uye kana chirongwa ichichida, iyo OS inogovera iyo kana ichikwanisa. Izvo zvakaderera ndezvekuti dzimwe nguva OS inochengeta ndangariro, asi panguva chaiyo hapana yemahara ndangariro, uye system inopunzika. OOM inoita basa rakakosha mune iyi mamiriro uye inomisa maitiro ekudzivirira kernel kubva kuvhunduka. Kana chirongwa chePostgreSQL chikamanikidzwa kumisa, meseji inoonekwa murogi:

Out of Memory: Killed process 12345 (postgres).

Kana iyo system yakaderera pandangariro uye haigone kusunungurwa, basa racho rinodanwa out_of_memory. Panguva ino, ane chinhu chimwe chete chasara kuti aite - kupedza imwe kana mamwe maitiro. Ko OOM-mhondi inofanira kumisa hurongwa nekukasika kana inogona kumirira? Zviripachena, kana out_of_memory ichidanwa, imhaka yekumirira I / O oparesheni kana paging kune diski. Naizvozvo, muurayi weOOM anofanira kutanga aita macheki uye, zvichibva paari, ofunga kuti hurongwa uhu hunofanira kugumiswa. Kana macheki ese ari pazasi akanaka, OOM inomisa maitiro.

Kusarudzwa kwemaitiro

Kana ndangariro ichipera, basa racho rinodanwa out_of_memory(). Ine basa select_bad_process(), iyo inogamuchira kuongororwa kubva kubasa badness(). Iyo "yakaipisisa" nzira ichave yakanangwa. Function badness() anosarudza nzira maererano nemimwe mitemo.

  1. Iyo kernel inoda imwe shoma ndangariro pachayo.
  2. Unoda kusunungura ndangariro zhinji.
  3. Hapana chikonzero chekumisa maitiro ari kushandisa ndangariro shoma.
  4. Minimum process inoda kupedzwa.
  5. Complex algorithms iyo inowedzera mikana yekupedzisa kune iwo maitiro ayo mushandisi pachake anoda kupedzisa.

Wapedza cheki dzese idzi, OOM inoongorora zvibodzwa (oom_score) OOM inogadza oom_score nzira yega yega, uyezve inowanza kukosha uku nehuwandu hwendangariro. Maitiro ane hukuru hukuru anowanzo kuwira mubairo weOOM Killer. Maitiro ane chekuita nemudzi mushandisi ane zvibodzwa zvakaderera uye haadiki kumanikidzwa kugumisa.

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

Iyo Postgres process ID ndeye 3813, saka mune rimwe goko zvinokwanisika kuwana mamaki uchishandisa iyi kernel parameter. oom_score:

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

Kana iwe usingade OOM-Killer kuuraya maitiro zvachose, pane imwe kernel sarudzo: oom_score_adj. Wedzera kukosha kwakashata kukuru kuderedza mikana yekupedzisa nzira yaunokoshesa.

sudo echo -100 > /proc/3813/oom_score_adj

Kuseta kukosha oom_score_adj, isa OOMScoreAdjust muvharovha yebasa:

[Service]
OOMScoreAdjust=-1000

Kana kushandisa oomprotect muchikwata rcctl.

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

Kumanikidza kumisa nzira

Kana imwe kana mamwe maitiro atosarudzwa, OOM-Killer inodaidza basa racho oom_kill_task(). Iri basa rinotumira chiratidzo chekugumisa kune maitiro. Muchiitiko chekushaya ndangariro oom_kill() Inodaidza basa iri kutumira chiratidzo cheSIGKILL kune maitiro. Mharidzo inonyorerwa kune kernel log.

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

Maitiro ekudzora OOM-Killer

PaLinux, unogona kugonesa kana kudzima OOM-Killer (kunyangwe iyo yekupedzisira isingakurudzirwe). Kugonesa kana kudzima shandisa parameter vm.oom-kill. Kugonesa OOM-Killer panguva yekumhanya, mhanyisa iwo rairo sysctl.

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

Kudzima OOM-Killer, tsanangura kukosha 0 mumurairo mumwechete:

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

Mhedzisiro yemurairo uyu haizochengetedzwe zvachose, asi chete kusvika yekutanga reboot. Kana iwe uchida kumwe kushingirira, wedzera mutsara uyu kufaira /etc/sysctl.conf:

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

Imwe nzira yekugonesa nekudzima ndeyekunyora shanduko panic_on_oom. Iko kukosha kunogona kutariswa nguva dzose /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Kana iwe ukaisa kukosha ku0, ipapo kana ndangariro dzapera, hapazove nekuvhunduka kwe kernel.

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

Kana iwe ukaisa kukosha ku1, ipapo kana chiyeuchidzo chapera, kernel panic ichaitika.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer haigone kungobatidzwa nekudzimwa chete. Takatotaura kuti Linux inogona kuchengetedza ndangariro yakawanda yemaitiro pane iripo pasina kunyatsoigovera, uye maitiro aya anodzorwa neLinux kernel parameter. Musiyano unokonzeresa izvi vm.overcommit_memory.

Iwe unogona kutsanangura zvinotevera kukosha kwayo:

0: Iyo kernel pachayo inosarudza kana kuchengetedza yakawandisa ndangariro. Iyi ndiyo default pane dzakawanda shanduro dzeLinux.
1: Iyo kernel inogara ichichengetera imwe ndangariro. Izvi zvine njodzi, nekuti chiyeuchidzo chinogona kupera, nekuti, kazhinji, rimwe zuva maitiro achazvida.
2: iyo kernel haizochengetera ndangariro yakawanda kupfuura yakatsanangurwa muparameter overcommit_ratio.

Neiyi parameter, unotsanangura chikamu chendangariro chinotenderwa kuchengetwa zvakanyanya. Kana pasina nzvimbo yayo, hapana chiyeuchidzo chakagoverwa, uye kuchengetwa kucharambwa. Iyi ndiyo yakachengeteka sarudzo inokurudzirwa yePostgreSQL. OOM-Killer inobatwa nechimwe chinhu - iyo swapping kugona, iyo inodzorwa nekusiyana cat /proc/sys/vm/swappiness. Aya maitiro anoudza kernel maitiro ekubata paging. Iyo yakakwira kukosha, kashoma kuti OOM igumise maitiro, asi nekuda kweI/O mashandiro ayo ane mhedzisiro yakaipa padhatabhesi. Uye zvakapesana - iyo yakaderera kukosha, iyo yakakwira mukana weOOM-Killer kupindira, asi dhizaini dhizaini zvakare yakakwira. Iko kukosha kweiyo 60, asi kana dhatabhesi rese richikwana mundangariro, zviri nani kuseta kukosha ku1.

Migumisiro

Usarega "mhondi" iri muOOM-Killer ikuvhundutsa. Muchiitiko ichi, mhondi ichave muponesi wehurongwa hwako. Iyo "inouraya" maitiro akaipisisa uye inoponesa sisitimu kubva pakuputsika. Kuti udzivise kushandisa OOM-Killer kumisa PostgreSQL, set to vm.overcommit_memory kukosha 2. Izvi hazvivimbisi kuti OOM-Killer haizofaniri kupindira, asi ichaderedza mukana wekumanikidzira nzira yePostgreSQL kugumisa.

Source: www.habr.com

Voeg