Konfigurera kÀrnparametrar Linux för att optimera PostgreSQL

Konfigurera kÀrnparametrar Linux för att optimera PostgreSQL Optimal PostgreSQL-prestanda Àr beroende av korrekt konfigurerade operativsystemparametrar. DÄligt konfigurerade kÀrnparametrar kan leda till försÀmrad databasserverprestanda. DÀrför Àr det viktigt att konfigurera dessa parametrar pÄ lÀmpligt sÀtt för databasservern och dess arbetsbelastning. I det hÀr inlÀgget kommer vi att diskutera nÄgra viktiga kÀrnparametrar. Linux, vilket kan pÄverka databasserverns prestanda och hur man konfigurerar dem.

SHMMAX / SHMALL

SHMMAX — Ă€r en kĂ€rnparameter som anvĂ€nds för att bestĂ€mma den maximala storleken pĂ„ ett enskilt delat minnessegment som en process kan allokera. LinuxFöre version 9.2 anvĂ€nde PostgreSQL System V (SysV), vilket krĂ€ver SHMMAX-instĂ€llningen. Efter 9.2 bytte PostgreSQL till delat POSIX-minne. Detta innebĂ€r att fĂ€rre byte av delat System V-minne nu krĂ€vs.

Före version 9.3 var SHMMAX den viktigaste kÀrnparametern. SHMMAX-vÀrdet anges i byte.

Liknande, SHMALL Àr en annan kÀrnparameter som anvÀnds för att bestÀmma
systemomfattande volym av delade minnessidor. För att se aktuella SHMMAX-, SHMALL- eller SHMMIN-vÀrden, anvÀnd kommandot ipcs.

SHM* Detaljer — 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

SHM* Detaljer - 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)

PostgreSQL anvÀnder System V IPC för att tilldela delat minne. Denna parameter Àr en av de viktigaste kÀrnparametrarna. NÀr du fÄr följande felmeddelanden betyder det att du har en Àldre version av PostgreSQL och att ditt SHMMAX-vÀrde Àr mycket lÄgt. AnvÀndare förvÀntas justera och öka vÀrdet enligt det delade minnet de tÀnker anvÀnda.

Möjliga felkonfigurationsfel

Om SHMMAX inte Àr korrekt konfigurerat kan du fÄ ett felmeddelande nÀr du försöker initiera ett PostgreSQL-kluster med kommandot initdb.

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

TIPS: Det hĂ€r felet betyder vanligtvis att PostgreSQLs begĂ€ran om ett delat minnessegment överskred din kĂ€rnas SHMMAX-parameter. 
Du kan antingen minska förfrÄgningsstorleken eller omkonfigurera kÀrnan med större SHMMAX. För att minska begÀranstorleken (för nÀrvarande 2072576 byte),
minska PostgreSQLs delade minnesanvÀndning, kanske genom att minska shared_buffers eller max_connections.

Om förfrÄgningsstorleken redan Àr liten Àr det möjligt att den Àr mindre Àn din kÀrnas SHMMIN-parameter,
i vilket fall det krÀvs att man ökar förfrÄgningsstorleken eller konfigurerar om SHMMIN.

PostgreSQL-dokumentationen innehÄller mer information om konfiguration av delat minne. barnprocessen avslutades med avslutningskod 1

PÄ samma sÀtt kan du fÄ ett felmeddelande nÀr du startar PostgreSQL-servern med kommandot pg_ctl.

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

TIPS: Det hÀr felet betyder vanligtvis att PostgreSQLs begÀran om ett delat minnessegment överskred din kÀrnas SHMMAX-parameter.

Du kan antingen minska förfrÄgningsstorleken eller omkonfigurera kÀrnan med större SHMMAX. För att minska förfrÄgningsstorleken (för nÀrvarande 14385152 byte), minska PostgreSQLs delade minnesanvÀndning, kanske genom att minska shared_buffers eller max_connections.

Om förfrÄgningsstorleken redan Àr liten Àr det möjligt att den Àr mindre Àn din kÀrnas SHMMIN-parameter,
i vilket fall det krÀvs att man ökar förfrÄgningsstorleken eller konfigurerar om SHMMIN.

PostgreSQL-dokumentationen innehÄller mer information om konfiguration av delat minne.

FörstÄ skillnaderna i definitioner

Definitionen av SHMMAX/SHMALL-parametrarna Àr nÄgot annorlunda i Linux och MacOS X:

  • LinuxkĂ€rna.shmmax, kĂ€rna.shmall
  • MacOS X: kern.sysv.shmmax, kern.sysv.shmall

