Konfigurimi i parametrave të kernelit Linux për optimizimin e PostgreSQL

Konfigurimi i parametrave të kernelit Linux për optimizimin e PostgreSQL Performanca optimale e PostgreSQL varet nga parametrat e duhur të sistemit operativ. Parametrat e papërshtatshëm 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ë e domosdoshme që këta parametra të jenë konfiguruar në përputhje me serverin e bazës së të dhënave dhe ngarkesën e tij të punës. Në këtë post, ne do të diskutojmë disa nga parametrat e 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Ă« parametĂ«r bĂ«rthame qĂ« pĂ«rdoret pĂ«r tĂ« pĂ«rcaktuar madhĂ«sinĂ« maksimale tĂ« njĂ« segmenti tĂ« vetĂ«m tĂ« memories sĂ« ndarĂ« (shared memory) qĂ« mund tĂ« alokojĂ« njĂ« proces Linux. Deri nĂ« versionin 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. Pra, tani kĂ«rkohen mĂ« pak byte pĂ«r memorien e ndarĂ« System V.

Derisa deri në versionin 9.3, SHMMAX ishte parametri më i rëndësishëm i bërthamës. Vlera e SHMMAX specifikohet në byte.

NjĂ«jtĂ«, SHMALL — Ă«shtĂ« njĂ« tjetĂ«r parametĂ«r bĂ«rthame qĂ« pĂ«rdoret pĂ«r tĂ« pĂ«rcaktuar
vëllimin total të faqeve të memories së ndarë (shared memory). Për të parë vlerat aktuale të SHMMAX, SHMALL ose SHMMIN, përdorni komandën ipcs.

SHM* Detajet — Linux

$ ipcs -lm

------ Kufijtë e Memories së Ndarë --------
numri maksimal i segmenteve = 4096
madhësia maksimale e segmentit (kbytes) = 1073741824
madhësia totale maksimale e memories së ndarë (kbytes) = 17179869184
madhësia minimale e segmentit (bytes) = 1

SHM* Detajet — MacOS X

$ ipcs -M
Statusi IPC nga  si 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	(masa maksimale e memories së ndarë në faqe)

PostgreSQL përdor System V IPC për alokimin e memories së ndarë. Ky parametër është një nga parametrat më të rëndësishëm të bërthamës. Sa herë që merrni mesazhet e mëposhtme të gabimeve, kjo tregon se keni një version më të vjetër të PostgreSQL dhe keni një vlerë shumë të ulët të SHMMAX. Pritet që përdoruesit të korrigjojnë dhe rrisin vlerën në përputhje me memorien e ndarë që planifikojnë 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ë grup PostgreSQL me komandën initdb.

initdb Dështimi
DETALJE: Thirrja e dështuar sistemike ishte shmget(key=1, size=2072576, 03600).

KËSHILLË: Ky gabim zakonisht do tĂ« thotĂ« se kĂ«rkesa e PostgreSQL pĂ«r njĂ« segment tĂ« memories sĂ« ndarĂ« kaloi parametrin SHMMAX tĂ« bĂ«rthamĂ«s tuaj. 
Mund të reduktoni ose madhësinë e kërkesës ose të ritaksoni kernelin me SHMMAX më të madh. Për të reduktuar madhësinë e kërkesës (aktualisht 2072576 byte),
redukti përdorimin e memories së përbashkët të PostgreSQL, ndoshta duke reduktuar shared_buffers ose max_connections.

Nëse madhësia e kërkesës është tashmë e vogël, është e mundur që të jetë më e vogël se parametri SHMMIN i kernelit tuaj,
në këtë rast, rritja e madhësisë së kërkesës ose ritaksoni SHMMIN është e nevojshme.

Dokumentacioni i PostgreSQL përmban më shumë informacion në lidhje me konfigurimin e memories së përbashkët. Procesi fëmijor doli me kodin e daljes 1.

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

Dështimi i pg_ctl
DETALJ: Thirrja e dështuar e 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 tĂ« memories sĂ« ndarĂ« kaloi parametrin SHMMAX tĂ« bĂ«rthamĂ«s tuaj.

Mund të reduktoni ose madhësinë e kërkesës ose të ritaksoni kernelin me SHMMAX më të madh.; Për të reduktuar madhësinë e kërkesës (aktualisht 14385152 byte), redukti përdorimin e memories së përbashkët të PostgreSQL, ndoshta duke reduktuar shared_buffers ose max_connections.

Nëse madhësia e kërkesës është tashmë e vogël, është e mundur që të jetë më e vogël se parametri SHMMIN i kernelit tuaj,
në këtë rast, rritja e madhësisë së kërkesës ose ritaksoni SHMMIN është e nevojshme.

