Sefydlu Killer Out-of-Memory yn Linux ar gyfer PostgreSQL

Sefydlu Killer Out-of-Memory yn Linux ar gyfer PostgreSQL

Pan fydd gweinydd cronfa ddata yn rhoi'r gorau iddi yn annisgwyl yn Linux, mae angen ichi ddod o hyd i'r rheswm. Gall 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 fydd gweinydd neu broses yn rhedeg allan o gof, mae Linux yn cynnig 2 ateb: chwalu'r system gyfan neu derfynu'r broses (cais) sy'n bwyta cof i fyny. Mae'n well, wrth gwrs, terfynu'r broses ac arbed yr OS rhag chwalu. Yn gryno, mae Out-Of-Memory Killer yn broses sy'n lladd cais i arbed y cnewyllyn rhag damwain. Mae'n aberthu'r cais i gadw'r OS yn rhedeg. Gadewch i ni drafod yn gyntaf sut mae OOM yn gweithio a sut i'w reoli, ac yna gweld sut mae OOM Killer yn penderfynu pa gais i'w derfynu.

Un o brif dasgau Linux yw dyrannu cof i brosesau pan fyddant yn gofyn amdano. Yn nodweddiadol, mae proses neu raglen yn gofyn am gof gan yr OS, ond nid yw'n ei ddefnyddio'n llawn. Os yw'r OS yn rhoi cof i bawb sy'n gofyn amdano ond heb unrhyw gynlluniau i'w ddefnyddio, yn fuan iawn bydd y cof yn rhedeg allan a bydd y system yn methu. Er mwyn osgoi hyn, mae'r OS yn cadw cof ar gyfer y broses, ond nid yw'n ei ryddhau mewn gwirionedd. Dyrennir cof dim ond pan fydd proses yn mynd i'w defnyddio mewn gwirionedd. Mae'n digwydd nad oes gan yr OS gof am ddim, ond mae'n aseinio cof i broses, a phan fydd ei angen ar broses, mae'r OS yn ei ddyrannu os gall. Yr anfantais yw bod yr OS weithiau'n cadw cof, ond ar yr amser iawn nid oes cof am ddim, ac mae'r system yn chwalu. Mae OOM yn chwarae rhan bwysig yn y senario hwn ac yn terfynu prosesau i atal y cnewyllyn rhag mynd i banig. Pan fydd proses PostgreSQL yn cael ei gorfodi i derfynu, mae neges 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

Ar Linux, gallwch chi alluogi neu analluogi OOM-Killer (er nad yw'r olaf yn cael ei argymell). I alluogi neu 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

Nid yn unig y gellir troi OOM-Killer ymlaen ac i ffwrdd. Rydym eisoes wedi dweud y gall Linux gadw mwy o gof ar gyfer prosesau nag sydd ar gael heb ei ddyrannu mewn gwirionedd, ac mae'r ymddygiad hwn yn cael ei reoli gan baramedr cnewyllyn Linux. Y newidyn sy'n gyfrifol am hyn vm.overcommit_memory.

Gallwch chi nodi'r gwerthoedd canlynol ar ei gyfer:

0: Mae'r cnewyllyn ei hun yn penderfynu a ddylid cadw gormod o gof. Dyma'r rhagosodiad ar y rhan fwyaf o fersiynau o 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

Ychwanegu sylw