Linux Kernel aukerak konfiguratzea PostgreSQL optimizatzeko

Linux Kernel aukerak konfiguratzea PostgreSQL optimizatzeko PostgreSQL-ren errendimendu optimoa behar bezala definitutako sistema eragilearen parametroen araberakoa da. Gaizki konfiguratutako sistema eragilearen nukleoaren ezarpenek datu-basearen zerbitzariaren errendimendu eskasa eragin dezakete. Hori dela eta, ezinbestekoa da ezarpen hauek datu-basearen zerbitzariaren eta bere lan-kargaren arabera konfiguratzea. Argitalpen honetan, datu-basearen zerbitzariaren errendimenduan eragina izan dezaketen Linux nukleoaren parametro garrantzitsu batzuk eztabaidatuko ditugu eta horiek nola konfiguratu.

SHMMAX / SHMALL

SHMMAX Linux prozesu batek esleitu dezakeen partekatutako memoria-segmentu bakar baten gehienezko tamaina zehazteko erabiltzen den nukleo-parametroa da. 9.2 bertsioaren aurretik, PostgreSQL-k System V (SysV) erabiltzen zuen, SHMMAX ezarpena behar duena. 9.2 ondoren, PostgreSQL POSIX memoria partekatura aldatu zen. Beraz, orain System V memoria partekatuaren byte gutxiago behar dira.

9.3 bertsioaren aurretik, SHMMAX nukleoaren parametro garrantzitsuena zen. SHMMAX balioa bytetan zehazten da.

Era berean, TXIKIA zehazteko erabiltzen den nukleoaren beste parametro bat da
partekatutako memoria orrien sistema osorako. Uneko SHMMAX, SHMALL edo SHMMIN balioak ikusteko, erabili komandoa ipcs.

SHM* Xehetasunak - 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* Xehetasunak - 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 erabiltzen du V sistema IPC partekatutako memoria esleitzeko. Parametro hau nukleoaren parametro garrantzitsuenetako bat da. Errore-mezu hauek jasotzen dituzun bakoitzean, PostgreSQL-ren bertsio zaharrago bat duzula eta zure SHMMAX balioa oso baxua dela esan nahi du. Erabiltzaileek erabili nahi duten memoria partekatuaren arabera doitzea eta handitzea espero da.

Okerreko konfigurazio akats posibleak

SHMMAX behar bezala konfiguratuta ez badago, baliteke errore bat jasotzea komandoa erabiliz PostgreSQL kluster bat hasieratzen saiatzean. initdb.

initdb Porrota
DETAIL: Failed system call was shmget(key=1, size=2072576, 03600).

AHOLKUA: Errore honek normalean esan nahi du PostgreSQL-ek memoria partekatuko segmentu baterako egindako eskaerak zure kernelaren SHMMAX parametroa gainditu duela. 
Eskaeraren tamaina murriztu edo kernela SHMMAX handiago batekin birkonfiguratu dezakezu. Eskaeraren tamaina murrizteko (gaur egun 2072576 byte),
Murriztu PostgreSQL-ren memoria partekatuaren erabilera, agian shared_buffers edo max_connections murriztuz.

Eskaeraren tamaina txikia bada, posible da zure kernelaren SHMMIN parametroa baino txikiagoa izatea,
kasu horretan eskaeraren tamaina handitzea edo SHMMIN berkonfiguratzea beharrezkoa da.

PostgreSQL dokumentazioak memoria partekatuaren konfigurazioari buruzko informazio gehiago dauka. haur-prozesua 1 irteera-kodearekin amaitu da

Era berean, errore bat jaso dezakezu PostgreSQL zerbitzaria komandoa erabiliz abiaraztean pg_ctl.

pg_ctl Porrota
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).

AHOLKUA: Errore honek normalean esan nahi du PostgreSQL-ek memoria partekatuko segmentu baterako egindako eskaerak zure kernelaren SHMMAX parametroa gainditu duela.

Eskaeraren tamaina murriztu edo kernela SHMMAX handiago batekin berriro konfigura dezakezu. Eskaeraren tamaina murrizteko (gaur egun 14385152 byte), murriztu PostgreSQL-ren memoria partekatuaren erabilera, agian shared_buffers edo max_connections murriztuz.

Eskaeraren tamaina txikia bada, posible da zure kernelaren SHMMIN parametroa baino txikiagoa izatea,
kasu horretan eskaeraren tamaina handitzea edo SHMMIN berkonfiguratzea beharrezkoa da.

PostgreSQL dokumentazioak memoria partekatuaren konfigurazioari buruzko informazio gehiago dauka.

Definizioen desberdintasunak ulertzea

SHMMAX/SHMALL parametroak zehaztea zertxobait desberdina da Linux eta MacOS X-n:

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

Team sysctl balioa aldi baterako aldatzeko erabil daiteke. Balio konstanteak ezartzeko, gehitu sarrera bat /etc/sysctl.conf. Xehetasunak behean daude.

