InstÀllning av Linux-kÀrnparametrar för att optimera PostgreSQL

InstÀllning av Linux-kÀrnparametrar för att optimera PostgreSQL Optimal prestanda för PostgreSQL beror pÄ korrekt definierade parametrar i operativsystemet. DÄligt konfigurerade kÀrnparametrar kan leda till minskad prestanda för databasservern. Det Àr dÀrför viktigt att dessa parametrar Àr instÀllda i enlighet med databasservern och dess arbetsbelastning. I detta inlÀgg kommer vi att diskutera nÄgra viktiga Linux-kÀrnparametrar som kan pÄverka databasserverns prestanda och hur man konfigurerar dem.

SHMMAX / SHMALL

SHMMAX Àr en kÀrnparameter som anvÀnds för att definiera den maximala storleken pÄ en enskild segment av delad minne (shared memory) som en Linux-process kan allokera. Fram till version 9.2 anvÀnde PostgreSQL System V (SysV), vilket krÀver konfiguration av SHMMAX. Efter version 9.2 har PostgreSQL övergÄtt till POSIX delat minne. SÄ nu krÀvs det mindre byte av System V delat minne.

Fram till version 9.3 var SHMMAX den viktigaste kÀrnparametern. VÀrdet pÄ SHMMAX anges i byte.

PÄ samma sÀtt, SHMALL Àr en annan kÀrnparameter som anvÀnds för att definiera
det totala antalet sidor av delad minne (shared memory). För att se de aktuella vÀrdena av SHMMAX, SHMALL eller SHMMIN, anvÀnd kommandot ipcs.

SHM* Detaljer — Linux

$ ipcs -lm

------ GrÀnser för delat minne --------
max antal segment = 4096
max segmentstorlek (kbytes) = 1073741824
max totalt delat minne (kbytes) = 17179869184
min segmentstorlek (bytes) = 1

SHM* Detaljer — MacOS X

$ ipcs -M
IPC-status frÄn  den 16 aug 2018 22:20:35 PKT
shminfo:
	shmmax: 16777216	(max storlek pÄ delad minnessegment)
	shmmin:       1	(min storlek pÄ delad minnessegment)
	shmmni:      32	(max antal identifierare för delat minne)
	shmseg:       8	(max antal delade minnessegment per process)
	shmall:    1024	(max mÀngd delat minne i sidor)

PostgreSQL anvÀnder System V IPC för att allokera 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 du har ett mycket lÄgt vÀrde pÄ SHMMAX. Det förvÀntas att anvÀndare justerar och ökar vÀrdet i enlighet med den delade minneskapacitet de planerar att anvÀnda.

Möjliga fel vid felaktig konfiguration

Om SHMMAX Àr felkonfigurerad kan du fÄ ett fel nÀr du försöker initiera en PostgreSQL-kluster med kommandot initdb.

initdb Failure
DETAIL: Misslyckad systemanrop var shmget(key=1, size=2072576, 03600).

HINT: Detta fel betyder vanligtvis att PostgreSQL:s begÀran om ett segment av delat minne överskred din kÀrnas SHMMAX-parameter. 
Du kan antingen minska begÀrningsstorleken eller konfigurera kÀrnan med en större SHMMAX. För att minska begÀrningsstorleken (för nÀrvarande 2072576 byte),
minska PostgreSQLs delade minnesanvÀndning, kanske genom att minska shared_buffers eller max_connections.

Om begÀrningsstorleken redan Àr liten kan det hÀnda att den Àr mindre Àn din kÀrnas SHMMIN-parameter,
i vilket fall det Àr nödvÀndigt att höja begÀrningsstorleken eller omkonfigurera SHMMIN.

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

PÄ samma sÀtt kan du fÄ ett fel vid start av PostgreSQL-servern med kommandot pg_ctl.

pg_ctl-fel
DETAIL: Det misslyckade systemanropet var shmget(key=5432001, size=14385152, 03600).

HINT: Detta fel betyder vanligtvis att PostgreSQL:s begÀran om ett segment av delat minne överskred din kÀrnas SHMMAX-parameter.

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

Om begÀrningsstorleken redan Àr liten kan det hÀnda att den Àr mindre Àn din kÀrnas SHMMIN-parameter,
i vilket fall det Àr nödvÀndigt att höja begÀrningsstorleken eller omkonfigurera SHMMIN.

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

