
Kun sisään Linux Tietokantapalvelin sulkeutuu odottamatta, ja syy on selvitettävä. 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 sinä palvelin tai prosessilta loppuu muisti kesken, Linux Muistin loppumisen estäjä tarjoaa kaksi ratkaisua: kaataa koko järjestelmän tai lopettaa muistia kuluttavan prosessin (sovelluksen). On tietysti parempi lopettaa prosessi ja pelastaa käyttöjärjestelmä kaatumiselta. Lyhyesti sanottuna muistin loppumisen estäjä on prosessi, joka lopettaa sovelluksen pelastaakseen ytimen kaatumiselta. Se uhraa sovelluksen pitääkseen käyttöjärjestelmän käynnissä. Käydään ensin läpi, miten muistin loppuminen toimii ja miten sitä hallitaan, ja tarkastellaan sitten, miten muistin loppuminen estäjä päättää, mitkä sovellukset lopetetaan.
Yksi tärkeimmistä tehtävistä Linux — Varaa muistia prosesseille, kun ne sitä pyytävät. Yleensä prosessi tai sovellus pyytää muistia käyttöjärjestelmältä, mutta ei käytä sitä kokonaan. Jos käyttöjärjestelmä varaa muistia kaikille sitä pyytäville, mutta ei aio käyttää sitä, järjestelmän muisti loppuu nopeasti ja järjestelmä kaatuu. Tämän estämiseksi käyttöjärjestelmä varaa muistia prosessille, mutta ei itse asiassa varaa sitä. Muistia varataan vain, kun prosessi todella aikoo käyttää sitä. Joskus käyttöjärjestelmällä ei ole vapaata muistia, mutta se varaa muistia prosessille, ja kun prosessi sitä tarvitsee, käyttöjärjestelmä varaa sitä, jos se voi. Haittapuolena on, että joskus käyttöjärjestelmä varaa muistia, mutta tarvittaessa vapaata muistia ei ole, mikä aiheuttaa järjestelmän kaatumisen. OOM:lla on keskeinen rooli tässä tilanteessa, sillä se lopettaa prosesseja estääkseen ytimen paniikkimisen. Kun PostgreSQL-prosessi pakotetaan päättymään, lokiin tulee seuraava 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.
- Ydin tarvitsee jonkin verran muistia itselleen.
- Sinun on vapautettava paljon muistia.
- Ei ole tarvetta lopettaa prosesseja, jotka käyttävät vähän muistia.
- Vähimmäisprosessit on suoritettava loppuun.
- 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
2Jos 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_adjArvon asettaminen oom_score_adj, aseta OOMScoreAdjust palvelulohkoon:
[Service]
OOMScoreAdjust=-1000Tai käyttää oomprotect tiimissä rcctl.
rcctl set <i>servicename</i> oomprotect -1000Pakota 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
В Linux Voit ottaa OOM-Killerin käyttöön tai poistaa sen käytöstä (vaikka jälkimmäistä ei suositella). Ota se käyttöön tai poista se käytöstä parametrilla vm.oom-kill. Ota OOM-Killerin käyttöön suorituksen aikana suorittamalla komento sysctl.
sudo -s sysctl -w vm.oom-kill = 1Voit poistaa OOM-Killerin käytöstä määrittämällä arvon 0 samassa komennossa:
sudo -s sysctl -w vm.oom-kill = 0Tä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.confToinen 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
0Jos asetat arvoksi 0, kun muisti loppuu, ytimen paniikkia ei tapahdu.
$ echo 0 > /proc/sys/vm/panic_on_oomJos asetat arvoksi 1, muistin loppuessa syntyy ytimen paniikki.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killerin voi kytkeä päälle ja pois päältä, kuten jo mainitsimme. Linux voi varata prosesseille enemmän muistia kuin on käytettävissä, mutta ei itse asiassa allokoi sitä, ja tätä toimintaa ohjaa ytimen parametri LinuxMuuttuja on tästä vastuussa. vm.overcommit_memory.
Voit määrittää sille seuraavat arvot:
0: Ydin itse päättää, varataanko liikaa muistia. Tämä on oletusarvo useimmissa versioissa. Linux.
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
