Out-Of-Memory Killerin määrittäminen Linuxissa PostgreSQL:lle

Out-Of-Memory Killerin määrittäminen Linuxissa PostgreSQL:lle

Kun tietokantapalvelin sulkeutuu odottamatta Linuxissa, sinun on löydettävä syy. Syitä voi olla useita. Esimerkiksi, SIGSEGV — vika taustapalvelimen virheestä. Mutta tämä on harvinaista. Useimmiten levytila ​​tai muisti loppuu kesken. Jos levytila ​​loppuu, on vain yksi tapa ulos - vapauta tilaa ja käynnistä tietokanta uudelleen.

Muistin loppumisen tappaja

Kun palvelimen tai prosessin muisti loppuu, Linux tarjoaa kaksi ratkaisua: kaataa koko järjestelmän tai lopettaa muistia kuluttavan prosessin (sovelluksen). On tietysti parempi lopettaa prosessi ja säästää käyttöjärjestelmä kaatumiselta. Lyhyesti sanottuna Out-Of-Memory Killer on prosessi, joka tappaa sovelluksen ja säästää ytimen kaatumiselta. Se uhraa sovelluksen pitääkseen käyttöjärjestelmän käynnissä. Keskustellaan ensin siitä, miten OOM toimii ja miten sitä ohjataan, ja katsotaan sitten, kuinka OOM Killer päättää, mikä sovellus lopettaa.

Yksi Linuxin päätehtävistä on varata muistia prosesseille, kun ne sitä pyytävät. Yleensä prosessi tai sovellus pyytää muistia käyttöjärjestelmästä, mutta ei käytä sitä täysin. Jos käyttöjärjestelmä antaa muistia kaikille, jotka sitä pyytävät, mutta eivät aio käyttää sitä, muisti loppuu pian ja järjestelmä epäonnistuu. Tämän välttämiseksi käyttöjärjestelmä varaa muistia prosessille, mutta ei vapauta sitä. Muistia varataan vain, kun prosessi todella käyttää sitä. Tapahtuu, että käyttöjärjestelmällä ei ole vapaata muistia, mutta se osoittaa muistia prosessille, ja kun prosessi tarvitsee sitä, käyttöjärjestelmä varaa sen, jos voi. Huono puoli on, että joskus käyttöjärjestelmä varaa muistia, mutta oikeaan aikaan ei ole vapaata muistia ja järjestelmä kaatuu. OOM:lla on tärkeä rooli tässä skenaariossa ja se lopettaa prosessit estääkseen ydintä joutumasta paniikkiin. Kun PostgreSQL-prosessi pakotetaan lopettamaan, lokiin tulee viesti:

Out of Memory: Killed process 12345 (postgres).

Jos järjestelmässä on vähän muistia eikä sitä voida vapauttaa, toiminto kutsutaan out_of_memory. Tässä vaiheessa hänellä on vain yksi asia jäljellä - suorittaa yksi tai useampi prosessi. Pitäisikö OOM-killer lopettaa prosessi välittömästi vai voiko se odottaa? Ilmeisesti, kun out_of_memory kutsutaan, se johtuu I/O-toiminnon odottamisesta tai levylle hakemisesta. Siksi OOM-tappajan on ensin suoritettava tarkistuksia ja päätettävä niiden perusteella, että prosessi on lopetettava. Jos kaikki alla olevat tarkistukset ovat positiivisia, OOM lopettaa prosessin.

Prosessin valinta

Kun muisti loppuu, toiminto kutsutaan out_of_memory(). Sillä on toiminto select_bad_process(), joka saa arvion funktiolta badness(). "Pahin" prosessi kohdistetaan. Toiminto badness() valitsee prosessin tiettyjen sääntöjen mukaan.

  1. Ydin tarvitsee jonkin verran muistia itselleen.
  2. Sinun on vapautettava paljon muistia.
  3. Ei ole tarvetta lopettaa prosesseja, jotka käyttävät vähän muistia.
  4. Vähimmäisprosessit on suoritettava loppuun.
  5. Monimutkaiset algoritmit, jotka lisäävät niiden prosessien mahdollisuuksia, jotka käyttäjä itse haluaa suorittaa.

Kun kaikki nämä tarkastukset on suoritettu, OOM tutkii tuloksen (oom_score). OOM antaa oom_score jokaiseen prosessiin ja kertoo tämän arvon muistin määrällä. Prosessit, joilla on suurempi arvo, joutuvat todennäköisemmin OOM Killerin uhreiksi. Pääkäyttäjään liittyvillä prosesseilla on alhaisemmat pisteet, ja niiden on vähemmän todennäköisesti pakko lopettaa.

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