Dokumentacioni i PostgreSQL përmban më shumë informacion në lidhje me konfigurimin e memories së përbashkët.

Kuptimi i dallimeve në definita

Definimi i parametrave SHMMAX/SHMALL paksa ndryshon 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ë të dhëna 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 -> 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

Mos 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, faqe kujtese 4 KB pĂ«rdoren nĂ« mĂ«nyrĂ« tĂ« paracaktuar, nĂ« BSD — Faqet Super, dhe nĂ« Windows — Faqet e MĂ«dha. NjĂ« faqe Ă«shtĂ« njĂ« pjesĂ« e memories sĂ« pĂ«rgjithshme e cila i Ă«shtĂ« alokuar procesit. NjĂ« proces mund tĂ« ketĂ« disa faqe nĂ« varĂ«si tĂ« kĂ«rkesave pĂ«r memorie. Sa mĂ« shumĂ« memorie tĂ« kĂ«rkohĂ«t nga procesi, aq mĂ« shumĂ« faqe i alokohen atij. OS mbĂ«shtet njĂ« tabelĂ« alokimi tĂ« faqeve pĂ«r proceset. Sa mĂ« i vogĂ«l tĂ« jetĂ« madhĂ«sia e faqes, aq mĂ« shumĂ« Ă«shtĂ« tabela, aq mĂ« shumĂ« kohĂ« kĂ«rkohet pĂ«r tĂ« gjetur njĂ« faqe nĂ« kĂ«tĂ« tabelĂ« faqe. Prandaj, faqet e mĂ«dha lejojnĂ« pĂ«rdorimin e njĂ« sasi tĂ« madhe memories me shpenzime tĂ« reduktuara; mĂ« pak shikime faqe, mĂ« pak gabime faqe, operacione mĂ« tĂ« shpejta leximi/shkrimi pĂ«rmes bufereve tĂ« mĂ«dha. Si rezultat — pĂ«rmirĂ«simi i performancĂ«s.

PostgreSQL mbështet faqe të mëdha vetëm në Linux. Me rregulloren e zakonshme, Linux përdor 4 kB faqe meme, prandaj në raste kur operacionet me memori janë shumë të shumta, është e nevojshme të vendosen faqe më të mëdha. Observohet një rritje e performancës gjatë përdorimit të faqeve të mëdha me madhësi 2 MB deri në 1 GB. Madhësia e faqes së madhe mund të vendoset gjatë ngarkimit. Ju mund ta verifikoni lehtësisht parametrin e faqes së madhe dhe përdorimin e saj në kompjuterin tuaj Linux, duke përdorur komandën cat /proc/meminfo | grep -i huge.

Marrja e informacionit rreth faqeve të 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 kB

Në këtë shembull, megjithëse madhësia e faqes së madhe është vendosur në 2048 (2 MB), numri total i faqeve të mëdha ka vlerën 0. Kjo do të thotë se faqet e mëdha janë çaktivizuar.

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ë aktiv. Sigurohuni që variabli i mjedisit $PGDATA të ketë vendin e të dhënave të PostgreSQL.

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 më poshtë:

Dalja e skriptit

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

Vlera e rekomanduar për faqet e mëdha është 88, prandaj ju duhet të vendosni vlerën 88.

Vendosja e faqeve të mëdha

sysctl -w vm.nr_hugepages=88

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

Sërish informacion rreth faqeve të 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 kB

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

Dhe përsëri informacion rreth faqeve të 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 kB

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

Disa disa operacione me bazën e të dhënave për riciklimin e faqeve të mëdha

postgres=# KRIJO TABELË foo(a INTEGER);
KRIJO TABELË
postgres=# SHTO TË DHËNA NË foo VLERAT(gjenero_Series(1,10000000));
SHTO 0 10000000

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

Përsëri informata 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 kB

Tani mund të shihni se shumica e faqeve të mëdha janë të përdorura.

