Mete kanpe Out-of-Memory Killer nan Linux pou PostgreSQL

Mete kanpe Out-of-Memory Killer nan Linux pou PostgreSQL

Lè yon sèvè baz done kite san atann nan Linux, ou bezwen jwenn rezon an. Ka gen plizyè rezon. Pa egzanp, SIGSEGV — echèk akòz yon ensèk nan sèvè backend la. Men, sa a se ra. Pi souvan, ou tou senpleman kouri soti nan espas disk oswa memwa. Si ou fini nan espas ki gen kapasite, gen yon sèl fason pou sòti - libere espas epi rekòmanse baz done a.

Asasen ki pa memwa

Lè yon sèvè oswa yon pwosesis kouri nan memwa, Linux ofri 2 solisyon: aksidan tout sistèm nan oswa mete fen nan pwosesis la (aplikasyon) ki ap manje moute memwa. Li pi bon, nan kou, mete fen nan pwosesis la epi sove eksplwatasyon an soti nan ekraze. Nan yon bref, Out-Of-Memory Killer se yon pwosesis ki touye yon aplikasyon pou sove nwayo a soti nan ekraze. Li sakrifye aplikasyon an pou kenbe OS la kouri. Ann premye diskite sou fason OOM fonksyone ak kijan pou kontwole li, epi answit wè ki jan OOM Killer deside ki aplikasyon pou mete fen.

Youn nan travay prensipal yo nan Linux se asiyen memwa nan pwosesis lè yo mande pou li. Tipikman, yon pwosesis oswa aplikasyon mande memwa nan eksplwatasyon an, men li pa konplètman sèvi ak li. Si OS la bay tout moun ki mande pou li memwa men ki pa gen plan pou itilize li, trè byento memwa a ap fini epi sistèm nan ap echwe. Pou evite sa a, OS la rezève memwa pou pwosesis la, men li pa aktyèlman lage li. Se memwa atribye ba sèlman lè yon pwosesis aktyèlman pral sèvi ak li. Li rive ke eksplwatasyon an pa gen memwa gratis, men li asiyen memwa nan yon pwosesis, epi lè yon pwosesis bezwen li, eksplwatasyon an asiyen li si li kapab. Dezavantaj la se ke pafwa OS la rezève memwa, men nan moman an dwa pa gen okenn memwa gratis, ak sistèm nan aksidan. OOM jwe yon wòl enpòtan nan senaryo sa a epi mete fen nan pwosesis pou anpeche nwayo a panike. Lè yo fòse yon pwosesis PostgreSQL sispann, yon mesaj parèt nan boutèy la:

Out of Memory: Killed process 12345 (postgres).

Si sistèm nan pa gen anpil memwa epi li pa ka libere, yo rele fonksyon an out_of_memory. Nan etap sa a, li gen yon sèl bagay ki rete pou fè - ranpli youn oswa plizyè pwosesis. Èske OOM-Killer ta dwe sispann pwosesis la imedyatman oswa li ka tann? Li evidan, lè yo rele out_of_memory, li se akòz ap tann pou yon operasyon I/O oswa paging sou disk. Se poutèt sa, asasen an OOM dwe premye fè chèk epi, ki baze sou yo, deside ke pwosesis la bezwen yo dwe sispann. Si tout chèk ki anba yo pozitif, OOM ap mete fen nan pwosesis la.

Seleksyon pwosesis

Lè memwa fini, yo rele fonksyon an out_of_memory(). Li gen yon fonksyon select_bad_process(), ki resevwa yon evalyasyon nan fonksyon an badness(). Pwosesis "pi move" la pral vize. Fonksyon badness() chwazi yon pwosesis selon sèten règ.

  1. Kernel la bezwen kèk memwa minimòm pou tèt li.
  2. Ou bezwen libere anpil memwa.
  3. Pa gen okenn nesesite pou mete fen nan pwosesis ki ap itilize ti memwa.
  4. Pwosesis minimòm yo dwe ranpli.
  5. Algoritm konplèks ki ogmante chans pou yo fini pou pwosesis sa yo ke itilizatè a li menm vle konplete.

Lè w fin ranpli tout chèk sa yo, OOM egzamine nòt la (oom_score). OOM plase oom_score chak pwosesis, ak Lè sa a, miltipliye valè sa a pa kantite lajan an nan memwa. Pwosesis ki gen pi gwo valè yo gen plis chans tonbe viktim nan OOM Killer la. Pwosesis ki asosye ak itilizatè rasin lan gen yon nòt ki pi ba epi yo gen mwens chans pou yo fòse yo sispann.

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