Kernel ezarpenak aldatzea MacOS X-n

# 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

Kernel-en parametroak aldatzea Linux-en

# 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

Ez ahaztu: Aldaketak iraunkorrak izan daitezen, gehitu balio hauek /etc/sysctl.conf-en

Orrialde Erraldoiak

Linuxek 4 KB-ko memoria-orriak erabiltzen ditu lehenespenez, BSD-k XNUMX KB-ko memoria-orriak erabiltzen ditu. Super orriak, eta Windows-en - Orrialde Handiak. Orrialde bat prozesu bati esleitutako RAM zati bat da. Prozesu batek hainbat orrialde izan ditzake memoria-beharren arabera. Zenbat eta memoria gehiago behar du prozesu batek, orduan eta orrialde gehiago esleitzen ditu. OSak prozesuetarako orrialdeen esleipen-taula mantentzen du. Zenbat eta txikiagoa izan orriaren tamaina, orduan eta handiagoa izango da taula, orduan eta denbora gehiago behar da orrialde bat orri bat aurkitzeko. Orrialde handiek, beraz, memoria kopuru handiak erabiltzea ahalbidetzen dute gainkostu murriztuarekin; orrialde-ikustaldi gutxiago, orrialde-akats gutxiago, irakurketa/idazketa eragiketa azkarragoak buffer handiagoetan. Emaitza errendimendua hobetzea da.

PostgreSQL-k Linux-en orrialde handiak soilik onartzen ditu. Lehenespenez, Linux-ek 4 KB-ko memoria-orriak erabiltzen ditu, beraz, memoria-eragiketa gehiegi dauden kasuetan, orrialde handiagoak ezarri behar dira. Errendimendu-irabaziak ikusten dira 2 MB eta 1 GB arteko orrialde handiak erabiltzen dituzunean. Orrialdearen tamaina handia abiaraztean ezar daiteke. Orrialde handien parametroak eta haien erabilera zure Linux makinan erraz egiaztatu ditzakezu komandoa erabiliz cat /proc/meminfo | grep -i erraldoia.

Orrialde handiei buruzko informazioa lortzea (Linux soilik)

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

Adibide honetan, orrialde handien tamaina 2048 (2 MB) ezarrita dagoen arren, orrialde handien guztizko kopurua 0 da. Horrek esan nahi du orrialde handiak desgaituta daudela.

Orrialde handien kopurua zehazteko gidoia

Script sinple honek beharrezko orrialde handien kopurua itzultzen du. Exekutatu scripta zure Linux zerbitzarian PostgreSQL exekutatzen ari den bitartean. Ziurtatu hori ingurune-aldagaiarentzat $PGDATA PostgreSQL datu-direktorioa zehaztuta dago.

Beharrezko orrialde handien kopurua lortzea

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

Script-eko irteerak honelako itxura du:

Script irteera

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

Orrialde handietarako gomendatutako balioa 88 da, beraz, 88an ezarri beharko zenuke.

Orrialde Handiak instalatzea

sysctl -w vm.nr_hugepages=88

Egiaztatu orrialde handiak orain, orrialde handiak ez direla erabiltzen ikusiko duzu (HugePages_Free = HugePages_Total).

Orrialde handiak berrikusi (Linux soilik)

$ 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

Orain ezarri huge_pages parametroa "on" gisa $PGDATA/postgresql.conf-en eta berrabiarazi zerbitzaria.

Berriro ere, orrialde handiei buruzko informazioa (Linux soilik)

$ 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

Orain ikus dezakezu oso orrialde handi gutxi erabiltzen ari direla. Saia gaitezen orain datu-basean datu batzuk gehitzen.

Datu-baseko eragiketa batzuk orrialde handiak birziklatzeko

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

Ea orain lehen baino orrialde handi gehiago erabiltzen ari garen.

Informazio gehiago orri handietan (Linux soilik)

$ 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

Orain ikus dezakezu orrialde handi gehienak erabiltzen ari direla.

Oharra: hemen erabiltzen den HugePages-en balio estimatua oso baxua da, eta hori ez da balio normala produktu-ingurune bat exekutatzen duen makina batentzat. Mesedez, kalkulatu zure sistemarako beharrezkoa den orrialde kopurua eta ezarri kargaren eta baliabideen arabera.

vm.trukea

vm.trukea datu-basearen errendimenduan eragina izan dezakeen nukleoaren beste parametro bat da. Aukera hau Linux-en trukearen portaera (orriak trukatzea eta memoriatik kanpo) kontrolatzeko erabiltzen da. Balioa 0tik 100era bitartekoa da. Zenbat memoria orria edo orria aterako den zehazten du. Zerok trukerik ez du esan nahi eta 100ek truke oldarkorra esan nahi du.

Errendimendu ona lor dezakezu balio baxuagoak ezarriz.

Nukleo berrietan 0-an ezartzeak OOM Killer-ek (Linux-en memoria garbitzeko prozesua) prozesua akabatzea eragin dezake. Beraz, segurua da 1ean ezartzea trukea minimizatu nahi baduzu. Linux-en balio lehenetsia 60 da. Balio handiagoak MMUk (memoria kudeatzeko unitatea) RAM baino truke-espazio gehiago erabiltzea eragiten du, eta balio baxuago batek datu/kode gehiago gordetzen du memorian.

Balio baxuagoa apustu ona da PostgreSQL-en errendimendua hobetzeko.

vm.overcommit_memory / vm.overcommit_ratio

Aplikazioek memoria eskuratzen dute eta beharrezkoa ez denean askatzen dute. Baina kasu batzuetan, aplikazioak memoria gehiegi lortzen du eta ez du askatzen. Horrek OOM hiltzaile bat sor dezake. Hona hemen parametroen balio posibleak vm.overcommit_memory bakoitzaren deskribapen batekin:

  1. Gehiegizko konpromiso heuristikoa (lehenetsia); nukleoan oinarritutako heuristika
  2. Baimendu gainkonpromisoa hala ere
  3. Ez gehiegi egin, ez gainditu gainkonpromisoaren ratioa.

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

vm.gaincommit_ratioa — Gainkargarako erabilgarri dagoen RAM ehunekoa. 50 GB RAM dituen sistema batean % 2eko balio batek 3 GB RAM esleitu ditzake.

vm.overcommit_memory-rako 2 balio batek errendimendu hobea eskaintzen du PostgreSQL-rentzat. Balio honek zerbitzariaren prozesuaren RAM erabilera maximizatzen du OOM hiltzaile prozesuak hiltzeko arrisku handirik gabe. Aplikazioa berriro kargatu ahal izango da, baina gainditze-mugetan soilik, eta horrek OOM hiltzaile batek prozesua hiltzeko arriskua murrizten du. Hori dela eta, 2 balioak 0 balio lehenetsiak baino errendimendu hobea ematen du. Hala ere, fidagarritasuna hobetu daiteke barrutitik kanpoko memoria gainkargatuta ez dagoela ziurtatuz. Horrek OOM hiltzaile batek prozesua hiltzeko arriskua ezabatzen du.

Trukatu gabeko sistemetan, vm.overcommit_memory 2-ren berdina den arazoa gerta daiteke.

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 diskoan idatzi behar diren orrialde zikinez betetako memoriaren ehunekoa da. Diskoaren garbiketa atzeko planoan gertatzen da. Parametro honen balioa 0 eta 100 bitartekoa da; hala ere, 5etik beherako balio bat eraginkorra izan daiteke eta nukleo batzuek ez dute onartzen. 10 lehenetsia da Linux sistema gehienetan. Idazketa intentsiboko eragiketetarako errendimendua hobetu dezakezu faktore txikiagoarekin, eta horrek esan nahi du Linuxek atzeko planoan orri zikinak garbituko dituela.

Balioa ezarri behar duzu vm.dirty_background_bytes zure diskoaren abiaduraren arabera.

Ez dago balio "onik" bi parametro hauetarako, biak hardwarearen menpekoak baitira. Hala ere, vm.dirty_background_ratio 5ean eta vm.dirty_background_bytes diskoaren abiaduraren %25ean ezarriz gero, errendimendua %25era hobetzen da kasu gehienetan.

vm.dirty_ratio/dirty_bytes

Berdin da vm.dirty_background_ratio/dirty_background_bytes, berrezartzea langileen saio batean egiten dela izan ezik, aplikazioa blokeatuz. Beraz, vm.dirty_ratio baino handiagoa izan beharko litzateke vm.dirty_background_ratio. Horrek bermatzen du atzeko planoko prozesuak lehenago hasten direla aplikazioa ahalik eta gehien blokeatzea saihesteko. Bi ratio hauen arteko aldea doi dezakezu diskoko I/O kargaren arabera.

Guztira

Beste ezarpen batzuk molda ditzakezu errendimendua hobetzeko, baina hobekuntzak gutxienekoak izango dira eta ez duzu onura handirik ikusiko. Gogoratu behar dugu aukera guztiak ez direla aplikazio mota guztietan aplikatzen. Aplikazio batzuek hobeto funtzionatzen dute ezarpen batzuk doitzen ditugunean, eta beste batzuk ez. Ezarpen hauek espero duzun lan-kargaren eta aplikazio-motaren arabera konfiguratzeko oreka egokia aurkitu behar duzu, eta sintonizatzerakoan OS-aren portaera ere kontuan hartu behar duzu. Nukleoaren parametroak konfiguratzea ez da datu-basearen parametroak konfiguratzea bezain erraza; zailagoa da gomendioak ematea.

Iturria: www.habr.com

Gehitu iruzkin berria