Dejinta Killer-ka-Xasuusta ee Linux ee PostgreSQL

Dejinta Killer-ka-Xasuusta ee Linux ee PostgreSQL

Marka server-ka xog ururinta uu si lama filaan ah uga tago Linux, waxaad u baahan tahay inaad hesho sababta. Waxaa jiri kara sababo dhowr ah. Tusaale ahaan, SIGSEGV - guuldarreysiga sababtoo ah cilad ku jirta server-ka dambe. Laakiin tani waa dhif. Inta badan, waxa si fudud kaa dhammaanaya meel diskooga ama xusuusta. Haddii booska diskooga kaa dhamaado, waxaa jira hal waddo oo kaliya - bannaan bixi oo dib u bilow xogta kaydinta.

Dilaaga Xusuus-ka-baxsan

Marka server-ka ama habka uu ka dhamaado xusuusta, Linux wuxuu bixiyaa 2 xal: burburi nidaamka oo dhan ama joojiso habka (codsiga) ee cunaya xusuusta. Way fiicantahay, dabcan, in la joojiyo nidaamka oo laga badbaadiyo OS-ka burburka. Si kooban, Killer-ka-Xasuusta-ka-baxsan waa hab-raac dila codsiga si loo badbaadiyo kernel-ka inuu shil galo. Waxay u huraysaa arjiga si uu OS u sii socdo. Aan marka hore ka hadalno sida OOM u shaqeyso iyo sida loo xakameeyo, ka dibna aan aragno sida OOM Killer u go'aamiyo codsiga joojinta.

Mid ka mid ah hawlaha ugu muhiimsan Linux waa in loo qoondeeyo xusuusta hababka marka ay weyddiistaan. Caadi ahaan, habka ama codsigu wuxuu ka codsadaa xusuusta OS, laakiin si buuxda uma isticmaalo. Haddii OS uu siiyo xusuusta qof kasta oo weydiista laakiin aan qorsheyneynin inuu isticmaalo, isla markiiba xusuusta ayaa dhammaan doonta oo nidaamku wuu dhici doonaa. Si taas looga fogaado, OS-ku wuxuu kaydiyaa xusuusta habka, laakiin dhab ahaantii ma sii daayo. Xusuusta waxaa loo qoondeeyay kaliya marka hab-raac dhab ahaan loo isticmaalo. Way dhacdaa in OS-gu aanu lahayn xusuusta bilaashka ah, balse waxa uu u xilsaaraa xusuusta hab-socodka, marka hab-socodku u baahdo, OS-gu waxa uu u qoondeeyaa haddii uu awoodo. Dhankeeda ayaa ah in mararka qaarkood OS-gu uu kaydiyo xusuusta, laakiin waqtiga saxda ah ma jiro xusuus bilaash ah, oo nidaamku burburo. OOM ayaa door muhiim ah ka ciyaarta dhacdadan waxayna joojisaa hababka looga hortago in kernel-ku argagaxo. Marka nidaamka PostgreSQL lagu qasbo inuu joojiyo, fariintu waxay ka soo baxaysaa log:

Out of Memory: Killed process 12345 (postgres).

Haddii nidaamka uu ku yar yahay xusuusta oo aan la sii deyn karin, shaqada ayaa loo yaqaan out_of_memory. Marxaladdan, waxa u hadhsan hal shay oo ay ku samayso - inay dhammaystirto hal ama dhawr hab. Miyey tahay dilaaga OOM inuu si dhakhso ah u joojiyo hawsha mise ma sugi karaa? Sida iska cad, marka xusuusta_baxsan la yiraahdo, waxaa sabab u ah sugitaanka hawlgalka I/O ama bogsiinta diskka. Sidaa darteed, dilaaga OOM waa in uu marka hore sameeyo jeegaga oo, iyaga oo ka duulaya, go'aansada in habka loo baahan yahay in la joojiyo. Haddii dhammaan jeegagga hoose ay yihiin kuwo togan, OOM ayaa joojin doonta hawsha.

Habka xulashada

Marka xasuustu dhamaato, shaqada ayaa loo yeeraa out_of_memory(). Waxay leedahay shaqo select_bad_process(), kaas oo qiimayn ka helaya shaqada badness(). Habka "ugu xun" waa la beegsan doonaa. Shaqada badness() dooro hab waafaqsan xeerar gaar ah.

  1. Kernelku wuxuu u baahan yahay xoogaa xusuusta ugu yar laftiisa.
  2. Waxaad u baahan tahay inaad xorayso xusuus badan.
  3. Looma baahna in la joojiyo hababka isticmaalaya xusuusta yar.
  4. Nidaamyada ugu hooseeya waxay u baahan yihiin in la dhammaystiro.
  5. Algorithms-ka adag ee kordhiya fursadaha dhamaystirka hababkaas uu isticmaalaha laftiisu rabo inuu dhamaystiro.

Markay dhammaysay dhammaan jeegaggaas, OOM waxay eegtaa natiijada (oom_score). OOM ayaa xilsaarta oom_score nidaam kasta, ka dibna ku dhufto qiimahan qadarka xusuusta. Nidaamyada leh qiyamka waaweyn waxay u badan tahay inay dhibane u noqdaan dilaaga OOM. Nidaamyada la xiriira xididka isticmaalaha ayaa leh dhibco hoose waxayna u badan tahay in ay yar tahay in lagu qasbo in la joojiyo.

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