ID pwosesis Postgres la se 3813, kidonk nan yon lòt koki li posib pou jwenn nòt la lè l sèvi avèk paramèt nwayo sa a. oom_score:

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

Si ou pa vle OOM-Killer touye pwosesis la ditou, gen yon lòt opsyon nwayo: oom_score_adj. Ajoute yon gwo valè negatif pou redwi chans pou konplete yon pwosè ou valeur.

sudo echo -100 > /proc/3813/oom_score_adj

Pou mete yon valè oom_score_adj, mete OOMScoreAdjust nan blòk sèvis la:

[Service]
OOMScoreAdjust=-1000

Oswa itilize oomprotect nan yon ekip rcctl.

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

Fòs revokasyon yon pwosesis

Lè youn oswa plizyè pwosesis yo deja chwazi, OOM-Killer rele fonksyon an oom_kill_task(). Fonksyon sa a voye yon siyal revokasyon nan pwosesis la. Nan ka mank memwa oom_kill() Rele fonksyon sa a pou voye yon siyal SIGKILL nan pwosesis la. Yo ekri yon mesaj nan jounal nwayo a.

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

Ki jan yo kontwole OOM-Killer

Sou Linux, ou ka aktive oswa enfim OOM-Killer (byenke lèt la pa rekòmande). Pou pèmèt oswa enfim sèvi ak paramèt la vm.oom-kill. Pou pèmèt OOM-Killer nan ègzekutabl, kouri lòd la sysctl.

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

Pou enfim OOM-Killer, presize valè 0 nan menm lòd la:

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

Rezilta kòmandman sa a pa pral sove pou tout tan, men sèlman jiskaske premye rdemare a. Si ou bezwen plis pèsistans, ajoute liy sa a nan dosye a /etc/sysctl.conf:

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

Yon lòt fason pou pèmèt ak enfim se ekri yon varyab panic_on_oom. Valè a ka toujou tcheke nan /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Si ou mete valè a 0, Lè sa a, lè memwa fini, pa pral gen panik nwayo.

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

Si ou mete valè a 1, Lè sa a, lè memwa a fini, yon panik nwayo pral rive.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer pa ka sèlman vire sou ak koupe. Nou te deja di ke Linux ka rezève plis memwa pou pwosesis pase sa ki disponib san yo pa aktyèlman alokasyon li, epi konpòtman sa a kontwole pa yon paramèt nwayo Linux. Varyab la responsab pou sa vm.overcommit_memory.

Ou ka presize valè sa yo pou li:

0: Kernel la li menm deside si li rezève twòp memwa. Sa a se default sou pifò vèsyon Linux.
1: Kernel la ap toujou rezève memwa siplemantè. Sa a se riske, paske memwa a ka fini, paske, gen plis chans, yon jou pwosesis yo pral mande pou li.
2: nwayo a pa pral rezève plis memwa pase sa ki espesifye nan paramèt la overcommit_ratio.

Avèk paramèt sa a, ou presize pousantaj memwa ki gen dwa rezève twòp. Si pa gen plas pou li, pa gen okenn memwa atribye ba, epi rezèvasyon an pral refize. Sa a se opsyon ki pi an sekirite rekòmande pou PostgreSQL. OOM-Killer afekte pa yon lòt eleman - kapasite nan echanj, ki se kontwole pa varyab la cat /proc/sys/vm/swappiness. Valè sa yo di nwayo a ki jan yo okipe paging. Plis valè a pi wo, se mwens chans pou OOM pral mete fen nan pwosesis la, men akòz operasyon I/O li gen yon enpak negatif sou baz done a. Ak vis vèrsa - pi ba valè a, pi gwo chans pou entèvansyon OOM-Killer, men pèfòmans baz done a pi wo tou. Valè default la se 60, men si tout baz done a anfòm nan memwa, li pi bon pou mete valè a 1.

Rezilta

Pa kite "asasen an" nan OOM-Killer fè ou pè. Nan ka sa a, asasen an pral sovè sistèm ou an. Li "touye" pwosesis ki pi mal yo epi sove sistèm lan soti nan ekraze. Pou evite gen pou itilize OOM-Killer pou mete fen nan PostgreSQL, mete sou vm.overcommit_memory valè 2. Sa a pa garanti ke OOM-Killer pa pral oblije entèvni, men li pral diminye chans pou fòse pwosesis PostgreSQL la sispann.

Sous: www.habr.com

Add nouvo kòmantè