Tiwnio Opsiynau Cnewyllyn Linux i Optimeiddio PostgreSQL

Tiwnio Opsiynau Cnewyllyn Linux i Optimeiddio PostgreSQL Mae'r perfformiad PostgreSQL gorau posibl yn dibynnu ar baramedrau system weithredu sydd wedi'u diffinio'n gywir. Gall gosodiadau cnewyllyn OS sydd wedi'u ffurfweddu'n wael arwain at berfformiad gweinydd cronfa ddata gwael. Felly, mae'n hanfodol bod y gosodiadau hyn yn cael eu ffurfweddu yn unol â gweinydd y gronfa ddata a'i lwyth gwaith. Yn y swydd hon, byddwn yn trafod rhai paramedrau cnewyllyn Linux pwysig a all effeithio ar berfformiad gweinydd cronfa ddata a sut i'w ffurfweddu.

SHMMAX / SHMALL

SHMMAX yn baramedr cnewyllyn a ddefnyddir i bennu maint mwyaf un segment cof a rennir y gall proses Linux ei ddyrannu. Cyn fersiwn 9.2, roedd PostgreSQL yn defnyddio System V (SysV), sy'n gofyn am y gosodiad SHMMAX. Ar ôl 9.2, newidiodd PostgreSQL i gof a rennir POSIX. Felly nawr mae angen llai o beit o gof a rennir System V.

Cyn fersiwn 9.3, SHMMAX oedd y paramedr cnewyllyn pwysicaf. Mae gwerth SHMMAX wedi'i nodi mewn beit.

Yn yr un modd BRYCHAIN yn baramedr cnewyllyn arall a ddefnyddir i benderfynu
cyfaint system gyfan o dudalennau cof a rennir. I weld y gwerthoedd SHMMAX, SHMALL, neu SHMMIN cyfredol, defnyddiwch y gorchymyn ipcs.

Manylion SHM* - Linux

$ ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 1073741824
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1

Manylion SHM* - MacOS X

$ ipcs -M
IPC status from  as of Thu Aug 16 22:20:35 PKT 2018
shminfo:
	shmmax: 16777216	(max shared memory segment size)
	shmmin:       1	(min shared memory segment size)
	shmmni:      32	(max number of shared memory identifiers)
	shmseg:       8	(max shared memory segments per process)
	shmall:    1024	(max amount of shared memory in pages)

Defnyddiau PostgreSQL System V IPC i ddyrannu cof a rennir. Mae'r paramedr hwn yn un o'r paramedrau cnewyllyn pwysicaf. Pryd bynnag y byddwch yn derbyn y negeseuon gwall canlynol, mae'n golygu bod gennych fersiwn hŷn o PostgreSQL ac mae eich gwerth SHMMAX yn isel iawn. Disgwylir i ddefnyddwyr addasu a chynyddu'r gwerth yn ôl y cof a rennir y maent yn bwriadu ei ddefnyddio.

Gwallau camgyflunio posibl

Os nad yw SHMMAX wedi'i ffurfweddu'n gywir, efallai y byddwch yn derbyn gwall wrth geisio cychwyn clwstwr PostgreSQL gan ddefnyddio'r gorchymyn initdb.

initdb Methiant
DETAIL: Failed system call was shmget(key=1, size=2072576, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. 
You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 2072576 bytes),
reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration. child process exited with exit code 1

Yn yr un modd, efallai y byddwch yn derbyn gwall wrth gychwyn y gweinydd PostgreSQL gan ddefnyddio'r gorchymyn tud_ctl.

pg_ctl Methiant
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.

