Performanca optimale e PostgreSQL varet nga parametrat e sistemit operativ të përcaktuar në mënyrë të saktë. Parametrat e konfigurimit të dobët të bërthamës së OS mund të çojnë në uljen e performancës së serverit të bazës së të dhënave. Prandaj, është thelbësore që këto parametra të jenë të konfiguruar në përputhje me serverin e bazës së të dhënave dhe ngarkesën e tij të punës. Në këtë artikull, ne do të diskutojmë disa parametra të rëndësishëm të bërthamës Linux që mund të ndikojnë në performancën e serverit të bazës së të dhënave dhe mënyrat për t'i konfiguruar ato.
SHMMAX / SHMALL
SHMMAX â Ă«shtĂ« njĂ« parametr bĂ«rthamĂ«s, i pĂ«rdorur pĂ«r tĂ« pĂ«rcaktuar madhĂ«sinĂ« maksimale tĂ« njĂ« prej segmenteve tĂ« memories sĂ« ndarĂ« (shared memory), qĂ« njĂ« proces Linux mund ta alokojĂ«. Para versionit 9.2, PostgreSQL pĂ«rdorte System V (SysV), pĂ«r tĂ« cilin kĂ«rkohej konfigurimi i SHMMAX. Pas 9.2, PostgreSQL kaloi nĂ« memorien e ndarĂ« POSIX. Prandaj tani kĂ«rkohen mĂ« pak byte memorie tĂ« ndarĂ« System V.
Para versionit 9.3, SHMMAX ishte parametri më i rëndësishëm i bërthamës. Vlera e SHMMAX është e caktuar në byte.
NjĂ«lloj, SHMALL â Ă«shtĂ« njĂ« tjetĂ«r parametr bĂ«rthamĂ«s, i pĂ«rdorur pĂ«r tĂ« pĂ«rcaktuar
kapacitetin e përgjithshëm të faqeve të memorizuara në mënyrë të ndarë (shared memory). Për të parë vlerat aktuale SHMMAX, SHMALL ose SHMMIN, përdorni komandën ipcs.
SHM* Detajet â Linux
$ ipcs -lm
------ Kufijtë e Memorisë së Ndarë --------
numri maksimal i segmenteve = 4096
maks. madhësia e segmentit (kbytes) = 1073741824
maks. total i memories së ndarë (kbytes) = 17179869184
min. madhĂ«sia e segmentit (bytes) = 1SHM* Detajet â MacOS X
$ ipcs -M
Statusi IPC nga më Thu Aug 16 22:20:35 PKT 2018
shminfo:
shmmax: 16777216 (madhësia maksimale e segmentit të memories së ndarë)
shmmin: 1 (madhësia minimale e segmentit të memories së ndarë)
shmmni: 32 (numri maksimal i identifikuesve të memories së ndarë)
shmseg: 8 (numri maksimal i segmenteve të memories së ndarë për proces)
shmall: 1024 (madha e maksimumit të memories së ndarë në faqe)
PostgreSQL pĂ«rdor System V IPC pĂ«r tĂ« alokuar memorie tĂ« ndarĂ«. Ky parametĂ«r Ă«shtĂ« njĂ« nga parametrat mĂ« tĂ« rĂ«ndĂ«sishĂ«m tĂ« bĂ«rthamĂ«s. Ădo herĂ« qĂ« merrni kĂ«to mesazhe gabimi, do tĂ« thotĂ« se keni njĂ« version mĂ« tĂ« vjetĂ«r tĂ« PostgreSQL dhe keni njĂ« vlerĂ« shumĂ« tĂ« ulĂ«t SHMMAX. Pritet qĂ« pĂ«rdoruesit tĂ« korrigjojnĂ« dhe rrisin vlerĂ«n nĂ« pĂ«rputhje me memorien e ndarĂ« qĂ« duan tĂ« pĂ«rdorin.
Gabimet e mundshme të konfigurimit të gabuar
Nëse SHMMAX është konfiguruar gabim, mund të merrni një gabim kur përpiqeni të inicializoni një klaster PostgreSQL duke përdorur komandën initdb.
Dështimi i initdb
DETALJE: Thirja e sistemit të dështuar ishte shmget(key=1, size=2072576, 03600).
KĂSHILLĂ: Ky gabim zakonisht do tĂ« thotĂ« se kĂ«rkesa e PostgreSQL pĂ«r njĂ« segment kujtimi tĂ« pĂ«rbashkĂ«t e kaloi parametrin SHMMAX tĂ« kernelit tuaj.Â
Mund të reduktoni madhësinë e kërkesës ose të konfiguroni kernelin me një SHMMAX më të madh. Për të reduktuar madhësinë e kërkesës (aktualisht 2072576 byte),
reduktoni përdorimin e kujtesës së përbashkët të PostgreSQL, ndoshta duke reduktuar shared_buffers ose max_connections.
Nëse madhësia e kërkesës tashmë është e vogël, është e mundur që ajo të jetë më e vogël se parametri SHMMIN i kernelit tuaj,
në të cilin rast është e nevojshme të rritet madhësia e kërkesës ose të ri-konfigurohet SHMMIN.
Dokumentacioni i PostgreSQL përmban më shumë informacion mbi konfigurimin e kujtesës së përbashkët. procesi fëmijë doli me kodin e daljes 1
Njëjtë, mund të merrni një gabim kur nisni serverin PostgreSQL duke përdorur komandën pg_ctl.
pg_ctl Dështimi
DETALLET: Thirrja e dështuar të sistemit ishte shmget(key=5432001, size=14385152, 03600).
KĂSHILLĂ: Ky gabim zakonisht do tĂ« thotĂ« se kĂ«rkesa e PostgreSQL pĂ«r njĂ« segment kujtimi tĂ« pĂ«rbashkĂ«t e kaloi parametrin SHMMAX tĂ« kernelit tuaj.
Mund të reduktoni madhësinë e kërkesës ose të konfiguroni kernelin me një SHMMAX më të madh. Për të reduktuar madhësinë e kërkesës (aktualisht 14385152 byte), reduktoni përdorimin e kujtesës së përbashkët të PostgreSQL, ndoshta duke reduktuar shared_buffers ose max_connections.
Nëse madhësia e kërkesës tashmë është e vogël, është e mundur që ajo të jetë më e vogël se parametri SHMMIN i kernelit tuaj,
në të cilin rast është e nevojshme të rritet madhësia e kërkesës ose të ri-konfigurohet SHMMIN.
Dokumentacioni i PostgreSQL përmban më shumë informacion mbi konfigurimin e kujtesës së përbashkët.
Kuptimi i dallimeve në definicionet
Definimi i parametrave SHMMAX/SHMALL ndryshon pak në Linux dhe MacOS X:
- Linux: kernel.shmmax, kernel.shmall
- MacOS X: kern.sysv.shmmax, kern.sysv.shmall
Ekipa sysctl mund të përdoret për të ndryshuar përkohësisht vlerën. Për të vendosur vlera të përhershme, shtoni një hyrje në /etc/sysctl.conf. Detajet janë renditur më poshtë.
Ndryshimi i parametrave 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 -> 16777216Ndryshimi 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 -> 16777216Mos harroni: për të bërë ndryshimet të përhershme, shtoni këto vlera në /etc/sysctl.conf
Faqet e mëdha (Huge Pages)
NĂ« Linux, tĂ« dhĂ«nat e zakonshme pĂ«rdorin faqe memorie prej 4 KB, nĂ« BSD â Faqet Super, dhe nĂ« Windows â Faqet e mĂ«dha (Large Pages). NjĂ« faqe Ă«shtĂ« njĂ« pjesĂ« e memories operative e caktuar njĂ« procesi. NjĂ« proces mund tĂ« ketĂ« disa faqe nĂ« varĂ«si tĂ« kĂ«rkesave pĂ«r memorie. Sa mĂ« shumĂ« memorie tĂ« nevojitet pĂ«r procesin, aq mĂ« shumĂ« faqe i caktohen atij. Sistemi operativ mbĂ«shtet njĂ« tabelĂ« rezervimi faqe pĂ«r proceset. Sa mĂ« i vogĂ«l tĂ« jetĂ« madhĂ«sia e faqes, aq mĂ« e madhe bĂ«het tabela, dhe aq mĂ« shumĂ« kohĂ« kĂ«rkohet pĂ«r gjetjen e faqes nĂ« kĂ«tĂ« tabelĂ«. Prandaj, faqet e mĂ«dha lejojnĂ« pĂ«rdorimin e njĂ« sasie mĂ« tĂ« madhe memorje me shpenzime tĂ« reduktuara; mĂ« pak shikime faqe, mĂ« pak gabime faqe, operacione tĂ« shpejta leximi/shkruajti pĂ«rmes bufereve tĂ« mĂ«dha. Si rezultat â pĂ«rmirĂ«sim i performancĂ«s.
PostgreSQL mbështet faqe të mëdha vetëm në Linux. Me default, Linux përdor faqe memorie prej 4 KB, prandaj në rastet kur ka shumë operacione me memorie, duhet të vendosen faqe më të mëdha. Një rritje e performancës vërehet kur përdoren faqe të mëdha prej 2 MB dhe deri në 1 GB. Madhësia e faqeve të mëdha mund të vendoset gjatë ngarkimit. Ju 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 huge.
Marrja e informacionit mbi faqet e mëdha (vetëm në Linux)
Shënim: Kjo është vetëm për Linux, për OS të tjera kjo operacion injorohet$ 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 kBNë këtë shembull, megjithëse madhësia e faqes së madhe është vendosur në 2048 (2 MB), numri total i faqeve të mëdha është 0. Kjo do të thotë që faqet e mëdha janë të çaktivizuara.
Skripti për përcaktimin e numrit të faqeve të mëdha
Ky është një skript i thjeshtë që kthen numrin e nevojshëm të faqeve të mëdha. Ekzekutoni skriptin në serverin tuaj Linux, ndërsa PostgreSQL është në funksionim. Sigurohuni që për variablën mjedisore $PGDATA është vendosur katalogu i të dhënave PostgreSQL.
Merrni numrin e 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:    $hpDërgesa e skriptit duket si kjo:
Dërgesa e skriptit
Pid: 12737
VmPeak: 180932 kB
Hugepagesize: 2048 kB
Set Huge Pages: 88Vlera e rekomanduar për faqet e mëdha është 88, kështu që duhet të vendosni vlerën 88.
Vendosja e faqeve të mëdha
sysctl -w vm.nr_hugepages=88Kontrolloni faqe të mëdha tani, do të shihni se faqet e mëdha nuk po përdoren (HugePages_Free = HugePages_Total).
Informacion sërish mbi faqet e mëdha (vetëm në 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 kBTani vendosni parametrin huge_pages në "on" në $PGDATA/postgresql.conf dhe rindezni serverin.
Dhe sërish informacion mbi faqet e mëdha (vetëm në 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 kBTani tani mund të shihni se po përdoren shumë pak faqe të mëdha. Tani le të provojmë të shtojmë disa të dhëna në bazën e të dhënave.
Disa operacione me bazën e të dhënave për menaxhimin e faqeve të mëdha
postgres=# KRIJO TABELĂ foo(a INTEGER);
KRIJO TABELĂ
postgres=# SHTO NĂ foo VLERAT(generate_Series(1,10000000));
SHTO 0 10000000Le të shohim nëse tani jemi duke përdorur më shumë faqe të mëdha se më parë.
Përsëri informacione për faqet e mëdha (vetëm në 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 kBTani mund të shihni se shumica e faqeve të mëdha po përdoren.
Shënim: vlera e përafërt për HugePages që po përdoret këtu është shumë e ulët, çka nuk është një vlerë normale për një makinë në një ambient prodhimi. Ju lutemi vlerësoni numrin e nevojshëm të faqeve për sistemin tuaj dhe vendosni ato përkatësisht në varësi të ngarkesës dhe burimeve.
vm.swappiness
vm.swappiness â Ă«shtĂ« njĂ« tjetĂ«r parametr i bĂ«rthamĂ«s, qĂ« mund tĂ« ndikojĂ« nĂ« performancĂ«n e bazĂ«s sĂ« tĂ« dhĂ«nave. Ky parametr pĂ«rdoret pĂ«r tĂ« kontrolluar sjelljen e kĂ«mbimit (swappiness) (kĂ«mbimin e faqeve nĂ« memorie dhe nga ajo) nĂ« Linux. Vlera varion nga 0 nĂ« 100. Ajo pĂ«rcakton sa memorie do tĂ« lirohet ose do tĂ« shkarkohet. Zero do tĂ« thotĂ« fikja e kĂ«mbimit, ndĂ«rsa 100 do tĂ« thotĂ« kĂ«mbim agresiv.
Mund të merrni një performancë të mirë duke vendosur vlera më të ulëta.
Vendosja e vlerës 0 në bërthamat më të reja mund të çojë në atë që OOM Killer (procesi i pastrimit të memories në Linux) të vrasë procesin. Kështu, mund të vendosni sigurt vlerën 1 nëse dëshironi të minimizoni këmbimin. Vlera e paracaktuar në Linux është 60. Një vlerë më e lartë detyron MMU (njësia e menaxhimit të memories) të përdorë më shumë hapësirë këmbimi sesa RAM, ndërsa një vlerë më e ulët ruan më shumë të dhëna/kod në memorie.
Një vlerë më e ulët është një bast i mirë për përmirësimin e performancës në PostgreSQL.
vm.overcommit_memory / vm.overcommit_ratio
Aplikacionet merrnin memorie dhe e çlirojnë atë kur nuk është më e nevojshme. Por në disa raste, aplikacioni merr shumë memorie dhe nuk e çliron atë. Kjo mund të shkaktojë OOM killer. Ja vlerat e mundshme të parametrave. vm.overcommit_memory me përshkrimin për secilën:
- Overcommit heuristike (e default); heuristika e bazuar në bërthamë
- Lejo overcommit në çdo rast
- Mos e teproni, mos e kaloni koeficientin e overcommit.
Linku:
vm.overcommit_ratio â pĂ«rqindja e memories RAM qĂ« Ă«shtĂ« e disponueshme pĂ«r tepricĂ«. NjĂ« vlerĂ« prej 50% nĂ« njĂ« sistem me 2 GB RAM mund tĂ« alokojĂ« deri nĂ« 3 GB RAM.
Vlera 2 pĂ«r vm.overcommit_memory siguron performancĂ« mĂ« tĂ« mirĂ« pĂ«r PostgreSQL. Kjo vlerĂ« maksimizon pĂ«rdorimin e memorjes RAM nga procesi i serverit pa ndonjĂ« rrezik tĂ« konsiderueshĂ«m pĂ«r tâu ndaluar nga procesi OOM killer. Aplikacioni do tĂ« jetĂ« nĂ« gjendje tĂ« rinis, por vetĂ«m brenda kufijve tĂ« tepricĂ«s, çka ul rrezikun qĂ« OOM killer tĂ« ndalĂ« procesin. Prandaj, vlera 2 ofron performancĂ« mĂ« tĂ« lartĂ« se vlera e parazgjedhur 0. MegjithatĂ«, besueshmĂ«ria mund tĂ« pĂ«rmirĂ«sohet duke garantuar qĂ« memoria jashtĂ« kufijve tĂ« pranueshĂ«m nuk do tĂ« teprohet. Kjo pĂ«rjashton rrezikun qĂ« procesi tĂ« ndalohet nga OOM-killer.
Në sistemet pa swap, mund të ketë një problem me vm.overcommit_memory të barabartë me 2.
vm.dirty_background_ratio / vm.dirty_background_bytes
vm.dirty_background_ratio â Ă«shtĂ« pĂ«rqindja e memories e mbushur me faqe tĂ« ndotura qĂ« duhet tĂ« shkruhen nĂ« disk. Shkarkimi nĂ« disk bĂ«het nĂ« sfond. Vlera e kĂ«tij parametri varion nga 0 deri nĂ« 100; megjithatĂ« vlera nĂ«n 5 mund tĂ« jetĂ« e paefektshme, dhe disa bĂ«rthama nuk e mbĂ«shtesin. 10 Ă«shtĂ« vlera parazgjedhur nĂ« shumicĂ«n e sistemeve Linux. Mund tĂ« rritni performancĂ«n pĂ«r operacionet me shkrim intensiv me njĂ« koeficient mĂ« tĂ« vogĂ«l, i cili do tĂ« thotĂ« qĂ« Linux do tĂ« shkarkojĂ« faqet e ndotura nĂ« sfond.
Ju nevojitet të vendosni vlerën vm.dirty_background_bytes në varësi të shpejtësisë së diskut tuaj.
për këta dy parametra nuk ka vlera "të mira", pasi të dy varen nga hardueri. Megjithatë, vendosja e vm.dirty_background_ratio në vlerën 5 dhe vm.dirty_background_bytes në 25% të shpejtësisë së diskut rrit performancën deri në ~ 25% në shumicën e rasteve.
vm.dirty_ratio / dirty_bytes
Kjo është e njëjta gjë vm.dirty_background_ratio / dirty_background_bytes, me përjashtim se shkarkimi bëhet në sesionin aktiv, duke bllokuar aplikacionin. Prandaj, vm.dirty_ratio duhet të jetë më i lartë se vm.dirty_background_ratio. Kjo garanton që proceset në sfond do të nisin më herët për të shmangur bllokimin maksimal të mundshëm të aplikacionit. Ju mund të konfiguroni diferencën midis këtyre dy raportesh në varësi të ngarkesës së hyrjes dhe daljes në disk.
Përfundimi
Ju mund të konfiguroni parametra të tjerë për të rritur performancën, por përmirësimet do të jenë minimale dhe nuk do të keni ndonjë përfitim të veçantë. Duhet të kuptojmë se jo të gjithë parametrat përshtaten me të gjitha llojet e aplikacioneve. Disa aplikacione funksionojnë më mirë kur ne rregullojmë disa parametra, ndërsa disa të tjerë nuk e bëjnë. Ju duhet të gjeni balancën e duhur midis konfigurimeve të këtyre parametrave për ngarkesën e pritur të punës dhe llojin e aplikacionit, si dhe duhet të merrni parasysh sjelljen e sistemit operativ gjatë konfigurimit. Të rregullosh parametrat e bërthamës nuk është aq e lehtë sa të rregullosh parametrat e bazës së të dhënave: këtu është më e komplikuar të jepen rekomandimet tuaja.
Burimi: habr.com
