Twaqqif ta' Out-Of-Memory Killer fil-Linux għal PostgreSQL

Twaqqif ta' Out-Of-Memory Killer fil-Linux għal PostgreSQL

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.

  1. Il-qalba teħtieġ xi memorja minima għaliha nnifisha.
  2. Trid tillibera ħafna memorja.
  3. M'hemmx bżonn li jitterminaw proċessi li qed jużaw ftit memorja.
  4. Jeħtieġ li jitlestew proċessi minimi.
  5. 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

Żid kumment