Ṣiṣeto Apaniyan-jade-Memory ni Linux fun PostgreSQL

Ṣiṣeto Apaniyan-jade-Memory ni Linux fun PostgreSQL

Nigbati olupin data kan ba jade lairotẹlẹ ni Lainos, o nilo lati wa idi naa. Awọn idi pupọ le wa. Fun apere, SIGSEGV - ikuna nitori kokoro kan ninu olupin ẹhin. Ṣugbọn eyi jẹ toje. Ni ọpọlọpọ igba, o kan sare kuro ni aaye disk tabi iranti. Ti o ba pari ni aaye disk, ọna kan nikan ni o wa - laaye aaye ki o tun bẹrẹ data naa.

Jade-Of-Memory apani

Nigbati olupin tabi ilana ba jade kuro ni iranti, Lainos nfunni ni awọn solusan 2: jamba gbogbo eto tabi fopin si ilana (ohun elo) ti njẹ iranti. O dara julọ, dajudaju, lati fopin si ilana naa ki o fi OS pamọ lati jamba. Ni kukuru, Apaniyan-Jade-Memory jẹ ilana ti o pa ohun elo kan lati fipamọ ekuro lati jamba. O rubọ ohun elo lati jẹ ki OS ṣiṣẹ. Jẹ ki a kọkọ jiroro bi OOM ṣe n ṣiṣẹ ati bii a ṣe le ṣakoso rẹ, ati lẹhinna wo bii OOM Killer ṣe pinnu iru ohun elo lati fopin si.

Ọkan ninu awọn iṣẹ akọkọ ti Lainos ni lati pin iranti si awọn ilana nigba ti wọn beere fun. Ni deede, ilana kan tabi ohun elo n beere iranti lati OS, ṣugbọn ko lo ni kikun. Ti OS ba funni ni iranti fun gbogbo eniyan ti o beere fun ṣugbọn ko ni ero lati lo, laipẹ iranti yoo pari ati eto naa yoo kuna. Lati yago fun eyi, OS ṣe iranti iranti fun ilana naa, ṣugbọn ko ṣe idasilẹ nitootọ. Iranti jẹ ipin nikan nigbati ilana kan yoo lo gangan. O ṣẹlẹ pe OS ko ni iranti ọfẹ, ṣugbọn o fi iranti ranṣẹ si ilana kan, ati nigbati ilana kan ba nilo rẹ, OS naa pin rẹ ti o ba le. Awọn downside ni wipe ma OS ni ẹtọ iranti, sugbon ni ọtun akoko nibẹ ni ko si free iranti, ati awọn eto ipadanu. OOM ṣe ipa pataki ninu oju iṣẹlẹ yii o si fopin si awọn ilana lati ṣe idiwọ ekuro lati ijaaya. Nigbati ilana PostgreSQL ba fi agbara mu lati fopin si, ifiranṣẹ kan yoo han ninu akọọlẹ naa:

Out of Memory: Killed process 12345 (postgres).

Ti eto naa ba kere si iranti ati pe ko le ni ominira, iṣẹ naa ni a pe out_of_memory. Ni ipele yii, ohun kan ni o kù lati ṣe - pari ọkan tabi diẹ sii awọn ilana. O yẹ ki OOM-apaniyan fopin si ilana lẹsẹkẹsẹ tabi o le duro? O han ni, nigbati a pe out_of_memory, o jẹ nitori iduro fun iṣẹ I/O tabi paging si disk. Nitorinaa, apaniyan OOM gbọdọ kọkọ ṣe awọn sọwedowo ati, da lori wọn, pinnu pe ilana naa nilo lati fopin si. Ti gbogbo awọn sọwedowo ni isalẹ jẹ rere, OOM yoo fopin si ilana naa.

Aṣayan ilana

Nigbati iranti ba jade, a pe iṣẹ naa out_of_memory(). O ni iṣẹ kan select_bad_process(), eyi ti o gba igbelewọn lati iṣẹ naa badness(). Ilana "buru" yoo wa ni ìfọkànsí. Išẹ badness() yan ilana ni ibamu si awọn ofin kan.

  1. Ekuro nilo diẹ ninu iranti iranti fun ararẹ.
  2. O nilo lati fi ọpọlọpọ iranti silẹ.
  3. Ko si ye lati fopin si awọn ilana ti o nlo iranti kekere.
  4. Awọn ilana ti o kere julọ nilo lati pari.
  5. Awọn algoridimu eka ti o pọ si awọn aye ti ipari fun awọn ilana wọnyẹn ti olumulo funrararẹ fẹ lati pari.

Lẹhin ti pari gbogbo awọn sọwedowo wọnyi, OOM ṣe idanwo Dimegilio (oom_score). OOM ṣe ipinnu oom_score kọọkan ilana, ati ki o si isodipupo yi iye nipa iye ti iranti. Awọn ilana pẹlu awọn iye nla jẹ diẹ sii lati ṣubu ni olufaragba si Apaniyan OOM. Awọn ilana ti o ni nkan ṣe pẹlu olumulo root ni Dimegilio kekere ati pe o kere julọ lati fi agbara mu lati fopin si.

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

ID ilana Postgres jẹ 3813, nitorinaa ninu ikarahun miiran o ṣee ṣe lati gba Dimegilio nipa lilo paramita ekuro yii oom_score:

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

