Out-Of-Memory Killer iestatÄ«Å”ana operētājsistēmā Linux darbam ar PostgreSQL

Out-Of-Memory Killer iestatÄ«Å”ana operētājsistēmā Linux darbam ar PostgreSQL

Kad datu bāzes serveris negaidÄ«ti izslēdzas operētājsistēmā Linux, jums ir jāatrod iemesls. Var bÅ«t vairāki iemesli. Piemēram, SIGSEGV ā€” kļūme aizmugursistēmas servera kļūdas dēļ. Bet tas ir reti. Visbiežāk jums vienkārÅ”i pietrÅ«kst vietas diskā vai atmiņā. Ja diskā pietrÅ«kst vietas, ir tikai viena izeja - atbrÄ«vojiet vietu un restartējiet datu bāzi.

Atmiņas slepkava

Kad serverÄ« vai procesā beidzas atmiņa, Linux piedāvā divus risinājumus: avarēt visu sistēmu vai pārtraukt procesu (lietojumprogrammu), kas patērē atmiņu. Protams, labāk ir pārtraukt procesu un glābt OS no avārijas. ÄŖsumā, Out-Of-Memory Killer ir process, kas nogalina lietojumprogrammu, lai glābtu kodolu no avārijas. Tas upurē lietojumprogrammu, lai nodroÅ”inātu operētājsistēmas darbÄ«bu. Vispirms apspriedÄ«sim, kā OOM darbojas un kā to kontrolēt, un pēc tam redzēsim, kā OOM Killer izlemj, kuru lietojumprogrammu pārtraukt.

Viens no galvenajiem Linux uzdevumiem ir pieŔķirt atmiņu procesiem, kad tie to pieprasa. Parasti process vai lietojumprogramma pieprasa atmiņu no OS, bet neizmanto to pilnÄ«bā. Ja OS izdala atmiņu visiem, kas to lÅ«dz, bet neplāno to izmantot, ļoti drÄ«z atmiņa beigsies un sistēma neizdosies. Lai no tā izvairÄ«tos, OS rezervē atmiņu procesam, bet faktiski to neatbrÄ«vo. Atmiņa tiek pieŔķirta tikai tad, kad process to faktiski izmantos. Gadās, ka OS nav brÄ«vas atmiņas, bet tā pieŔķir atmiņu procesam, un, kad procesam tā ir nepiecieÅ”ama, OS to pieŔķir, ja var. NegatÄ«vā puse ir tāda, ka dažreiz OS rezervē atmiņu, bet Ä«stajā brÄ«dÄ« nav brÄ«vas atmiņas, un sistēma avarē. Å ajā scenārijā OOM ir svarÄ«ga loma un pārtrauc procesus, lai novērstu kodola paniku. Kad PostgreSQL process ir spiests pārtraukt, žurnālā tiek parādÄ«ts ziņojums:

Out of Memory: Killed process 12345 (postgres).

Ja sistēmā ir maz atmiņas un to nevar atbrÄ«vot, funkcija tiek izsaukta out_of_memory. Å ajā posmā viņai atliek tikai viena lieta ā€“ pabeigt vienu vai vairākus procesus. Vai OOM-killer nekavējoties jāpārtrauc process vai tas var pagaidÄ«t? AcÄ«mredzot, kad tiek izsaukts out_of_memory, tas ir saistÄ«ts ar I/O operācijas gaidÄ«Å”anu vai peidžeru uz disku. Tāpēc OOM slepkavam vispirms ir jāveic pārbaudes un, pamatojoties uz tām, jāpieņem lēmums, ka process ir jāpārtrauc. Ja visas tālāk norādÄ«tās pārbaudes ir pozitÄ«vas, OOM pārtrauks procesu.

Procesa izvēle

Kad atmiņa beidzas, funkcija tiek izsaukta out_of_memory(). Tam ir funkcija select_bad_process(), kas saņem funkcijas novērtējumu badness(). Tiks mērķēts uz ā€œsliktākoā€ procesu. Funkcija badness() izvēlas procesu saskaņā ar noteiktiem noteikumiem.

  1. Kodolam ir nepiecieÅ”ama minimālā atmiņa.
  2. Jums ir jāatbrīvo daudz atmiņas.
  3. Nav nepiecieÅ”ams pārtraukt procesus, kas izmanto maz atmiņas.
  4. Ir jāpabeidz minimālie procesi.
  5. Sarežģīti algoritmi, kas palielina to procesu pabeigÅ”anas iespējas, kurus lietotājs pats vēlas pabeigt.

Pabeidzot visas Ŕīs pārbaudes, OOM pārbauda rezultātu (oom_score). OOM pieŔķir oom_score katru procesu un pēc tam reizina Å”o vērtÄ«bu ar atmiņas apjomu. Procesi ar lielākām vērtÄ«bām, visticamāk, kļūs par OOM Killer upuriem. Procesiem, kas saistÄ«ti ar saknes lietotāju, ir zemāks rādÄ«tājs, un ir mazāka iespēja, ka tie bÅ«s spiesti pārtraukt.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