You can either reduce the request size or reconfigure the kernel with larger SHMMAX.; To reduce the request size (currently 14385152 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration.

Deall y gwahaniaethau mewn diffiniadau

Mae diffinio paramedrau SHMMAX / SHMALL ychydig yn wahanol ar Linux a MacOS X:

  • Linux: kernel.shmmax, kernel.shmall
  • MacOS X: kern.sysv.shmmax, kern.sysv.shmall

Tîm sysctl gellir ei ddefnyddio i newid y gwerth dros dro. I osod gwerthoedd cyson, ychwanegwch gofnod i /etc/sysctl.conf. Ceir manylion isod.

Newid Gosodiadau Cnewyllyn ar MacOS X

# Get the value of SHMMAX
sudo sysctl kern.sysv.shmmax
kern.sysv.shmmax: 4096

# Get the value of SHMALL
sudo sysctl kern.sysv.shmall 
kern.sysv.shmall: 4096

# Set the value of SHMMAX
sudo sysctl -w kern.sysv.shmmax=16777216
kern.sysv.shmmax: 4096 -> 16777216

# Set the value of SHMALL 
sudo sysctl -w kern.sysv.shmall=16777216
kern.sysv.shmall: 4096 -> 16777216

Newid Paramedrau Cnewyllyn ar Linux

# Get the value of SHMMAX
sudo sysctl kernel.shmmax
kernel.shmmax: 4096

# Get the value of SHMALL
sudo sysctl kernel.shmall
kernel.shmall: 4096

# Set the value of SHMMAX
sudo sysctl -w kernel.shmmax=16777216
kernel.shmmax: 4096 -> 16777216

# Set the value of SHMALL 
sudo sysctl -w kernel.shmall=16777216
kernel.shmall: 4096 -> 16777216

Peidiwch ag anghofio: I wneud newidiadau yn barhaol, ychwanegwch y gwerthoedd hyn i /etc/sysctl.conf

Tudalennau Anferth

Mae Linux yn defnyddio tudalennau cof 4 KB yn ddiofyn, mae BSD yn defnyddio tudalennau cof XNUMX KB. Tudalennau Gwych, ac ar Windows - Tudalennau Mawr. Mae tudalen yn ddarn o RAM a neilltuwyd i broses. Gall proses gael tudalennau lluosog yn dibynnu ar ofynion cof. Po fwyaf o gof sydd ei angen ar broses, y mwyaf o dudalennau y caiff ei ddyrannu. Mae'r OS yn cadw tabl dyrannu tudalennau ar gyfer prosesau. Y lleiaf yw maint y dudalen, y mwyaf yw'r tabl, yr hiraf y mae'n ei gymryd i ddod o hyd i dudalen yn y tabl tudalen hwnnw. Mae tudalennau mawr felly yn caniatáu defnyddio llawer iawn o gof gyda gorbenion gostyngol; llai o ymweliadau â thudalennau, llai o ddiffygion tudalennau, gweithrediadau darllen/ysgrifennu cyflymach dros glustogau mwy. Y canlyniad yw gwell perfformiad.

Dim ond tudalennau mawr ar Linux y mae PostgreSQL yn eu cefnogi. Yn ddiofyn, mae Linux yn defnyddio tudalennau cof 4 KB, felly mewn achosion lle mae gormod o weithrediadau cof, mae angen gosod tudalennau mwy. Gwelir enillion perfformiad wrth ddefnyddio tudalennau mawr o 2 MB a hyd at 1 GB. Gellir gosod maint y dudalen fawr ar amser cychwyn. Gallwch chi wirio paramedrau'r tudalennau mawr a'u defnydd ar eich peiriant Linux yn hawdd gan ddefnyddio'r gorchymyn cath /proc/meminfo | grep -i enfawr.

Cael gwybodaeth am dudalennau mawr (Linux yn unig)

Note: This is only for Linux, for other OS this operation is ignored$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

Yn yr enghraifft hon, er bod maint y dudalen fawr wedi'i osod i 2048 (2 MB), mae cyfanswm y tudalennau mawr wedi'i osod i 0. Mae hyn yn golygu bod tudalennau mawr wedi'u hanalluogi.

Sgript ar gyfer pennu nifer y tudalennau mawr

Mae'r sgript syml hon yn dychwelyd y nifer gofynnol o dudalennau mawr. Rhedeg y sgript ar eich gweinydd Linux tra bod PostgreSQL yn rhedeg. Gwnewch yn siŵr hynny ar gyfer y newidyn amgylchedd $PGDATA Mae cyfeiriadur data PostgreSQL wedi'i nodi.

Cael y nifer o dudalennau mawr gofynnol

#!/bin/bash
pid=`head -1 $PGDATA/postmaster.pid`
echo "Pid:            $pid"
peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`
echo "VmPeak:            $peak kB"
hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`
echo "Hugepagesize:   $hps kB"
hp=$((peak/hps))
echo Set Huge Pages:     $hp

Mae allbwn y sgript yn edrych fel hyn:

Allbwn sgript

Pid:            12737
VmPeak:         180932 kB
Hugepagesize:   2048 kB
Set Huge Pages: 88

Y gwerth a argymhellir ar gyfer tudalennau mawr yw 88, felly dylech ei osod i 88.

Gosod Tudalennau Mawr

sysctl -w vm.nr_hugepages=88

Gwiriwch dudalennau mawr nawr, fe welwch nad yw tudalennau mawr yn cael eu defnyddio (HugePages_Free = HugePages_Total).

Ailymweld â thudalennau mawr (Linux yn unig)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       88
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

Nawr gosodwch y paramedr huge_pages i "ymlaen" yn $PGDATA/postgresql.conf ac ailgychwynwch y gweinydd.

Unwaith eto, gwybodaeth am dudalennau mawr (Linux yn unig)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       81
HugePages_Rsvd:       64
HugePages_Surp:        0
Hugepagesize:       2048 kB

Nawr gallwch weld mai ychydig iawn o dudalennau mawr sy'n cael eu defnyddio. Gadewch i ni nawr geisio ychwanegu rhywfaint o ddata i'r gronfa ddata.

Rhai gweithrediadau cronfa ddata i ailgylchu tudalennau mawr

postgres=# CREATE TABLE foo(a INTEGER);
CREATE TABLE
postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));
INSERT 0 10000000