FörstÄ skillnaderna i definitionerna

Definitionerna av SHMMAX/SHMALL skiljer sig nÄgot mellan Linux och MacOS X:

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

Team sysctl kan anvÀndas för att temporÀrt Àndra vÀrdet. För att stÀlla in permanenta vÀrden, lÀgg till en post i /etc/sysctl.conf. Detaljer anges nedan.

Ändring av 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

Ändring av kĂ€rninstĂ€llningar 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 Àndringarna permanenta, lÀgg till dessa vÀrden i /etc/sysctl.conf

Stora sidor (Huge Pages)

I Linux anvĂ€nds som standard 4 KB minnessidor, i BSD — Super Pages, och i Windows — Large Pages. En sida Ă€r en del av RAM-minnet som tilldelas en process. En process kan ha flera sidor beroende pĂ„ minnesbehovet. Ju mer minne en process behöver, desto fler sidor tilldelas den. OS upprĂ€tthĂ„ller en sidhanteringstabell för processerna. Ju mindre storlek pĂ„ sidan, desto större tabell, desto mer tid krĂ€vs för att söka efter en sida i denna tabell. DĂ€rför tillĂ„ter stora sidor att anvĂ€nda stora mĂ€ngder minne med minskade overheadkostnader; fĂ€rre sidvisningar, fĂ€rre sidfel, snabbare lĂ€s-/skrivoperationer genom stora buffertar. Resultatet blir en förbĂ€ttrad prestanda.

PostgreSQL stöder stora sidor endast pÄ Linux. Som standard anvÀnder Linux 4 kB minnessidor, sÄ i fall dÀr det finns för mÄnga minnesoperationer Àr det nödvÀndigt att stÀlla in sidor av större storlek. En prestandaförbÀttring kan observeras vid anvÀndning av stora sidor pÄ 2 MB och upp till 1 GB. Storleken pÄ 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 genom att anvÀnda kommandot cat /proc/meminfo | grep -i huge.

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

Obs: Detta gÀller endast för Linux, för andra operativsystem ignoreras denna operation
$ 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 storleken pÄ den stora sidan Àr instÀlld pÄ 2048 (2 MB), har det totala antalet stora sidor vÀrdet 0. Detta betyder att stora sidor Àr avstÀngda.

Script för att bestÀmma antalet stora sidor

Detta Àr ett enkelt skript som returnerar det nödvÀndiga antalet stora sidor. Kör skriptet pÄ din Linux-server medan PostgreSQL körs. Se till att miljövariabeln $PGDATA Àr instÀlld pÄ PostgreSQL:s datakatalog.

HÀmta siffran för de nödvÀndiga stora sidorna

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

Skripts output ser ut som följer:

Skripts output

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 vÀrdet 88.

StÀlla in 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).

Än en gĂ„ng 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

Nu stÀller du in parameter huge_pages "on" i $PGDATA/postgresql.conf och startar 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 mycket fÄ stora sidor anvÀnds. LÄt oss nu försöka lÀgga till lite data i databasen.

Vissa databasoperationer för att hantera 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 för nÀrvarande anvÀnder fler stora sidor À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 stora sidor anvÀnds.

Observera: 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 produktionsmaskin. VÀnligen bedöm det nödvÀndiga antalet sidor för ditt system och stÀll in dem i enlighet med belastning och resurser.

vm.swappiness

vm.swappiness — detta Ă€r en annan kĂ€rnparameter som kan pĂ„verka databasens prestanda. Den hĂ€r parametern anvĂ€nds för att styra swapbeteendet (swappiness) (att swapa sidor in och ut ur minnet) i Linux. VĂ€rdet varierar frĂ„n 0 till 100. Det bestĂ€mmer hur mycket minne som kommer att avlastas eller avlastas. Noll betyder att swap inte anvĂ€nds, och 100 innebĂ€r aggressiv svappning.

Du kan fÄ bra prestanda genom att stÀlla in lÀgre vÀrden.

