Profecti sunt Out-Of-Memoria interfector in Linux pro PostgreSQL

Profecti sunt Out-Of-Memoria interfector in Linux pro PostgreSQL

Cum servo database inopinato in Linux discedit, causam invenire debes. Plures esse possunt rationes. Exempli gratia SIGSEGV - cimex defectus in servo backend. Sed hoc rarum est. Saepissime, simpliciter excurrere orbis tractus vel memoria. Si ex spatio orbis excurras, unus tantum modus est - exstingue spatium et sileo datorum.

Out-Of-Memoriam interfectorem

Cum servo vel processus memoriae decurrit, Linux solutiones 2 praebet: totam systema incido vel processum (applicationem) qui memoriam comedens terminat. Melius est, scilicet, processus terminare, et salvare OS a fragore. In nuce, Out-Of-Memoria Interfectorem processus est qui necat applicationem ad salvandum nucleum a fragore. Sacrificat applicationis ut OS currit. Prius videamus quomodo OOM operatur et quomodo eam refrenet, et deinde vide quomodo OOM Occidens statuit utram applicationem terminare.

Praecipua opera Linux est memoriam processibus collocare cum id petunt. De more, processus vel applicationis memoriam ab OS petit, sed ea plene non utitur. Si OS memoriam dederit omni poscenti sed consilio uti non habet, propediem memoria deficiet et ratio deficiet. Ad hoc evitandum, OS memoriam in processu reservat, sed non actu dimittit. Memoria sortita est solum cum processus actu utatur. Accidit ut OS memoriam liberam non habeat, sed memoriam processui assignet et cum processu indiget, OS eam si potest allatit. In downside est quod interdum memoriam reservat OS, sed in tempore non est sine memoria et ratio ruinis. OOM magni ponderis munus in hoc missione agit et processus terminat ne nucleus a panico. Cum processus PostgreSQL terminare cogitur, nuntius in sextario apparet:

Out of Memory: Killed process 12345 (postgres).

Si ratio memoriae gravis est et liberari non potest, munus appellatur out_of_memory. In hac scaena, unum tantum restat ad faciendum - integram unam vel plures processus. Utrum OOM-homicida processum terminare statim vel expectare potest? Uti patet, cum extra memoriam vocatur, debitum est exspectare operationem I/O vel paging in disco. Ergo OOM interfector primum debet compescere et, secundum eos, decernunt processum necessario terminandum esse. Si omnes repressiones infra positivas sunt, OOM processum terminabit.

Processus lectio

Cum memoria excurrit, munus vocatur out_of_memory(). Hoc munus habet select_bad_process()quae aestimationem accipit ab officio badness(). Processus "pessimus" iaculis erit. Officium badness() processus eligit secundum certas regulas.

  1. Acinum quoddam minimum in se eget memoria.
  2. Liberare memoriam multum debes.
  3. Nihil opus est processibus terminare qui memoriae parum utantur.
  4. Processus minimus absolvendus est.
  5. Algorithmi complexi qui casus complementi augent pro illis processibus quos ipse user perficere vult.

His omnibus checks, OOM score examinat.oom_score). OOM ponit oom_score unumquodque processum, et tunc multiplicat hunc valorem per quantitatem memoriae. Processus cum maioribus valoribus magis verisimile est victimam in OOM interfectorem cadere. Processus associati cum usore radicis score inferiorem habent et minus verisimile est ad terminandum cogendi.

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

Processus Postgres ID est 3813, ergo in alia testa fieri potest ut score utens hoc nucleo parametri oom_score:

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

Si non vis OOM-interfectorem processus omnino interficere, alia optio nuclei est: oom_score_adj. Magnam negativam adde valorem minuendi casus perficiendi processum quem facis.

sudo echo -100 > /proc/3813/oom_score_adj

Ad valorem oom_score_adjpone OOMScoreAdjust in clausurae servitio:

[Service]
OOMScoreAdjust=-1000

Aut uti oomprotect in quadrigis rcctl.

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

Vis terminatio processus

Cum unus vel plures processus iam delecti sunt, munus vocat OOM-Creditor oom_kill_task(). Hoc munus dat processus terminationem signum. In casu memoriae inopia oom_kill() Hoc munus vocat ut signum processus SIGKILL mittat. Epistula ad nucleum scrib.

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

Quomodo regere OOM-Killer

De Linux, potes efficere vel disable OOM-Killer (quamvis haec non commendatur). Ad enable vel disable uti parametri vm.oom-kill. Ut OOM-interfectorem ad runtime, currite mandatum sysctl.

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

To disable OOM-Killer, specificare valorem 0 in eodem imperio;

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

Hoc mandatum non erit in aeternum, sed usque ad primum reboot. Si pertinacius opus est, hanc lineam tabella adice /etc/sysctl.conf:

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

Alio modo ut possit et inactivum est scribere variabilem panic_on_oom. Valor semper sedatus in /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Si 0 pretium posueris, tunc cum memoria deficit, nullus terror nucleus erit.

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

Si 1 pretium tibi posueris, tum cum memoria deficit, nucleus terror erit.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Interfectorem non solum interdum verti potest. Iam diximus Linux plus memoriae causarum processuum reservare posse quam praesto est sine re ipsa collocare, et haec agendi ratio per modulum nuclei Linux regitur. Variabilis reus est vm.overcommit_memory.

Determinare sequentes valores pro eo potes:

0: Ipsum nucleum decernit an nimium memoriam reservet. Hic est defectus in plerisque Linux versionibus.
1: nucleus extra memoriam semper reservabit. Periculosum est, quod memoria defluat, quod fere dies processus requiret.
2: nucleus non plus memoriae reservabit quam denotatum in modulo overcommit_ratio.

Hoc modulo, memoriam recipis quae plus reservari permittitur. Si nullus ei locus, nulla memoria collocatur, et reservatio negabitur. Haec optio tutissima commendatur pro PostgreSQL. OOM-interfectore alio elemento afficitur - permutandi facultate, quae ab invariabili regitur cat /proc/sys/vm/swappiness. Haec bona nucleum indica quomodo paginas tractamus. Quo utilior valor, eo minus probabile est quod OOM processum terminabit, sed ob operationes I/O negativam datorum habet. Et vice versa - minoris pretii, altior in interventu verisimilitudo OOM-Kinsoris, sed etiam altior perficientur datorum. Defalta valor 60 est, sed si totum datorum memoria convenit, melius est quanti 1 .

results

Ne permittas "interfectorem" in OOM-interfectorem te terrent. In hoc casu, interfector rationi tuae servator erit. Is "occidat" processibus pessimis et systema a fragore servat. Ad ne uti OOM-Creditor terminetur PostgreSQL, pone to vm.overcommit_memory valorem 2. Hoc non praestat ut OOM-Killer intervenire non debebit, sed verisimilitudinem minuet cogendi processum PostgreSQL ad terminandum.

Source: www.habr.com