Issettjar ta' Out-Of-Memory Killer f' Linux għal PostgreSQL

Issettjar ta' Out-Of-Memory Killer f' Linux għal PostgreSQL

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.

  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

В 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 = 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' 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

Ixtri hosting affidabbli għal siti bi protezzjoni DDoS, servers VPS VDS 🔥 Ixtri hosting ta' websajts affidabbli bi protezzjoni DDoS, servers VPS VDS | ProHoster