Ti o ko ba fẹ OOM-Killer lati pa ilana naa rara, aṣayan ekuro miiran wa: oom_score_adj. Ṣafikun iye odi nla lati dinku awọn aye ti ipari ilana ti o ni idiyele.

sudo echo -100 > /proc/3813/oom_score_adj

Lati ṣeto iye kan oom_score_adj, ṣeto OOMScoreṢatunṣe ni bulọọki iṣẹ:

[Service]
OOMScoreAdjust=-1000

Tabi lo oomprotect ninu egbe kan rcctl.

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

Ifopinsi ipa ti ilana kan

Nigbati ọkan tabi diẹ sii awọn ilana ti yan tẹlẹ, OOM-Killer pe iṣẹ naa oom_kill_task(). Iṣẹ yii nfi ifihan agbara ifopinsi ranṣẹ si ilana naa. Ni ọran ti aito iranti oom_kill() Awọn ipe iṣẹ yii lati fi ami ifihan SIGKILL ranṣẹ si ilana naa. Ifiranṣẹ kan ti kọ si akọọlẹ ekuro.

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

Bii o ṣe le ṣakoso OOM-Killer

Lori Lainos, o le mu ṣiṣẹ tabi mu OOM-Killer ṣiṣẹ (botilẹjẹpe a ko ṣeduro igbehin). Lati mu ṣiṣẹ tabi mu ṣiṣẹ lo paramita naa vm.oom-kill. Lati mu OOM-Killer ṣiṣẹ ni akoko asiko, ṣiṣe aṣẹ naa sysctl.

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

Lati mu OOM-Killer ṣiṣẹ, pato iye 0 ni aṣẹ kanna:

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

Abajade aṣẹ yii kii yoo ni fipamọ lailai, ṣugbọn titi di atunbere akọkọ. Ti o ba nilo itẹramọṣẹ diẹ sii, ṣafikun laini yii si faili naa /etc/sysctl.conf:

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

Ona miiran lati mu ṣiṣẹ ati mu ṣiṣẹ ni lati kọ oniyipada kan panic_on_oom. Iye le nigbagbogbo ṣayẹwo ni /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Ti o ba ṣeto iye si 0, lẹhinna nigbati iranti ba pari, ko ni si ijaaya kernel.

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

Ti o ba ṣeto iye si 1, lẹhinna nigbati iranti ba pari, ijaaya ekuro yoo waye.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer ko le wa ni titan ati pa. A ti sọ tẹlẹ pe Lainos le ṣe ifipamọ iranti diẹ sii fun awọn ilana ju ti o wa laisi ipin gangan, ati pe ihuwasi yii jẹ iṣakoso nipasẹ paramita ekuro Linux kan. Oniyipada jẹ lodidi fun eyi vm.overcommit_memory.

O le pato awọn iye wọnyi fun rẹ:

0: Ekuro funrararẹ pinnu boya lati ṣura iranti pupọ ju. Eyi ni aiyipada lori ọpọlọpọ awọn ẹya ti Lainos.
1: Ekuro yoo nigbagbogbo ni ipamọ afikun iranti. Eyi jẹ eewu, nitori iranti le pari, nitori, o ṣeese, ni ọjọ kan awọn ilana yoo nilo rẹ.
2: ekuro yoo ko ni ipamọ diẹ iranti ju pato ninu awọn paramita overcommit_ratio.

Pẹlu paramita yii, o pato ipin ogorun iranti ti o gba laaye lati wa ni ipamọ ju. Ti ko ba si aaye fun o, ko si iranti ti wa ni soto, ati awọn ifiṣura yoo wa ni sẹ. Eyi ni aṣayan aabo julọ ti a ṣeduro fun PostgreSQL. OOM-Killer ni ipa nipasẹ nkan miiran - agbara swapping, eyiti o jẹ iṣakoso nipasẹ oniyipada cat /proc/sys/vm/swappiness. Awọn iye wọnyi sọ fun ekuro bi o ṣe le ṣe itọju paging. Iwọn ti o ga julọ, o kere si pe OOM yoo fopin si ilana naa, ṣugbọn nitori awọn iṣẹ I / O o ni ipa odi lori aaye data. Ati ni idakeji - iye ti o dinku, o ṣeeṣe ti o ṣeeṣe ti OOM-Killer intervention, ṣugbọn iṣẹ data tun ga julọ. Iwọn aiyipada jẹ 60, ṣugbọn ti gbogbo data data ba baamu ni iranti, o dara lati ṣeto iye si 1.

Awọn esi

Maṣe jẹ ki "apaniyan" ni OOM-Killer dẹruba ọ. Ni idi eyi, apaniyan yoo jẹ olugbala ti eto rẹ. O "pa" awọn ilana ti o buru julọ ati fi eto pamọ lati jamba. Lati yago fun nini lati lo OOM-Killer lati fopin si PostgreSQL, ṣeto si vm.overcommit_memory iye 2. Eyi ko ṣe idaniloju pe OOM-Killer kii yoo ni lati laja, ṣugbọn yoo dinku o ṣeeṣe lati fi ipa mu ilana PostgreSQL lati fopin si.

orisun: www.habr.com

Fi ọrọìwòye kun