
Kad iekšā Linux Datu bāzes serveris negaidīti pārtrauc darbību, un ir jānosaka iemesls. Tam 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 tu serveris vai procesam pietrūkst atmiņas, Linux Atmiņas trūkuma izraisītājs 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 pasargāt operētājsistēmu no avārijas. Īsāk sakot, atmiņas trūkuma izraisītājs ir process, kas pārtrauc lietojumprogrammas darbību, lai pasargātu kodolu no avārijas. Tas upurē lietojumprogrammu, lai uzturētu OS darbību. Vispirms apspriedīsim, kā darbojas OOM un kā to kontrolēt, un pēc tam aplūkosim, kā OOM iznīcinātājs izlemj, kuras lietojumprogrammas pārtraukt.
Viens no galvenajiem uzdevumiem Linux — Piešķiriet atmiņu procesiem, kad tie to pieprasa. Parasti process vai lietojumprogramma pieprasa atmiņu no OS, bet neizmanto to pilnībā. Ja OS piešķir atmiņu visiem, kas to pieprasa, bet neplāno to izmantot, sistēmai ātri pietrūks atmiņas un sistēma avarēs. Lai to novērstu, OS rezervē atmiņu procesam, bet faktiski to nepiešķir. Atmiņa tiek piešķirta tikai tad, kad process to faktiski plāno izmantot. Dažreiz 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ā, ka dažreiz OS rezervē atmiņu, bet, kad tas ir nepieciešams, brīvas atmiņas nav, izraisot sistēmas avāriju. Šajā scenārijā galveno lomu spēlē OOM, kas pārtrauc procesus, lai novērstu kodola paniku. Kad PostgreSQL process tiek piespiedu kārtā pārtraukts, žurnālā parādās šāds 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.
- Kodolam ir nepieciešama minimālā atmiņa.
- Jums ir jāatbrīvo daudz atmiņas.
- Nav nepieciešams pārtraukt procesus, kas izmanto maz atmiņas.
- Ir jāpabeidz minimālie procesi.
- 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
2Ja 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_adjLai iestatītu vērtību oom_score_adj, pakalpojumu blokā iestatiet OOMScoreAdjust:
[Service]
OOMScoreAdjust=-1000Vai arī izmantot oomprotect komandā rcctl.
rcctl set <i>servicename</i> oomprotect -1000Procesa 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
В Linux Varat iespējot vai atspējot OOM-Killer (lai gan pēdējais nav ieteicams). Lai to 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 = 1Lai 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.confVē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
0Ja iestatāt vērtību uz 0, tad, kad atmiņa beigsies, kodola panikas nebūs.
$ echo 0 > /proc/sys/vm/panic_on_oomJa iestatāt vērtību uz 1, tad, kad atmiņa beigsies, radīsies kodola panika.
echo 1 > /proc/sys/vm/panic_on_oomKā jau minējām, OOM-Killer var ieslēgt un izslēgt. Linux var rezervēt procesiem vairāk atmiņas, nekā ir pieejams, bet faktiski to nepiešķir, un šo darbību kontrolē kodola parametrs LinuxPar 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. Šī ir noklusējuma vērtība vairumā versiju. Linux.
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