Shënim: vlera e përafërt për HugePages e përdorur këtu është shumë e ulët, që nuk është një vlerë normale për një makinë në ambientin prodhues. Ju lutemi, vlerësoni numrin e nevojshëm të faqeve për sistemin tuaj dhe i 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Ă« menaxhuar sjelljen e swap-it (swappiness) (kĂ«mbimi i faqeve nĂ« memorie dhe jashtĂ« saj) nĂ« Linux. Vlera varion nga 0 nĂ« 100. Ajo pĂ«rcakton sa memorie do tĂ« shkarkohet ose do tĂ« shkarkohet. Zero do tĂ« thotĂ« ndalimi i 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. Pra, është e sigurt të vendosni vlerën 1, nëse doni të minimizoni këmbimin. Vlera e paracaktuar në Linux është 60. Një vlerë më e lartë bën që MMU (blloku i 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 marrin memorie dhe e lirojnë atë kur nuk është më e nevojshme. Por në disa raste aplikacioni merr shumë memorie dhe nuk e lirojnë atë. Kjo mund të shkaktojë OOM killer. Këtu janë vlerat e mundshme për parametrin vm.overcommit_memory me një përshkrim për secilin:

  1. Overcommit heuristik (e paracaktuar); heuristikë e bazuar në bërthamë
  2. Lejo overcommit në çdo rast
  3. Mos e teproni, mos e kaloni koeficientin e overcommit.

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

vm.overcommit_ratio — pĂ«rqindja e kujtesĂ«s operative tĂ« disponueshme pĂ«r mbingarkim tĂ« tepruar. 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 ofron performancë më të mirë për PostgreSQL. Kjo vlerë maksimizon përdorimin e RAM-it nga procesi i serverit pa ndonjë rrezik të rëndësishëm për t'u vrarë nga procesi OOM killer. Aplikacioni mund të ri-dëbohet, por vetëm brenda mbingarkesës, duke zvogëluar rrezikun që OOM killer të vrasë procesin. Prandaj, vlera 2 sjell një performancë më të mirë se vlera e paracaktuar 0. Megjithatë, besueshmëria mund të përmirësohet duke mos mbingarkuar memorien jashtë intervals së lejuar. Kjo përjashton riskun e vrasjes së procesit nga OOM-killer.

Në sistemet pa swap, mund të ketë një problem me vm.overcommit_memory që është e 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.dirty_background_ratio — Ă«shtĂ« pĂ«rqindja e memories qĂ« Ă«shtĂ« mbushur me faqe tĂ« papastra qĂ« duhet tĂ« shkruhen nĂ« disk. Shkarkimi nĂ« disk realizohet nĂ« sfond. Vlera e kĂ«tij parametri varion nga 0 nĂ« 100; megjithatĂ«, njĂ« vlerĂ« mĂ« e ulĂ«t se 5 mund tĂ« jetĂ« e paefektshme, dhe disa bĂ«rthamĂ« nuk e mbĂ«shtesin atĂ«. 10 Ă«shtĂ« vlera e paracaktuar nĂ« shumicĂ«n e sistemeve Linux. Ju mund tĂ« pĂ«rmirĂ«soni performancĂ«n pĂ«r operacionet me shkarkim intensiv me njĂ« faktor mĂ« tĂ« vogĂ«l, i cili do tĂ« thotĂ« se Linux do tĂ« shkarkojĂ« faqet e papastra nĂ« sfond.

Ju nevojitet të caktoni vlerën vm.dirty_background_bytes në përputhje me shpejtësinë e diskut tuaj.

Për këto dy parametra nuk ka vlera "të mira", 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, rrit performancën deri në ~ 25% në shumicën e rasteve.

vm.dirty_ratio / dirty_bytes

Kjo është e njëjtë me vm.dirty_background_ratio / dirty_background_bytes, përveçse shkarkimi realizohet gjatë seancës së punës, duke bllokuar aplikacionin. Prandaj, vm.dirty_ratio duhet të jetë më e lartë se vm.dirty_background_ratio. Kjo siguron që proceset e sfondit do të fillojnë më herët për të shmangur bllokimin maksimale të mundshme të aplikacionit. Ju mund të përshtatni diferencën midis këtyre dy marrëdhënieve në varësi të ngarkesës së hyrjes/daljes në disk.

Përfundimi

Mund të konfiguroni parametra të tjerë për të rritur performancën, por përmirësimet do të jenë minimale dhe nuk do të fitoni ndonjë përfitim të veçantë. Duhet të kemi parasysh se jo të gjithë parametrat i përkasin të gjitha llojeve të aplikacioneve. Disa aplikacione funksionojnë më mirë kur rregullojmë disa parametra, ndërsa disa të tjera jo. Duhet të gjeni balancën e duhur mes konfigurimeve të këtyre parametrave për ngarkesën e pritur dhe llojin e aplikacionit, duke marrë parasysh gjithashtu sjelljen e sistemit operativ. Rregullimi i parametrave të bërthamës nuk është aq i lehtë sa rregullimi i parametrave të bazës së të dhënave: këtu është më e vështirë të jepen rekomandime.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster