
Marka la galo Linux Server-ka keydka xogta ayaa si lama filaan ah u joogsada, waana in la go'aamiyaa sababta. Waxaa jiri kara dhowr sababood. 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
Markaad adiga server ama habku wuxuu ka dhammaadaa xusuusta, Linux Dilaaga Xusuusta Ka Baxsan wuxuu bixiyaa laba xal: burburi nidaamka oo dhan ama joojinta habka (codsiga) ee cunaya xusuusta. Dabcan, way ka fiican tahay in la joojiyo habka oo laga badbaadiyo OS-ka inuu burburo. Marka la soo koobo, Dilaaga Xusuusta Ka Baxsan waa hab joojinaya codsiga si loo badbaadiyo kernel-ka inuu burburo. Waxay u hurtaa codsiga si uu u sii wado OS-ka. Aan marka hore ka wada hadalno sida OOM u shaqeyso iyo sida loo xakameeyo, ka dibna aan eegno sida OOM Killer u go'aamiyo codsiyada la joojinayo.
Mid ka mid ah hawlaha ugu muhiimsan Linux — U qoondee xusuusta hababka marka ay codsadaan. Caadiyan, hab ama codsi ayaa ka codsada xusuusta OS-ka laakiin si buuxda uma isticmaalo. Haddii OS-ku uu u qoondeeyo xusuusta qof kasta oo codsada laakiin aan qorsheyneynin inuu isticmaalo, nidaamku si dhakhso ah ayuu uga dhammaan doonaa xusuusta, nidaamkuna wuu burburi doonaa. Si looga hortago tan, OS-ku wuxuu u kaydiyaa xusuusta hab laakiin dhab ahaantii ma qoondeeyo. Xusuusta waxaa loo qoondeeyaa oo keliya marka habku dhab ahaantii doonayo inuu isticmaalo. Mararka qaarkood OS-ku ma laha xasuus bilaash ah, laakiin wuxuu u qoondeeyaa xusuusta hab, marka habku u baahdo, OS-ku wuxuu u qoondeeyaa haddii uu awoodo. Hoos u dhaca ayaa ah in mararka qaarkood OS-ku uu kaydiyo xusuusta, laakiin marka loo baahdo, ma jiro xusuus bilaash ah, taasoo keenta burbur nidaam. OOM waxay door muhiim ah ka ciyaartaa xaaladdan, iyadoo joojinaysa hababka si looga hortago in kernel-ku argagaxo. Marka habka PostgreSQL si qasab ah loo joojiyo, farriinta soo socota ayaa ka soo muuqanaysa diiwaanka:
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.
- Kernelku wuxuu u baahan yahay xoogaa xusuusta ugu yar laftiisa.
- Waxaad u baahan tahay inaad xorayso xusuus badan.
- Looma baahna in la joojiyo hababka isticmaalaya xusuusta yar.
- Nidaamyada ugu hooseeya waxay u baahan yihiin in la dhammaystiro.
- 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
2Haddii 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_adjSi loo dejiyo qiime oom_score_adj, deji OOMScoreAdjust qeybta adeegga:
[Service]
OOMScoreAdjust=-1000Ama isticmaal oomprotect koox ahaan rcctl.
rcctl set <i>servicename</i> oomprotect -1000Xoog 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 (inkastoo kan dambe aan lagu talinayn). Si aad u awoodsiiso ama u curyaamiso, isticmaal parameter-ka vm.oom-kill. Si aad awood u siiso OOM-Killer wakhtiga runtime, socodsii amarka sysctl.
sudo -s sysctl -w vm.oom-kill = 1Si aad u joojiso OOM-Killer, sheeg qiimaha 0 isla amarka:
sudo -s sysctl -w vm.oom-kill = 0Natiijada 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.confDariiqa 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
0Haddii aad qiimaha u dejiso 0, markaa marka xusuusta dhammaato, ma jiri doonto argagax kernel ah.
$ echo 0 > /proc/sys/vm/panic_on_oomHaddii aad qiimaha u dejiso 1, ka dib marka xasuustu dhamaato, argagax kernel ayaa dhacaya.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer waa la shidi karaa oo la damin karaa, sidaan horey u soo sheegnay. Linux Waxaa laga yaabaa inay u kaydiso xasuus ka badan inta la heli karo, laakiin aan dhab ahaantii loo qoondayn, dhaqankanna waxaa xakameeya halbeegga kernel-ka LinuxDoorsoomaha ayaa mas'uul ka ah tan. vm.overcommit_memory.
Waxaad u cayimi kartaa qiyamka soo socda:
0: Kernel-ka laftiisu wuxuu go'aamiyaa inuu kaydsado xusuus aad u badan iyo in kale. Kani waa qiimaha caadiga ah ee noocyada badankood. 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