Aqoonsiga habka Postgres waa 3813, markaa qolof kale waxaa suurtagal ah in lagu helo dhibcaha iyadoo la adeegsanayo cabbirkan kernel oom_score:

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

Haddii aadan rabin OOM-Killer inuu dilo nidaamka gabi ahaanba, waxa jira ikhtiyaar kale oo kernel ah: oom_score_adj. Ku dar qiimo weyn oo taban si aad u yarayso fursadaha dhamaystirka habka aad qiimaynayso.

sudo echo -100 > /proc/3813/oom_score_adj

Si loo dejiyo qiime oom_score_adj, deji OOMScoreAdjust qeybta adeegga:

[Service]
OOMScoreAdjust=-1000

Ama isticmaal oomprotect koox ahaan rcctl.

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

Xoog joojinta habka

Marka hal ama in ka badan oo habab hore loo doortay, OOM-Killer ayaa wacaysa shaqada oom_kill_task(). Hawshani waxay u dirtaa calaamada joojinta habka. Haddii ay dhacdo xusuus yaraan oom_kill() Wuxuu wacaa shaqadan si uu ugu diro calaamada SIGKILL habka. Farriin ayaa loo qorayaa kernel log.

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

Sida loo xakameeyo OOM-Killer

Linux, waad awoodsiin kartaa ama joojin kartaa OOM-Killer (inkasta oo kan dambe aan lagu talinayn). Si aad awood ugu yeelato ama u joojiso isticmaal cabbirka vm.oom-kill. Si aad awood u siiso OOM-Killer wakhtiga runtime, socodsii amarka sysctl.

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

Si aad u joojiso OOM-Killer, sheeg qiimaha 0 isla amarka:

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

Natiijada amarkan lama badbaadin doono weligeed, laakiin kaliya ilaa dib-u-bilaabida ugu horreysa. Haddii aad u baahan tahay adkaysi dheeraad ah, ku dar khadkan faylka /etc/sysctl.conf:

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

Dariiqa kale ee karti iyo deminta waa in la qoro doorsoome panic_on_oom. Qiimaha mar walba waa la hubin karaa /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Haddii aad qiimaha u dejiso 0, markaa marka xusuusta dhammaato, ma jiri doonto argagax kernel ah.

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

Haddii aad qiimaha u dejiso 1, ka dib marka xasuustu dhamaato, argagax kernel ayaa dhacaya.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer lama dami karo oo kaliya. Waxaan horey u sheegnay in Linux uu keydin karo xusuusta ka badan inta la heli karo iyada oo aan dhab ahaantii loo qoondeyn, waxaana habdhaqankan gacanta ku haya halbeegga kernel Linux. Doorsoomayaasha ayaa mas'uul ka ah tan vm.overcommit_memory.

Waxaad u cayimi kartaa qiyamka soo socda:

0: Kernel-ka laftiisa ayaa go'aaminaya in uu kaydinayo xusuusta badan iyo in kale. Tani waa nooca ugu badan ee Linux.
1: Kernelku wuxuu had iyo jeer kaydin doonaa xusuusta dheeraadka ah. Tani waa khatar, sababtoo ah xusuusta ayaa laga yaabaa inay dhammaato, sababtoo ah, waxay u badan tahay, maalin maalmaha ka mid ah hababka ayaa u baahan doona.
2: Kernelku ma kaydsan doono xasuus ka badan inta lagu cayimay halbeegga overcommit_ratio.

Halbeeggaan, waxaad ku qeexeysaa boqolleyda xusuusta ee loo oggol yahay in aad loo xafido. Haddii boos loo waayo, xusuus looma qoondeeyo, boos celintuna waa la diidi doonaa. Tani waa doorashada ugu badbaadsan ee lagu taliyay PostgreSQL. OOM-Killer waxaa saameeya shay kale - awoodda wax-is-beddelka, kaas oo ay maamusho doorsoomayaasha cat /proc/sys/vm/swappiness. Qiimayaashani waxay u sheegaan kernel-ka sida loo maamulo boggaga. Markasta oo uu qiimihiisu sarreeyo, way yaraanaysaa in OOM ay joojin doonto hawsha, laakiin hawlgallada I/O awgeed waxay saamayn taban ku yeelanaysaa kaydka xogta. Iyo lid ku ah - qiimaha hoose, sare u kaca suurtagalnimada faragelinta OOM-Killer, laakiin waxqabadka xogta ayaa sidoo kale ka sarreeya. Qiimaha caadiga ah waa 60, laakiin haddii xogta oo dhan ay ku habboon tahay xusuusta, waxaa fiican in qiimaha la dhigo 1.

Natiijooyinka

Ha u ogolaanin "dilaaga" ku jira OOM-Killer inuu ku cabsiiyo. Xaaladdan oo kale, dilaagu wuxuu noqon doonaa badbaadiyaha nidaamkaaga. Waxay "dishaa" hababka ugu xun waxayna ka badbaadisaa nidaamka burburka. Si looga fogaado isticmaalka OOM-Killer si loo joojiyo PostgreSQL, u deji vm.overcommit_memory Qiimaha 2. Tani ma dammaanad qaadayso in OOM-Killer aanu faragelin doonin, laakiin waxay yaraynaysaa suurtagalnimada in lagu qasbo habka PostgreSQL inuu joojiyo.

Source: www.habr.com

Add a comment