Team sysctl kan anvÀndas för att tillfÀlligt Àndra vÀrdet. LÀgg till en post för att stÀlla in konstanta vÀrden /etc/sysctl.conf. Detaljer finns nedan.

Ändra kĂ€rninstĂ€llningar pĂ„ 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

Ändra kĂ€rnparametrar pĂ„ 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

Glöm inte: För att göra Àndringar permanenta, lÀgg till dessa vÀrden till /etc/sysctl.conf

Enorma sidor

В Linux Som standard anvĂ€nds 4 KB minnessidor, i BSD - Super Pages, och i Windows - Stora sidor. En sida Ă€r en bit RAM-minne som allokeras till en process. En process kan ha flera sidor beroende pĂ„ minneskrav. Ju mer minne en process krĂ€ver, desto fler sidor tilldelas den. OS upprĂ€tthĂ„ller en sidtilldelningstabell för processer. Ju mindre sidstorlek, desto större tabell, desto lĂ€ngre tid tar det att hitta en sida i den sidtabellen. Stora sidor tillĂ„ter dĂ€rför att stora mĂ€ngder minne kan anvĂ€ndas med minskad omkostnad; fĂ€rre sidvisningar, fĂ€rre sidfel, snabbare lĂ€s-/skrivoperationer över större buffertar. Resultatet Ă€r förbĂ€ttrad prestanda.

PostgreSQL stöder endast stora sidor i Linux. Standard Linux anvÀnder 4 KB minnessidor, sÄ i fall dÀr det finns mÄnga minnesoperationer Àr det nödvÀndigt att stÀlla in större sidor. PrestandaförbÀttringar observeras nÀr man anvÀnder stora sidor pÄ 2 MB och upp till 1 GB. Storleken för stora sidor kan stÀllas in vid start. Du kan enkelt kontrollera instÀllningarna för stora sidor och deras anvÀndning pÄ din Linux-dator med hjÀlp av kommandot cat /proc/meminfo | grep -i enorm.

HÀmta information om stora sidor (endast pÄ Linux)

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

I det hÀr exemplet, Àven om den stora sidstorleken Àr instÀlld pÄ 2048 (2 MB), Àr det totala antalet stora sidor satt till 0. Detta betyder att stora sidor Àr inaktiverade.

Skript för att bestÀmma antalet stora sidor

Det hÀr enkla skriptet returnerar det erforderliga antalet stora sidor. Kör skriptet pÄ din server. Linuxmedan PostgreSQL körs. Se till att miljövariabeln $PGDATA PostgreSQL-datakatalogen Àr specificerad.

FÄ det antal stora sidor som krÀvs

#!/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

SkriptutgÄngen ser ut sÄ hÀr:

SkriptutgÄng

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

Det rekommenderade vÀrdet för stora sidor Àr 88, sÄ du bör stÀlla in det pÄ 88.

Installera stora sidor

sysctl -w vm.nr_hugepages=88

Kontrollera stora sidor nu, du kommer att se att stora sidor inte anvÀnds (HugePages_Free = HugePages_Total).

Mer information om stora sidor (endast pÄ Linux)

$ 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

StÀll nu parametern huge_pages till "on" i $PGDATA/postgresql.conf och starta om servern.

Och Äterigen information om stora sidor (endast pÄ Linux)

$ 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

Nu kan du se att vÀldigt fÄ stora sidor anvÀnds. LÄt oss nu försöka lÀgga till lite data till databasen.

Vissa databasoperationer för att Ätervinna stora sidor

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

LÄt oss se om vi anvÀnder fler stora sidor nu Àn tidigare.

Återigen information om stora sidor (endast pĂ„ Linux)

$ 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

Nu kan du se att de flesta av de stora sidorna anvÀnds.

Obs: Det uppskattade vÀrdet för HugePages som anvÀnds hÀr Àr mycket lÄgt, vilket inte Àr ett normalt vÀrde för en maskin som kör en produktmiljö. Uppskatta det nödvÀndiga antalet sidor för ditt system och stÀll in dem baserat pÄ belastning och resurser.

vm.byte

vm.byte — Ă€r en annan kĂ€rnparameter som kan pĂ„verka databasens prestanda. Denna parameter anvĂ€nds för att styra vĂ€xlingsbeteendet (vĂ€xling av sidor in i och ut ur minnet) i LinuxVĂ€rdet varierar frĂ„n 0 till 100. Det avgör hur mycket minne som ska bytas ut eller bytas ut. Noll betyder ingen vĂ€xling och 100 betyder aggressiv vĂ€xling.

Du kan fÄ bra prestanda genom att sÀtta lÀgre vÀrden.