Gadewch i ni weld a ydym yn defnyddio mwy o dudalennau mawr nawr nag o'r blaen.

Mwy o wybodaeth ar dudalennau mawr (Linux yn unig)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       18
HugePages_Rsvd:        1
HugePages_Surp:        0
Hugepagesize:       2048 kB

Nawr gallwch weld bod y rhan fwyaf o'r tudalennau mawr yn cael eu defnyddio.

Nodyn: Mae'r gwerth amcangyfrifedig ar gyfer HugePages a ddefnyddir yma yn isel iawn, nad yw'n werth arferol ar gyfer peiriant sy'n rhedeg amgylchedd cynnyrch. Amcangyfrifwch y nifer gofynnol o dudalennau ar gyfer eich system a'u gosod yn unol â hynny ar sail llwyth ac adnoddau.

vm.swappiness

vm.swappiness yn baramedr cnewyllyn arall a all effeithio ar berfformiad cronfa ddata. Defnyddir yr opsiwn hwn i reoli ymddygiad cyfnewid (cyfnewid tudalennau i mewn ac allan o'r cof) yn Linux. Mae'r gwerth yn amrywio o 0 i 100. Mae'n pennu faint o gof fydd yn cael ei dudalenu neu ei dudalenu. Mae sero yn golygu dim cyfnewid ac mae 100 yn golygu cyfnewid ymosodol.

Gallwch gael perfformiad da trwy osod gwerthoedd is.

Gall gosod hwn i 0 ar gnewyllyn mwy newydd achosi i OOM Killer (proses glanhau cof Linux) ladd y broses. Felly mae'n ddiogel ei osod i 1 os ydych am leihau cyfnewid. Y gwerth rhagosodedig yn Linux yw 60. Mae gwerth uwch yn achosi i'r MMU (uned rheoli cof) ddefnyddio mwy o ofod cyfnewid na RAM, tra bod gwerth is yn cadw mwy o ddata/cod yn y cof.

Mae gwerth is yn bet da ar gyfer gwell perfformiad yn PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Mae cymwysiadau yn caffael cof ac yn ei ryddhau pan nad oes ei angen mwyach. Ond mewn rhai achosion, mae'r cais yn cael gormod o gof ac nid yw'n ei ryddhau. Gall hyn achosi lladdwr OOM. Dyma'r gwerthoedd paramedr posibl vm.overcommit_cof gyda disgrifiad ar gyfer pob un:

  1. Gor-ymrwymiad hewristig (diofyn); hewristig ar sail cnewyllyn
  2. Caniatewch or-ymrwymo beth bynnag
  3. Peidiwch â gorwneud pethau, peidiwch â mynd y tu hwnt i'r gymhareb gor-ymrwymo.

Cyfeirnod: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_cymhareb - canran yr RAM sydd ar gael i'w orlwytho. Gall gwerth o 50% ar system gyda 2 GB o RAM ddyrannu hyd at 3 GB o RAM.

Mae gwerth o 2 ar gyfer vm.overcommit_memory yn darparu perfformiad gwell ar gyfer PostgreSQL. Mae'r gwerth hwn yn gwneud y mwyaf o ddefnydd RAM proses y gweinydd heb unrhyw risg sylweddol o gael ei ladd gan y broses lladd OOM. Bydd y cais yn gallu ail-lwytho, ond dim ond o fewn terfynau gor-redeg, sy'n lleihau'r risg o laddwr OOM yn lladd y broses. Felly, mae gwerth 2 yn rhoi perfformiad gwell na gwerth rhagosodedig 0. Fodd bynnag, gellir gwella dibynadwyedd trwy sicrhau nad yw cof y tu allan i'r ystod yn cael ei orlwytho. Mae hyn yn dileu'r risg y bydd y broses yn cael ei lladd gan lofrudd OOM.

Ar systemau heb gyfnewid, gall problem gyda vm.overcommit_memory hafal i 2 ddigwydd.

https://www.postgresql.org/docs/current/static/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT

vm.dirty_background_cymhareb / ​​vm.dirty_background_bytes

vm.dirty_background_cymhareb yw canran y cof wedi'i lenwi â thudalennau budr y mae angen eu hysgrifennu ar ddisg. Mae'r fflysio i ddisg yn digwydd yn y cefndir. Mae gwerth y paramedr hwn yn amrywio o 0 i 100; fodd bynnag, gall gwerth o dan 5 fod yn aneffeithiol ac nid yw rhai cnewyllyn yn ei gefnogi. 10 yw'r rhagosodiad ar y mwyafrif o systemau Linux. Gallwch wella perfformiad gweithrediadau ysgrifennu-ddwys gan ffactor llai, a fydd yn golygu y bydd Linux yn fflysio tudalennau budr yn y cefndir.

Mae angen i chi osod y gwerth vm.dirty_background_bytes yn dibynnu ar gyflymder eich gyriant.

Nid oes unrhyw werthoedd "da" ar gyfer y ddau baramedr hyn gan fod y ddau yn dibynnu ar galedwedd. Fodd bynnag, mae gosod cymhareb vm.dirty_background_bytes i 5 a vm.dirty_background_bytes i 25% o gyflymder disg yn gwella perfformiad i ~25% yn y rhan fwyaf o achosion.

vm.dirty_cymhareb/dirty_bytes

Mae yr un peth â vm.dirty_background_cymhareb/dirty_background_bytes, ac eithrio bod yr ailosod yn cael ei berfformio mewn sesiwn gweithiwr, gan rwystro'r cais. Felly dylai vm.dirty_ratio fod yn uwch na vm.dirty_background_cymhareb. Mae hyn yn sicrhau bod prosesau cefndir yn cychwyn yn gynharach er mwyn osgoi rhwystro'r cais gymaint â phosibl. Gallwch chi addasu'r gwahaniaeth rhwng y ddwy gymhareb hyn yn dibynnu ar lwyth I/O y ddisg.

Cyfanswm

Gallwch newid gosodiadau eraill i wella perfformiad, ond bydd y gwelliannau'n fach iawn ac ni fyddwch yn gweld llawer o fudd. Rhaid inni gofio nad yw pob opsiwn yn berthnasol i bob math o gais. Mae rhai apiau'n gweithio'n well pan fyddwn yn addasu rhai gosodiadau, ac nid yw rhai yn gwneud hynny. Rhaid i chi ddod o hyd i'r cydbwysedd cywir rhwng ffurfweddu'r gosodiadau hyn ar gyfer eich llwyth gwaith disgwyliedig a'r math o gais, a rhaid i chi hefyd ystyried ymddygiad OS wrth diwnio. Nid yw ffurfweddu paramedrau cnewyllyn mor hawdd â ffurfweddu paramedrau cronfa ddata; mae'n anoddach gwneud argymhellion.

Ffynhonnell: hab.com

Ychwanegu sylw