Meta server tad-database jieqaf b'mod mhux mistenni fil-Linux, trid issib ir-raġuni. 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 server jew proċess jispiċċa mingħajr memorja, Linux joffri 2 soluzzjonijiet: tiġġarraf is-sistema kollha jew ittemm il-proċess (applikazzjoni) li qed tiekol il-memorja. Huwa aħjar, ovvjament, li ttemm il-proċess u tiffranka l-OS milli jiġġarrfu. Fil-qosor, Out-Of-Memory Killer huwa proċess li joqtol applikazzjoni biex isalva l-qalba milli tiġġarraf. Jissagrifika l-applikazzjoni biex iżomm l-OS jaħdem. Ejja l-ewwel niddiskutu kif taħdem l-OOM u kif tikkontrollaha, u mbagħad naraw kif OOM Killer jiddeċiedi liema applikazzjoni tittermina.
Waħda mill-kompiti ewlenin tal-Linux hija li talloka memorja għall-proċessi meta jitolbuha. Tipikament, proċess jew applikazzjoni titlob memorja mill-OS, iżda ma tużahx bis-sħiħ. Jekk l-OS jagħti l-memorja lil kull min jitlobha iżda m'għandux pjanijiet biex jużaha, dalwaqt il-memorja tispiċċa u s-sistema se tfalli. Biex tevita dan, l-OS jirriżerva memorja għall-proċess, iżda fil-fatt ma jirrilaxxaha. Il-memorja hija allokata biss meta proċess ikun fil-fatt se jużaha. Jiġri li l-OS m'għandux memorja ħielsa, iżda jassenja memorja għal proċess, u meta proċess jeħtieġha, l-OS jallokaha jekk jista '. L-iżvantaġġ huwa li xi drabi l-OS tirriżerva memorja, iżda fil-ħin it-tajjeb m'hemm l-ebda memorja ħielsa, u s-sistema tiġġarraf. L-OOM għandu rwol importanti f'dan ix-xenarju u jtemm il-proċessi biex jipprevjeni l-qalba milli jippaniku. Meta proċess PostgreSQL jiġi sfurzat jintemm, jidher messaġġ fil-ġurnal:
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
2
Jekk 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_adj
Biex tissettja valur oom_score_adj
, issettja OOMScoreAdjust fil-blokk tas-servizz:
[Service]
OOMScoreAdjust=-1000
Jew uża oomprotect
f’tim rcctl
.
rcctl set <i>servicename</i> oomprotect -1000
Forza 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
Fuq Linux, tista 'tippermetti jew tiddiżattiva OOM-Killer (għalkemm dan tal-aħħar mhux rakkomandat). Biex tippermetti jew tiddiżattiva 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 = 1
Biex tiddiżattiva OOM-Killer, speċifika l-valur 0 fl-istess kmand:
sudo -s sysctl -w vm.oom-kill = 0
Ir-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.conf
Mod 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
0
Jekk 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_oom
Jekk issettja l-valur għal 1, allura meta l-memorja tispiċċa, iseħħ paniku tal-qalba.
echo 1 > /proc/sys/vm/panic_on_oom
OOM-Killer jista 'mhux biss jinxtegħel u jintfew. Diġà għedna li l-Linux jista’ jirriserva aktar memorja għall-proċessi milli hija disponibbli mingħajr ma fil-fatt tallokaha, u din l-imġieba hija kkontrollata minn parametru tal-kernel Linux. Il-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. Din hija d-default fil-biċċa l-kbira tal-verżjonijiet tal-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