Konfigurimi i opsioneve të kernelit Linux për të optimizuar PostgreSQL

Konfigurimi i opsioneve të kernelit Linux për të optimizuar PostgreSQL Performanca optimale e PostgreSQL varet nga parametrat e përcaktuar saktë të sistemit operativ. Cilësimet e konfigurimit të dobët të kernelit OS mund të rezultojnë në performancë të dobët të serverit të bazës së të dhënave. Prandaj, është e domosdoshme që këto cilësime të konfigurohen sipas serverit të bazës së të dhënave dhe ngarkesës së tij të punës. Në këtë postim, ne do të diskutojmë disa parametra të rëndësishëm të kernelit Linux që mund të ndikojnë në performancën e serverit të bazës së të dhënave dhe si t'i konfiguroni ato.

SHMMAX / SHMALL

SHMMAX është një parametër kernel i përdorur për të përcaktuar madhësinë maksimale të një segmenti të vetëm të memories së përbashkët që mund të ndajë një proces Linux. Përpara versionit 9.2, PostgreSQL përdorte System V (SysV), i cili kërkon cilësimin SHMMAX. Pas 9.2, PostgreSQL kaloi në memorie të përbashkët POSIX. Pra, tani kërkohen më pak bajt të memories së përbashkët të System V.

Përpara versionit 9.3, SHMMAX ishte parametri më i rëndësishëm i kernelit. Vlera SHMMAX specifikohet në bajt.

Në mënyrë të ngjashme, SHMALL është një tjetër parametër i kernelit që përdoret për të përcaktuar
vëllimi në të gjithë sistemin e faqeve të kujtesës së përbashkët. Për të parë vlerat aktuale SHMMAX, SHMALL ose SHMMIN, përdorni komandën ipcs.

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

Përdor PostgreSQL Sistemi V IPC për të ndarë memorien e përbashkët. Ky parametër është një nga parametrat më të rëndësishëm të kernelit. Sa herë që merrni mesazhet e mëposhtme të gabimit, kjo do të thotë që keni një version më të vjetër të PostgreSQL dhe vlera juaj SHMMAX është shumë e ulët. Përdoruesit pritet të rregullojnë dhe rrisin vlerën sipas memories së përbashkët që synojnë të përdorin.

Gabime të mundshme të konfigurimit të gabuar

Nëse SHMMAX nuk është konfiguruar saktë, mund të merrni një gabim kur përpiqeni të inicializoni një grup PostgreSQL duke përdorur komandën initdb.

initdb Dështim
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

Po kështu, mund të merrni një gabim kur filloni serverin PostgreSQL duke përdorur komandën pg_ctl.

pg_ctl Dështim
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.

Kuptimi i dallimeve në përkufizime

Përcaktimi i parametrave SHMMAX/SHMALL është paksa i ndryshëm në Linux dhe MacOS X:

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

Ekip sysktl mund të përdoret për të ndryshuar përkohësisht vlerën. Për të vendosur vlera konstante, shtoni një hyrje në /etc/sysctl.conf. Detajet janë më poshtë.

Ndryshimi i cilësimeve të kernelit në 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

Ndryshimi i parametrave të kernelit në 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

Jo për mbrojtje: Për t'i bërë ndryshimet të përhershme, shtoni këto vlera në /etc/sysctl.conf

Faqe të mëdha

Linux përdor si parazgjedhje faqe memorie 4 KB, BSD përdor faqe memorie XNUMX KB. Faqet super, dhe në Windows - Faqe të mëdha. Një faqe është një pjesë e RAM-it të alokuar për një proces. Një proces mund të ketë shumë faqe në varësi të kërkesave të memories. Sa më shumë memorie kërkon një proces, aq më shumë faqe ndahen. OS mban një tabelë të ndarjes së faqeve për proceset. Sa më e vogël të jetë madhësia e faqes, aq më e madhe është tabela, aq më shumë kohë duhet për të gjetur një faqe në atë tabelë faqesh. Prandaj, faqet e mëdha lejojnë që sasi të mëdha memorie të përdoren me shpenzime të reduktuara; më pak shikime të faqeve, më pak gabime në faqe, operacione më të shpejta të leximit/shkrimit mbi buferat më të mëdhenj. Rezultati është përmirësimi i performancës.