Postgres-prosessin tunnus on 3813, joten toisessa kuoressa on mahdollista saada pisteet tällä ytimen parametrilla oom_score:

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

Jos et halua OOM-Killerin tappavan prosessia ollenkaan, on toinen ytimen vaihtoehto: oom_score_adj. Lisää suuri negatiivinen arvo vähentääksesi mahdollisuuksia saada päätökseen arvostamasi prosessi.

sudo echo -100 > /proc/3813/oom_score_adj

Arvon asettaminen oom_score_adj, aseta OOMScoreAdjust palvelulohkoon:

[Service]
OOMScoreAdjust=-1000

Tai käyttää oomprotect tiimissä rcctl.

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

Pakota prosessin lopettaminen

Kun yksi tai useampi prosessi on jo valittu, OOM-Killer kutsuu funktiota oom_kill_task(). Tämä toiminto lähettää lopetussignaalin prosessille. Muistin puutteen tapauksessa oom_kill() Kutsuu tätä toimintoa SIGKILL-signaalin lähettämiseksi prosessiin. Ytimen lokiin kirjoitetaan viesti.

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

Kuinka ohjata OOM-Killeria

Linuxissa voit ottaa OOM-Killerin käyttöön tai poistaa sen käytöstä (vaikka jälkimmäistä ei suositella). Ota käyttöön tai poista käytöstä käyttämällä parametria vm.oom-kill. Ota OOM-Killerin käyttöön suorituksen aikana suorittamalla komento sysctl.

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

Voit poistaa OOM-Killerin käytöstä määrittämällä arvon 0 samassa komennossa:

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

Tämän komennon tulosta ei tallenneta ikuisesti, vaan vain ensimmäiseen uudelleenkäynnistykseen asti. Jos tarvitset lisää sinnikkyyttä, lisää tämä rivi tiedostoon /etc/sysctl.conf:

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

Toinen tapa ottaa käyttöön ja poistaa käytöstä on kirjoittaa muuttuja panic_on_oom. Arvon voi aina tarkistaa /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Jos asetat arvoksi 0, kun muisti loppuu, ytimen paniikkia ei tapahdu.

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

Jos asetat arvoksi 1, muistin loppuessa syntyy ytimen paniikki.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killeria ei voi vain kytkeä päälle ja pois päältä. Olemme jo sanoneet, että Linux voi varata enemmän muistia prosesseille kuin on käytettävissä ilman sitä varsinaisesti allokoimatta, ja tätä toimintaa ohjaa Linux-ytimen parametri. Muuttuja on vastuussa tästä vm.overcommit_memory.

Voit määrittää sille seuraavat arvot:

0: Ydin itse päättää varaako liikaa muistia. Tämä on oletusarvo useimmissa Linux-versioissa.
1: Ydin varaa aina ylimääräistä muistia. Tämä on riskialtista, koska muisti saattaa loppua, koska todennäköisesti jonain päivänä prosessit vaativat sitä.
2: ydin ei varaa enempää muistia kuin parametrissa on määritetty overcommit_ratio.

Tällä parametrilla määrität ylivaratun muistin prosenttiosuuden. Jos sille ei ole tilaa, muistia ei varata ja varaus evätään. Tämä on turvallisin vaihtoehto, jota suositellaan PostgreSQL:lle. OOM-Killeriin vaikuttaa toinen elementti - vaihtokyky, jota muuttuja ohjaa cat /proc/sys/vm/swappiness. Nämä arvot kertovat ytimelle, kuinka sivutusta käsitellään. Mitä suurempi arvo, sitä epätodennäköisempää on, että OOM lopettaa prosessin, mutta I/O-toimintojen vuoksi sillä on negatiivinen vaikutus tietokantaan. Ja päinvastoin - mitä pienempi arvo, sitä suurempi on OOM-Killerin toiminnan todennäköisyys, mutta myös tietokannan suorituskyky on korkeampi. Oletusarvo on 60, mutta jos koko tietokanta mahtuu muistiin, on parempi asettaa arvoksi 1.

Tulokset

Älä anna OOM-Killerin "tappajan" pelotella sinua. Tässä tapauksessa tappaja on järjestelmäsi pelastaja. Se "tappaa" pahimmat prosessit ja säästää järjestelmän kaatumiselta. Jotta sinun ei tarvitse käyttää OOM-Killeria PostgreSQL:n lopettamiseen, aseta arvoksi vm.overcommit_memory arvo 2. Tämä ei takaa, että OOM-Killerin ei tarvitse puuttua asiaan, mutta se vähentää todennäköisyyttä, että PostgreSQL-prosessi pakotetaan lopettamaan.

Lähde: will.com

Lisää kommentti