Postgres procesa ID ir 3813, tāpēc citā čaulā ir iespējams iegÅ«t punktu skaitu, izmantojot Å”o kodola parametru oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Ja nevēlaties, lai OOM-Killer vispār nogalinātu procesu, ir vēl viena kodola opcija: oom_score_adj. Pievienojiet lielu negatīvu vērtību, lai samazinātu iespēju pabeigt jums vērtīgo procesu.

sudo echo -100 > /proc/3813/oom_score_adj

Lai iestatītu vērtību oom_score_adj, pakalpojumu blokā iestatiet OOMScoreAdjust:

[Service]
OOMScoreAdjust=-1000

Vai arī izmantot oomprotect komandā rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Procesa piespiedu pārtraukŔana

Kad viens vai vairāki procesi jau ir atlasÄ«ti, OOM-Killer izsauc funkciju oom_kill_task(). Å Ä« funkcija procesam nosÅ«ta beigu signālu. Atmiņas trÅ«kuma gadÄ«jumā oom_kill() Izsauc Å”o funkciju, lai procesam nosÅ«tÄ«tu SIGKILL signālu. Kodola žurnālā tiek ierakstÄ«ts ziņojums.

Out of Memory: Killed process [pid] [name].

Kā kontrolēt OOM-Killer

Operētājsistēmā Linux varat iespējot vai atspējot OOM-Killer (lai gan pēdējais nav ieteicams). Lai iespējotu vai atspējotu, izmantojiet parametru vm.oom-kill. Lai iespējotu OOM-Killer izpildes laikā, palaidiet komandu sysctl.

sudo -s sysctl -w vm.oom-kill = 1

Lai atspējotu OOM-Killer, tajā paŔā komandā norādiet vērtÄ«bu 0:

sudo -s sysctl -w vm.oom-kill = 0

Å Ä«s komandas rezultāts netiks saglabāts uz visiem laikiem, bet tikai lÄ«dz pirmajai atsāknÄ“Å”anai. Ja nepiecieÅ”ama lielāka noturÄ«ba, pievienojiet Å”o rindiņu failam /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

Vēl viens veids, kā iespējot un atspējot, ir rakstīt mainīgo panic_on_oom. Vērtību vienmēr var reģistrēt /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Ja iestatāt vērtību uz 0, tad, kad atmiņa beigsies, kodola panikas nebūs.

$ echo 0 > /proc/sys/vm/panic_on_oom

Ja iestatāt vērtību uz 1, tad, kad atmiņa beigsies, radīsies kodola panika.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer var ne tikai ieslēgt un izslēgt. Mēs jau teicām, ka Linux var rezervēt vairāk atmiņas procesiem, nekā ir pieejams, to faktiski nepieŔķirot, un Å”o darbÄ«bu kontrolē Linux kodola parametrs. Par to ir atbildÄ«gs mainÄ«gais vm.overcommit_memory.

Tam varat norādÄ«t Ŕādas vērtÄ«bas:

0: Kodols pats izlemj, vai rezervēt pārāk daudz atmiņas. Tas ir noklusējuma iestatījums lielākajā daļā Linux versiju.
1: Kodols vienmēr rezervēs papildu atmiņu. Tas ir riskanti, jo atmiņa var beigties, jo, visticamāk, kādu dienu procesi to prasīs.
2: kodols nerezervēs vairāk atmiņas, nekā norādīts parametrā overcommit_ratio.

Izmantojot Å”o parametru, jÅ«s norādāt atmiņas procentuālo daļu, kurai ir atļauts pārmērÄ«gi rezervēt. Ja tam nav vietas, atmiņa netiek pieŔķirta, un rezervācija tiks liegta. Å Ä« ir droŔākā opcija, kas ieteicama PostgreSQL. OOM-Killer ietekmē vēl viens elements - maiņas iespēja, ko kontrolē mainÄ«gais cat /proc/sys/vm/swappiness. Å Ä«s vērtÄ«bas norāda kodolam, kā rÄ«koties ar peidžeru. Jo lielāka vērtÄ«ba, jo mazāka ir iespējamÄ«ba, ka OOM pārtrauks procesu, taču I/O darbÄ«bu dēļ tas negatÄ«vi ietekmēs datu bāzi. Un otrādi - jo zemāka vērtÄ«ba, jo lielāka ir OOM-Killer iejaukÅ”anās iespējamÄ«ba, taču arÄ« datu bāzes veiktspēja ir augstāka. Noklusējuma vērtÄ«ba ir 60, bet, ja visa datu bāze iekļaujas atmiņā, labāk ir iestatÄ«t vērtÄ«bu uz 1.

Rezultāti

Neļaujiet OOM-Killer "slepkavam" jÅ«s nobiedēt. Å ajā gadÄ«jumā slepkava bÅ«s jÅ«su sistēmas glābējs. Tas "nogalina" vissliktākos procesus un pasargā sistēmu no avārijām. Lai PostgreSQL pārtraukÅ”anai nebÅ«tu jāizmanto OOM-Killer, iestatiet uz vm.overcommit_memory vērtÄ«ba 2. Tas negarantē, ka OOM-Killer nebÅ«s jāiejaucas, taču tas samazinās iespējamÄ«bu, ka PostgreSQL process tiks pārtraukts.

Avots: www.habr.com

Pievieno komentāru