Interfectorem Memoriae Deficientis constituere in Linux pro PostgreSQL

Interfectorem Memoriae Deficientis constituere in Linux pro PostgreSQL

Cum in Linux Servus datorum subito terminatur, et causa determinanda est. Plures causae esse possunt. 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 tu server vel processus memoria caret, Linux Interfector Memoriae Deficientis duas solutiones offert: vel totum systema corruere vel processum (applicationem) qui memoriam consumit terminare. Melius est, scilicet, processum terminare et systema operandi a ruina servare. Breviter, Interfector Memoriae Deficientis est processus qui applicationem terminat ut nucleus a ruina servetur. Applicationem sacrificat ut systema operandi currat. Primum disseramus quomodo OOM operatur et quomodo id moderari, deinde inspiciamus quomodo Interfector OOM decernit quas applicationes terminare.

Unum ex praecipuis muneribus Linux — Memoriam processibus assigna cum eam petunt. Typice, processus vel applicatio memoriam a systemate operativo petit sed non eam plene utitur. Si systema operandi memoriam omnibus petentibus assignat sed eam uti non cogitat, systema cito memoria carebit, et systema corruet. Ad hoc vitandum, systema operandi memoriam processui reservat sed eam actu non assignat. Memoria assignatur tantum cum processus actu eam uti intendit. Interdum systema operandi memoriam liberam non habet, sed memoriam processui assignat, et cum processus eam requirit, systema operandi eam assignat si potest. Incommodum est quod interdum systema operandi memoriam reservat, sed cum opus est, nulla memoria libera est, quod ruinam systematis causat. OOM munus clavem in hoc casu agit, processus terminans ne nucleus panico afficiatur. Cum processus PostgreSQL vi terminatur, sequens nuntius in registro 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

В Linux OOM-Killer vel activare vel inactivare potes (quamquam hoc posterius non commendatur). Ad id activandum vel inactivandum, parametro utere. 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-Killer, ut iam diximus, accendi et extingui potest. Linux Fortasse plus memoriae processibus reservatur quam praesto est, sed eam re vera non assignatur, et hoc actum a parametro nuclei regitur. LinuxVariabilis huius rei responsabilis est. vm.overcommit_memory.

Determinare sequentes valores pro eo potes:

0: Ipse nucleus decernit utrum nimium memoriae reservetur necne. Hic valor implicitus est in plerisque versionibus. Linux.
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

Emptum certos hospites pro locis cum praesidio DDoS, VPS VDS servers 🔥 Eme hospitium interretiale fidum cum praesidio DDoS, servitores VPS VDS | ProHoster