Att sÀtta vÀrdet 0 i nyare kÀrnor kan leda till att OOM Killer (minnesrensningsprocessen i Linux) dödar processen. SÄledes kan vÀrdet 1 sÀkerstÀllas om du vill minimera svappning. StandardvÀrdet i Linux Àr 60. Ett högre vÀrde fÄr MMU (minneshanteringsenheten) att anvÀnda mer swaputrymme Àn RAM, medan ett lÀgre vÀrde behÄller mer data/kod i minnet.

Ett lÀgre vÀrde Àr en bra insats för att förbÀttra prestandan i PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Applikationer fÄr minne och frigör det nÀr det inte lÀngre behövs. Men i vissa fall fÄr applikationen för mycket minne och frigör det inte. Detta kan orsaka OOM killer. HÀr Àr möjliga vÀrden för parametern vm.overcommit_memory med en beskrivning för varje:

  1. Heuristisk överkommitté (standard); kÀrn-baserad heuristik
  2. TillÄt överkommitté i alla fall
  3. ÖverkommittĂ© för mycket, överskrid inte överkommittĂ© koefficienten.

LĂ€nk: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — procent av RAM-minnet som Ă€r tillgĂ€ngligt för överbelastning. VĂ€rdet 50 % i ett system med 2 GB RAM kan tilldela upp till 3 GB RAM.

VĂ€rdet 2 för vm.overcommit_memory ger bĂ€ttre prestanda för PostgreSQL. Det hĂ€r vĂ€rdet maximerar anvĂ€ndningen av RAM-minne av serverprocessen utan nĂ„gon betydande risk för att bli dödad av OOM-killern. Applikationen kan startas om, men endast inom överutnyttjandet, vilket minskar risken för att OOM-killern dödar processen. DĂ€rför ger vĂ€rdet 2 bĂ€ttre prestanda Ă€n standardvĂ€rdet 0. Å andra sidan kan tillförlitligheten förbĂ€ttras genom att minnet utanför det tillĂ„tna intervallet inte överbelastas. Detta utesluter risken för att processen dödas av OOM-killern.

I system utan byte kan det uppstÄ problem med vm.overcommit_memory lika med 2.

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 — Ă€r procentandelen av minnet som Ă€r fyllt med smutsiga sidor som mĂ„ste skrivas till disk. Skrivning till disk sker i bakgrunden. VĂ€rdet pĂ„ denna parameter varierar frĂ„n 0 till 100; dock kan ett vĂ€rde under 5 vara ineffektivt, och vissa kĂ€rnor stöder det inte. 10 Ă€r standardvĂ€rdet i de flesta Linux-system. Du kan öka prestanda för skrivintensiva operationer med en lĂ€gre kvot som betyder att Linux kommer att skriva smutsiga sidor i bakgrunden.

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

För dessa tvÄ parametrar finns det inga 'bra' vÀrden, eftersom bÄda beror pÄ hÄrdvaran. Men att stÀlla in vm.dirty_background_ratio pÄ 5 och vm.dirty_background_bytes pÄ 25 % av diskens hastighet ökar prestandan med ~ 25 % i de flesta fall.

vm.dirty_ratio / dirty_bytes

Detta Àr detsamma som vm.dirty_background_ratio / dirty_background_bytes, med den skillnaden att skrivningen görs i en aktiv session, och blockerar applikationen. DÀrför bör vm.dirty_ratio vara högre Àn vm.dirty_background_ratio. Detta sÀkerstÀller att bakgrundsprocesserna startas tidigare för att undvika maximal blockering av applikationen. Du kan justera skillnaden mellan dessa tvÄ kvoter beroende pÄ belastningen pÄ disk I/O.

Resultat

Du kan justera andra parametrar för att öka prestandan, men förbÀttringarna kommer att vara minimala och du kommer inte att fÄ nÄgra sÀrskilda fördelar. Vi mÄste komma ihÄg att inte alla parametrar gÀller för alla typer av applikationer. Vissa applikationer fungerar bÀttre nÀr vi justerar vissa parametrar, medan andra inte gör det. Du mÄste hitta rÀtt balans mellan konfigurationerna av dessa parametrar för den förvÀntade arbetsbelastningen och typ av applikation, samt ta hÀnsyn till operativsystemets beteende vid justering. Att justera kÀrnparametrar Àr inte sÄ enkelt som att justera databasparametrar: hÀr Àr det svÄrare att ge rekommendationer.

KĂ€lla: habr.com

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