
Meta fi Linux Is-server tad-database jieqaf bla mistenni, u l-kawża trid tiġi ddeterminata. Jista' jkun hemm diversi raġunijiet. Pereżempju, SIGSEGV — falliment minħabba bug fis-server backend. Iżda dan huwa rari. Ħafna drabi, sempliċement tispiċċa bla spazju fuq disk jew memorja. Jekk tispiċċa l-ispazju tad-diska, hemm mod wieħed biss - ħeles l-ispazju u terġa 'tibda d-database.
Killer Barra mill-Memorja
Meta int server jew il-proċess jispiċċalu l-memorja, Linux L-Out-Of-Memory Killer joffri żewġ soluzzjonijiet: li s-sistema kollha tiġġarraf jew li jittermina l-proċess (applikazzjoni) li qed tiekol il-memorja. Huwa aħjar, naturalment, li twaqqaf il-proċess u ssalva l-OS milli tiġġarraf. Fil-qosor, l-Out-Of-Memory Killer huwa proċess li jtemm applikazzjoni biex isalva l-kernel milli tiġġarraf. Jissagrifika l-applikazzjoni biex iżomm l-OS jaħdem. Ejja l-ewwel niddiskutu kif jaħdem l-OOM u kif nikkontrollawh, u mbagħad inħarsu lejn kif l-OOM Killer jiddeċiedi liema applikazzjonijiet għandu jtemm.
Wieħed mill-kompiti ewlenin Linux — Alloka l-memorja lill-proċessi meta jitolbuha. Tipikament, proċess jew applikazzjoni titlob memorja mill-OS iżda ma tużahiex kompletament. Jekk l-OS talloka l-memorja lil kull min jitlobha iżda ma jippjanax li jużaha, is-sistema malajr tispiċċa mingħajr memorja, u s-sistema tiġġarraf. Biex tevita dan, l-OS tirriżerva l-memorja għal proċess iżda fil-fatt ma tallokahiex. Il-memorja tiġi allokata biss meta proċess fil-fatt ikollu l-intenzjoni li jużaha. Kultant l-OS ma jkollhiex memorja libera, iżda talloka memorja lil proċess, u meta l-proċess ikollu bżonnha, l-OS tallokaha jekk tista'. L-iżvantaġġ huwa li kultant l-OS tirriżerva l-memorja, iżda meta jkun hemm bżonn, ma jkunx hemm memorja libera, u dan jikkawża ħsara fis-sistema. L-OOM għandha rwol ewlieni f'dan ix-xenarju, billi ttemm il-proċessi biex tevita li l-kernel jippanikja. Meta l-proċess PostgreSQL jiġi terminat bil-forza, jidher il-messaġġ li ġej fil-log:
Out of Memory: Killed process 12345 (postgres).Jekk is-sistema hija baxxa fil-memorja u ma tistax tiġi meħlusa, il-funzjoni tissejjaħ out_of_memory. F'dan l-istadju, fadlilha ħaġa waħda biss x'tagħmel - tlesti proċess wieħed jew aktar. OOM-killer għandu jtemm il-proċess immedjatament jew jista' jistenna? Ovvjament, meta tissejjaħ out_of_memory, dan ikun minħabba stennija għal operazzjoni I/O jew paging fuq disk. Għalhekk, il-qattiel OOM għandu l-ewwel iwettaq kontrolli u, abbażi tagħhom, jiddeċiedi li l-proċess jeħtieġ li jintemm. Jekk il-kontrolli kollha hawn taħt huma pożittivi, OOM se jtemm il-proċess.
Għażla tal-proċess
Meta l-memorja tispiċċa, il-funzjoni tissejjaħ out_of_memory(). Għandu funzjoni select_bad_process(), li tirċievi evalwazzjoni mill-funzjoni badness(). L-"agħar" proċess se jkun immirat. Funzjoni badness() jagħżel proċess skond ċerti regoli.
- Il-qalba teħtieġ xi memorja minima għaliha nnifisha.
- Trid tillibera ħafna memorja.
- M'hemmx bżonn li jitterminaw proċessi li qed jużaw ftit memorja.
- Jeħtieġ li jitlestew proċessi minimi.
- Algoritmi kumplessi li jżidu ċ-ċansijiet ta 'tlestija għal dawk il-proċessi li l-utent innifsu jrid ilesti.
Wara li temm dawn il-kontrolli kollha, OOM teżamina l-punteġġ (oom_score). OOM jassenja oom_score kull proċess, u mbagħad timmultiplika dan il-valur bl-ammont ta 'memorja. Proċessi b'valuri akbar huma aktar probabbli li jaqgħu vittmi tal-OOM Killer. Il-proċessi assoċjati mal-utent għerq għandhom punteġġ aktar baxx u huma anqas probabbli li jiġu sfurzati jtemmu.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)L-ID tal-proċess Postgres huwa 3813, għalhekk f'qoxra oħra huwa possibbli li tikseb il-punteġġ billi tuża dan il-parametru tal-kernel oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Jekk ma tridx li OOM-Killer joqtol il-proċess, hemm għażla oħra tal-qalba: oom_score_adj. Żid valur negattiv kbir biex tnaqqas iċ-ċansijiet li tlesti proċess li tapprezza.
sudo echo -100 > /proc/3813/oom_score_adjBiex tissettja valur oom_score_adj, issettja OOMScoreAdjust fil-blokk tas-servizz:
[Service]
OOMScoreAdjust=-1000Jew uża oomprotect f’tim rcctl.
rcctl set <i>servicename</i> oomprotect -1000Forza t-terminazzjoni ta' proċess
Meta proċess wieħed jew aktar huma diġà magħżula, OOM-Killer isejjaħ il-funzjoni oom_kill_task(). Din il-funzjoni tibgħat sinjal ta 'terminazzjoni lill-proċess. F'każ ta' nuqqas ta' memorja oom_kill() Jsejjaħ din il-funzjoni biex tibgħat sinjal SIGKILL lill-proċess. Jinkiteb messaġġ fil-log tal-kernel.
Out of Memory: Killed process [pid] [name].Kif tikkontrolla OOM-Killer
В Linux Tista' tattiva jew tiddiżattiva l-OOM-Killer (għalkemm dan tal-aħħar mhux rakkomandat). Biex tattivah jew tiddiżattivah, uża l-parametru vm.oom-kill. Biex tippermetti OOM-Killer waqt ir-runtime, mexxi l-kmand sysctl.
sudo -s sysctl -w vm.oom-kill = 1Biex tiddiżattiva OOM-Killer, speċifika l-valur 0 fl-istess kmand:
sudo -s sysctl -w vm.oom-kill = 0Ir-riżultat ta 'dan il-kmand mhux se jiġi ffrankat għal dejjem, iżda biss sal-ewwel reboot. Jekk għandek bżonn aktar persistenza, żid din il-linja mal-fajl /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confMod ieħor biex tkun attivata u diżattivata huwa li tikteb varjabbli panic_on_oom. Il-valur jista' dejjem jiġi ċċekkjat /proc.
$ cat /proc/sys/vm/panic_on_oom
0Jekk issettja l-valur għal 0, allura meta l-memorja tispiċċa, ma jkun hemm l-ebda paniku tal-qalba.
$ echo 0 > /proc/sys/vm/panic_on_oomJekk issettja l-valur għal 1, allura meta l-memorja tispiċċa, iseħħ paniku tal-qalba.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer jista' jinxtegħel u jintefa, kif diġà semmejna. Linux jista' jirriżerva aktar memorja għall-proċessi milli hemm disponibbli, iżda fil-fatt ma jallokahiex, u dan l-imġiba hija kkontrollata minn parametru tal-kernel LinuxIl-varjabbli hija responsabbli għal dan. vm.overcommit_memory.
Tista' tispeċifika l-valuri li ġejjin għaliha:
0: Il-kernel innifsu jiddeċiedi jekk jirriżervax wisq memorja. Dan huwa l-valur awtomatiku fil-biċċa l-kbira tal-verżjonijiet. Linux.
1: Il-qalba dejjem se tirriserva memorja żejda. Dan huwa riskjuż, minħabba li l-memorja tista 'tiskadi, minħabba li, x'aktarx, xi darba l-proċessi se jeħtieġuha.
2: il-qalba mhux se tirriserva aktar memorja milli speċifikata fil-parametru overcommit_ratio.
B'dan il-parametru, inti tispeċifika l-perċentwali tal-memorja li hija permessa li tkun riżervata żżejjed. Jekk ma jkunx hemm lok għaliha, l-ebda memorja ma tiġi allokata, u r-riservazzjoni tiġi miċħuda. Din hija l-iktar għażla sigura rakkomandata għal PostgreSQL. OOM-Killer huwa affettwat minn element ieħor - il-kapaċità ta 'skambju, li hija kkontrollata mill-varjabbli cat /proc/sys/vm/swappiness. Dawn il-valuri jgħidu lill-qalba kif timmaniġġja l-paging. Iktar ma jkun għoli l-valur, inqas ikun probabbli li l-OOM itemm il-proċess, iżda minħabba operazzjonijiet I/O għandu impatt negattiv fuq id-database. U viċi versa - iktar ma jkun baxx il-valur, iktar ikun għoli l-probabbiltà ta 'intervent OOM-Killer, iżda l-prestazzjoni tad-database hija wkoll ogħla. Il-valur default huwa 60, iżda jekk id-database kollha tidħol fil-memorja, huwa aħjar li l-valur jiġi stabbilit għal 1.
Riżultati ta '
Tħallix il-"qattiel" f'OOM-Killer jibżak. F'dan il-każ, il-qattiel se jkun is-salvatur tas-sistema tiegħek. Huwa "joqtol" l-agħar proċessi u jiffranka s-sistema milli tiġġarraf. Biex tevita li tuża OOM-Killer biex ittemm PostgreSQL, issettja għal vm.overcommit_memory valur 2. Dan ma jiggarantixxix li OOM-Killer mhux se jkollu jintervjeni, iżda se jnaqqas il-probabbiltà li jiġi mġiegħel il-proċess PostgreSQL jintemm.
Sors: www.habr.com