PostgreSQL mbështet vetëm faqe të mëdha në Linux. Si parazgjedhje, Linux përdor faqe memorie 4 KB, kështu që në rastet kur ka shumë operacione memorie, është e nevojshme të vendosni faqe më të mëdha. Përfitimet e performancës vërehen kur përdorni faqe të mëdha prej 2 MB dhe deri në 1 GB. Madhësia e madhe e faqes mund të vendoset në kohën e nisjes. Mund të kontrolloni lehtësisht parametrat e faqeve të mëdha dhe përdorimin e tyre në kompjuterin tuaj Linux duke përdorur komandën cat /proc/meminfo | grep -i i madh.

Marrja e informacionit për faqet e mëdha (vetëm 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

Në këtë shembull, megjithëse madhësia e madhe e faqes është caktuar në 2048 (2 MB), numri i përgjithshëm i faqeve të mëdha është vendosur në 0. Kjo do të thotë se faqet e mëdha janë të çaktivizuara.

Skript për përcaktimin e numrit të faqeve të mëdha

Ky skenar i thjeshtë kthen numrin e kërkuar të faqeve të mëdha. Ekzekutoni skriptin në serverin tuaj Linux ndërsa PostgreSQL po funksionon. Sigurohuni që për variablin e mjedisit $PGDATA Lista e të dhënave PostgreSQL është specifikuar.

Marrja e numrit të faqeve të mëdha të kërkuara

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

Dalja e skriptit duket si kjo:

Prodhimi i skriptit

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

Vlera e rekomanduar për faqet e mëdha është 88, kështu që duhet ta vendosni në 88.

Instalimi i faqeve të mëdha

sysctl -w vm.nr_hugepages=88

Kontrolloni faqet e mëdha tani, do të shihni që faqet e mëdha nuk përdoren (HugePages_Free = HugePages_Total).

Faqet e mëdha të rishikuara (vetëm 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

Tani vendosni parametrin large_pages në "on" në $PGDATA/postgresql.conf dhe rinisni serverin.

Edhe një herë, informacione për faqet e mëdha (vetëm 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

Tani mund të shihni se shumë pak faqe të mëdha po përdoren. Tani le të përpiqemi të shtojmë disa të dhëna në bazën e të dhënave.

Disa operacione të bazës së të dhënave për të ricikluar faqe të mëdha

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

Le të shohim nëse po përdorim më shumë faqe të mëdha tani se më parë.

Më shumë informacion në faqet e mëdha (vetëm 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

Tani mund të shihni se shumica e faqeve të mëdha janë duke u përdorur.

Shënim: Vlera e vlerësuar për HugePages të përdorura këtu është shumë e ulët, e cila nuk është një vlerë normale për një makinë që drejton një mjedis produkti. Ju lutemi vlerësoni numrin e kërkuar të faqeve për sistemin tuaj dhe vendosni ato në përputhje me rrethanat bazuar në ngarkesën dhe burimet.

vm.ndërrim

vm.ndërrim është një tjetër parametër i kernelit që mund të ndikojë në performancën e bazës së të dhënave. Ky opsion përdoret për të kontrolluar sjelljen e shkëmbimit (ndërrimi i faqeve brenda dhe jashtë memorjes) në Linux. Vlera varion nga 0 në 100. Ajo përcakton se sa memorie do të faqoset ose do të fshihet. Zero do të thotë pa shkëmbim dhe 100 do të thotë shkëmbim agresiv.

Mund të merrni performancë të mirë duke vendosur vlera më të ulëta.

Vendosja e kësaj në 0 në kernelet më të reja mund të shkaktojë që OOM Killer (procesi i pastrimit të kujtesës së Linux-it) të vrasë procesin. Pra, është e sigurt ta vendosni në 1 nëse doni të minimizoni shkëmbimin. Vlera e parazgjedhur në Linux është 60. Një vlerë më e lartë bën që MMU (njësia e menaxhimit të memories) të përdorë më shumë hapësirë ​​shkëmbimi sesa RAM, ndërsa një vlerë më e ulët mban më shumë të dhëna/kod në memorie.

Një vlerë më e ulët është një bast i mirë për performancën e përmirësuar në PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Aplikacionet fitojnë memorie dhe e lëshojnë atë kur nuk është më e nevojshme. Por në disa raste, aplikacioni merr shumë memorie dhe nuk e lëshon atë. Kjo mund të shkaktojë një vrasës OOM. Këtu janë vlerat e mundshme të parametrave vm.overcommit_memory me një përshkrim për secilën:

  1. Mbikomponim heuristik (i parazgjedhur); heuristike e bazuar në kernel
  2. Lejo gjithsesi mbizotërimin
  3. Mos e teproni, mos e tejkaloni raportin e mbiangazhimit.

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

vm.raporti_overcommit — përqindja e RAM-it në dispozicion për mbingarkesë. Një vlerë prej 50% në një sistem me 2 GB RAM mund të ndajë deri në 3 GB RAM.

Një vlerë prej 2 për vm.overcommit_memory ofron performancë më të mirë për PostgreSQL. Kjo vlerë maksimizon përdorimin e RAM-it të procesit të serverit pa ndonjë rrezik të konsiderueshëm për t'u vrarë nga procesi vrasës OOM. Aplikacioni do të jetë në gjendje të ringarkohet, por vetëm brenda kufijve të tejkalimit, gjë që zvogëlon rrezikun që një vrasës OOM të vrasë procesin. Prandaj, një vlerë prej 2 jep performancë më të mirë se vlera e paracaktuar e 0. Megjithatë, besueshmëria mund të përmirësohet duke u siguruar që memoria jashtë diapazonit të mos mbingarkohet. Kjo eliminon rrezikun që procesi të vritet nga një vrasës OOM.

Në sistemet pa shkëmbim, mund të ndodhë një problem me vm.overcommit_memory i barabartë me 2.

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

vm.dirty_background_ratio / vm.dirty_background_bytes

vm.raporti i sfondit të pista është përqindja e memories së mbushur me faqe të pista që duhet të shkruhen në disk. Ndezja në disk ndodh në sfond. Vlera e këtij parametri varion nga 0 në 100; megjithatë, një vlerë nën 5 mund të jetë joefektive dhe disa kernele nuk e mbështesin atë. 10 është parazgjedhja në shumicën e sistemeve Linux. Ju mund të përmirësoni performancën për operacionet intensive të shkrimit me një faktor më të vogël, që do të thotë se Linux do të fshijë faqet e pista në sfond.

Ju duhet të vendosni vlerën vm.dyrty_background_bytes në varësi të shpejtësisë së makinës suaj.

Nuk ka vlera "të mira" për këto dy parametra pasi të dy varen nga hardueri. Megjithatë, vendosja e vm.dirty_background_ratio në 5 dhe vm.dirty_background_bytes në 25% të shpejtësisë së diskut përmirëson performancën në ~25% në shumicën e rasteve.

vm.raporti_dirty/dirty_bytes

Është njësoj si vm.dirty_background_ratio/dirty_background_bytes, me përjashtim të faktit që rivendosja kryhet në një seancë pune, duke bllokuar aplikacionin. Prandaj vm.dirty_ratio duhet të jetë më i lartë se vm.raporti i sfondit të pista. Kjo siguron që proceset e sfondit të fillojnë më herët për të shmangur bllokimin e aplikacionit sa më shumë që të jetë e mundur. Ju mund të rregulloni ndryshimin midis këtyre dy raporteve në varësi të ngarkesës në hyrje/dalje të diskut.

Total

Ju mund të ndryshoni cilësimet e tjera për të përmirësuar performancën, por përmirësimet do të jenë minimale dhe nuk do të shihni shumë përfitime. Duhet të kujtojmë se jo të gjitha opsionet zbatohen për të gjitha llojet e aplikacioneve. Disa aplikacione funksionojnë më mirë kur rregullojmë disa cilësime dhe disa jo. Ju duhet të gjeni ekuilibrin e duhur midis konfigurimit të këtyre cilësimeve për ngarkesën tuaj të pritshme të punës dhe llojin e aplikacionit, dhe gjithashtu duhet të merrni parasysh sjelljen e OS gjatë akordimit. Konfigurimi i parametrave të kernelit nuk është aq i lehtë sa konfigurimi i parametrave të bazës së të dhënave; është më e vështirë të bësh rekomandime.

Burimi: www.habr.com

Shto një koment