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) = 1SHM* 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 -> 16777216Glö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 kBI 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: $hpSkriptutgÄngen ser ut sÄ hÀr:
SkriptutgÄng
Pid: 12737
VmPeak: 180932 kB
Hugepagesize: 2048 kB
Set Huge Pages: 88Det 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=88Kontrollera 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 kBStÀ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 kBNu 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 10000000LÄ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 kBNu 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:
- Heuristisk overcommit (standard); kÀrnbaserad heuristik
- TillÄt övercommit ÀndÄ
- Ăverdriv inte, överskrid inte överenskommelsesförhĂ„llandet.
lÀnk:
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Ä.
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