Att sÀtta vÀrdet till 0 i nyare kÀrnor kan orsaka att OOM Killer (minnesrensningsprocessen i Linux) kommer att avsluta processen. SÄ det Àr sÀkert att sÀtta vÀrdet till 1 om du vill minimera vÀxling. StandardvÀrdet Àr Linux - 60. Ett högre vÀrde gör att MMU (minneshanteringsenheten) anvÀnder mer vÀxlingsutrymme Àn RAM, medan ett lÀgre vÀrde lagrar mer data/kod i minnet.

Ett lÀgre vÀrde Àr en bra insats för förbÀttrad prestanda i PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Applikationer skaffar minne och slÀpper det nÀr det inte lÀngre behövs. Men i vissa fall fÄr programmet för mycket minne och slÀpper det inte. Detta kan orsaka en OOM-mördare. HÀr Àr de möjliga parametervÀrdena vm.overcommit_memory med en beskrivning för varje:

  1. Heuristisk overcommit (standard); kÀrnbaserad heuristik
  2. TillÄt övercommit ÀndÄ
  3. Överdriv inte, överskrid inte överenskommelsesförhĂ„llandet.

lÀnk: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — procentandel RAM tillgĂ€ngligt för överbelastning. Ett vĂ€rde pĂ„ 50 % pĂ„ ett system med 2 GB RAM kan allokera upp till 3 GB RAM.

Ett vÀrde pÄ 2 för vm.overcommit_memory ger bÀttre prestanda för PostgreSQL. Detta vÀrde maximerar serverprocessens RAM-anvÀndning utan nÄgon betydande risk att dödas av OOM-mördarprocessen. Applikationen kommer att kunna laddas om, men bara inom grÀnserna för överskridande, vilket minskar risken för att en OOM-mördare dödar processen. DÀrför ger ett vÀrde pÄ 2 bÀttre prestanda Àn standardvÀrdet pÄ 0. Tillförlitligheten kan dock förbÀttras genom att sÀkerstÀlla att minnet utanför intervallet inte överbelastas. Detta eliminerar risken för att processen dödas av en OOM-mördare.

PÄ system utan byte kan ett problem med vm.overcommit_memory lika med 2 uppstÄ.

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

vm.dirty_background_ratio / vm.dirty_background_bytes

vm.dirty_background_ratio — Detta Ă€r andelen minne som Ă€r fyllt med smutsiga sidor som behöver spolas till disk. Denna spolning sker i bakgrunden. Parameterns vĂ€rde varierar frĂ„n 0 till 100; ett vĂ€rde under 5 kan dock vara ineffektivt, och vissa kĂ€rnor stöder det inte. 10 Ă€r standardvĂ€rdet pĂ„ de flesta system. LinuxDu kan förbĂ€ttra prestandan för skrivintensiva operationer med en mindre förhĂ„llande, vilket innebĂ€r att Linux kommer att spola bort smutsiga sidor i bakgrunden.

Du mÄste stÀlla in vÀrdet vm.dirty_background_bytes beroende pÄ hastigheten pÄ din körning.

Det finns inga "bra" vÀrden för dessa tvÄ parametrar eftersom bÄda Àr hÄrdvaruberoende. Men om du stÀller in vm.dirty_background_ratio till 5 och vm.dirty_background_bytes till 25 % av diskhastigheten förbÀttras prestandan till ~25 % i de flesta fall.

vm.dirty_ratio/dirty_bytes

Det Àr samma sak som vm.dirty_background_ratio/dirty_background_bytes, förutom att ÄterstÀllningen utförs i en arbetssession, vilket blockerar applikationen. DÀrför bör vm.dirty_ratio vara högre Àn vm.dirty_background_ratio. Detta sÀkerstÀller att bakgrundsprocesser startar tidigare för att undvika att blockera applikationen sÄ mycket som möjligt. Du kan justera skillnaden mellan dessa tvÄ förhÄllanden beroende pÄ diskens I/O-belastning.

Totalt

Du kan justera andra instÀllningar för att förbÀttra prestandan, men förbÀttringarna kommer att vara minimala och du kommer inte att se mycket nytta. Vi mÄste komma ihÄg att inte alla alternativ gÀller alla typer av applikationer. Vissa appar fungerar bÀttre nÀr vi justerar vissa instÀllningar, och andra inte. Du mÄste hitta den rÀtta balansen mellan att konfigurera dessa instÀllningar för din förvÀntade arbetsbelastning och applikationstyp, och du mÄste ocksÄ ta hÀnsyn till OS-beteende vid justering. Att konfigurera kÀrnparametrar Àr inte lika lÀtt som att konfigurera databasparametrar, det Àr svÄrare att ge rekommendationer.

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster