Gosod Lladdwr Allan o Gof yn Linux ar gyfer PostgreSQL

Gosod Lladdwr Allan o Gof yn Linux ar gyfer PostgreSQL

Pan i mewn Linux Mae gweinydd y gronfa ddata yn terfynu'n annisgwyl, ac mae angen pennu'r achos. Gallai fod sawl rheswm. Er enghraifft, SIGSEGV — methiant oherwydd nam yn y gweinydd backend. Ond mae hyn yn brin. Yn fwyaf aml, rydych chi'n rhedeg allan o ofod disg neu gof. Os byddwch yn rhedeg allan o ofod disg, dim ond un ffordd allan sydd - rhyddhewch le ac ailgychwyn y gronfa ddata.

Lladdwr Allan-O-Cof

Pan fyddwch chi gweinydd neu mae'r broses yn rhedeg allan o gof, Linux Mae'r Out-Of-Memory Killer yn cynnig dau ateb: chwalu'r system gyfan neu derfynu'r broses (rhaglen) sy'n bwyta cof. Mae'n well, wrth gwrs, terfynu'r broses ac achub y system weithredu rhag chwalu. Yn fyr, mae'r Out-Of-Memory Killer yn broses sy'n terfynu rhaglen i achub y cnewyllyn rhag chwalu. Mae'n aberthu'r rhaglen i gadw'r system weithredu i redeg. Gadewch i ni drafod yn gyntaf sut mae OOM yn gweithio a sut i'w reoli, ac yna edrych ar sut mae'r OOM Killer yn penderfynu pa raglenni i'w terfynu.

Un o'r prif dasgau Linux — Dyrannu cof i brosesau pan fyddant yn gofyn amdano. Yn nodweddiadol, mae proses neu gymhwysiad yn gofyn am gof gan y system weithredu ond nid yw'n ei ddefnyddio'n llwyr. Os yw'r system weithredu yn dyrannu cof i bawb sy'n gofyn amdano ond nad yw'n bwriadu ei ddefnyddio, bydd y system yn rhedeg allan o gof yn gyflym, a bydd y system yn chwalu. I atal hyn, mae'r system weithredu yn cadw cof ar gyfer proses ond nid yw'n ei ddyrannu mewn gwirionedd. Dim ond pan fydd proses yn bwriadu ei ddefnyddio mewn gwirionedd y caiff cof ei ddyrannu. Weithiau nid oes gan y system weithredu gof rhydd, ond mae'n dyrannu cof i broses, a phan fydd ei angen ar y broses, mae'r system weithredu yn ei ddyrannu os gall. Yr anfantais yw bod y system weithredu weithiau'n cadw cof, ond pan fo angen, nid oes cof rhydd, gan achosi chwalfa system. Mae OOM yn chwarae rhan allweddol yn y senario hwn, gan derfynu prosesau i atal y cnewyllyn rhag panicio. Pan gaiff y broses PostgreSQL ei therfynu'n orfodol, mae'r neges ganlynol yn ymddangos yn y log:

Out of Memory: Killed process 12345 (postgres).

Os yw'r system yn isel ar gof ac ni ellir ei rhyddhau, gelwir y swyddogaeth out_of_memory. Ar y cam hwn, dim ond un peth sydd ganddi i'w wneud - cwblhau un neu fwy o brosesau. A ddylai OOM-killer derfynu'r broses ar unwaith neu a all aros? Yn amlwg, pan elwir out_of_memory, mae oherwydd aros am lawdriniaeth I/O neu paging i ddisg. Felly, rhaid i'r lladdwr OOM berfformio gwiriadau yn gyntaf ac, yn seiliedig arnynt, benderfynu bod angen terfynu'r broses. Os yw'r holl wiriadau isod yn bositif, bydd OOM yn terfynu'r broses.

Dewis prosesau

Pan fydd cof yn rhedeg allan, gelwir y swyddogaeth out_of_memory(). Mae ganddo swyddogaeth select_bad_process(), sy'n derbyn gwerthusiad gan y swyddogaeth badness(). Bydd y broses “waethaf” yn cael ei thargedu. Swyddogaeth badness() yn dewis proses yn unol â rheolau penodol.

  1. Mae angen rhywfaint o gof lleiaf ar y cnewyllyn iddo'i hun.
  2. Mae angen i chi ryddhau llawer o gof.
  3. Nid oes angen terfynu prosesau sy'n defnyddio ychydig o gof.
  4. Mae angen cwblhau'r prosesau lleiaf.
  5. Algorithmau cymhleth sy'n cynyddu'r siawns o gwblhau'r prosesau hynny y mae'r defnyddiwr ei hun am eu cwblhau.

Ar ôl cwblhau'r holl wiriadau hyn, mae OOM yn archwilio'r sgôr (oom_score). Mae OOM yn aseinio oom_score pob proses, ac yna'n lluosi'r gwerth hwn â faint o gof. Mae prosesau â gwerthoedd mwy yn fwy tebygol o ddioddef y Killer OOM. Mae gan brosesau sy'n gysylltiedig â'r defnyddiwr gwraidd sgôr is ac maent yn llai tebygol o gael eu gorfodi i derfynu.

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

ID proses Postgres yw 3813, felly mewn cragen arall mae'n bosibl cael y sgôr gan ddefnyddio'r paramedr cnewyllyn hwn oom_score:

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

Os nad ydych chi am i OOM-Killer ladd y broses o gwbl, mae yna opsiwn cnewyllyn arall: oom_score_adj. Ychwanegwch werth negyddol mawr i leihau'r siawns o gwblhau proses rydych chi'n ei gwerthfawrogi.

sudo echo -100 > /proc/3813/oom_score_adj

I osod gwerth oom_score_adj, gosodwch OOMScoreAdjust yn y bloc gwasanaeth:

[Service]
OOMScoreAdjust=-1000

Neu defnyddiwch oomprotect mewn tîm rcctl.

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

Llu terfynu proses

Pan fydd un neu fwy o brosesau eisoes wedi'u dewis, mae OOM-Killer yn galw'r swyddogaeth oom_kill_task(). Mae'r swyddogaeth hon yn anfon signal terfynu i'r broses. Mewn achos o brinder cof oom_kill() Yn galw'r swyddogaeth hon i anfon signal SIGKILL i'r broses. Ysgrifennir neges i'r log cnewyllyn.

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

Sut i reoli OOM-Killer

В Linux Gallwch alluogi neu analluogi OOM-Killer (er nad yw'r olaf yn cael ei argymell). I'w alluogi neu ei analluogi, defnyddiwch y paramedr vm.oom-kill. I alluogi OOM-Killer ar amser rhedeg, rhedeg y gorchymyn sysctl.

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

I analluogi OOM-Killer, nodwch y gwerth 0 yn yr un gorchymyn:

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

Ni fydd canlyniad y gorchymyn hwn yn cael ei gadw am byth, ond dim ond tan yr ailgychwyn cyntaf. Os oes angen mwy o ddyfalbarhad, ychwanegwch y llinell hon at y ffeil /etc/sysctl.conf:

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

Ffordd arall o alluogi ac analluogi yw ysgrifennu newidyn panic_on_oom. Gellir gwirio'r gwerth bob amser /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Os ydych chi'n gosod y gwerth i 0, yna pan fydd y cof yn dod i ben, ni fydd unrhyw banig cnewyllyn.

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

Os ydych chi'n gosod y gwerth i 1, yna pan fydd y cof yn dod i ben, bydd panig cnewyllyn yn digwydd.

echo 1 > /proc/sys/vm/panic_on_oom

Gellir troi OOM-Killer ymlaen ac i ffwrdd, fel rydyn ni eisoes wedi sôn. Linux gall gadw mwy o gof ar gyfer prosesau nag sydd ar gael, ond nid ei ddyrannu mewn gwirionedd, ac mae'r ymddygiad hwn yn cael ei reoli gan baramedr cnewyllyn LinuxY newidyn sy'n gyfrifol am hyn. vm.overcommit_memory.

Gallwch chi nodi'r gwerthoedd canlynol ar ei gyfer:

0: Y cnewyllyn ei hun sy'n penderfynu a ddylid cadw gormod o gof. Dyma'r gwerth diofyn yn y rhan fwyaf o fersiynau. Linux.
1: Bydd y cnewyllyn bob amser yn cadw cof ychwanegol. Mae hyn yn beryglus, oherwydd gall y cof ddod i ben, oherwydd, yn fwyaf tebygol, un diwrnod bydd y prosesau ei angen.
2: ni fydd y cnewyllyn yn cadw mwy o gof nag a nodir yn y paramedr overcommit_ratio.

Gyda'r paramedr hwn, rydych chi'n nodi canran y cof y caniateir ei or-gadw. Os nad oes lle iddo, ni neilltuir cof, a gwrthodir yr archeb. Dyma'r opsiwn mwyaf diogel a argymhellir ar gyfer PostgreSQL. Mae elfen arall yn effeithio ar OOM-Killer - y gallu cyfnewid, sy'n cael ei reoli gan y newidyn cat /proc/sys/vm/swappiness. Mae'r gwerthoedd hyn yn dweud wrth y cnewyllyn sut i drin paging. Po uchaf yw'r gwerth, y lleiaf tebygol yw hi y bydd OOM yn terfynu'r broses, ond oherwydd gweithrediadau I/O mae'n cael effaith negyddol ar y gronfa ddata. Ac i'r gwrthwyneb - yr isaf yw'r gwerth, yr uchaf yw'r tebygolrwydd o ymyrraeth OOM-Killer, ond mae perfformiad y gronfa ddata hefyd yn uwch. Y gwerth rhagosodedig yw 60, ond os yw'r gronfa ddata gyfan yn ffitio yn y cof, mae'n well gosod y gwerth i 1.

Canlyniadau

Peidiwch â gadael i'r "lladdwr" yn OOM-Killer eich dychryn. Yn yr achos hwn, y llofrudd fydd gwaredwr eich system. Mae’n “lladd” y prosesau gwaethaf ac yn arbed y system rhag chwalu. Er mwyn osgoi gorfod defnyddio OOM-Killer i derfynu PostgreSQL, gosodwch i vm.overcommit_memory gwerth 2. Nid yw hyn yn gwarantu na fydd yn rhaid i OOM-Killer ymyrryd, ond bydd yn lleihau'r tebygolrwydd o orfodi proses PostgreSQL i ddod i ben.

Ffynhonnell: hab.com

Prynu gwesteio dibynadwy ar gyfer gwefannau sydd â diogelwch DDoS, gweinyddwyr VPS VDS 🔥 Prynu cynnal gwefannau dibynadwy gyda diogelwch DDoS, gweinyddion VPS VDS | ProHoster