Stilla Linux kjarnavalkosti til að fínstilla PostgreSQL

Stilla Linux kjarnavalkosti til að fínstilla PostgreSQL Ákjósanlegur PostgreSQL árangur fer eftir rétt skilgreindum stýrikerfisbreytum. Illa stilltar OS kjarnastillingar geta leitt til lélegrar frammistöðu gagnagrunnsþjónsins. Þess vegna er mikilvægt að þessar stillingar séu stilltar í samræmi við gagnagrunnsþjóninn og vinnuálag hans. Í þessari færslu munum við ræða nokkrar mikilvægar Linux kjarnabreytur sem geta haft áhrif á afköst gagnagrunnsþjónsins og hvernig á að stilla þær.

SHMMAX / SHMALL

SHMMAX er kjarnabreyta sem notuð er til að ákvarða hámarksstærð eins samnýtts minnishluta sem Linux ferli getur úthlutað. Fyrir útgáfu 9.2 notaði PostgreSQL System V (SysV), sem krefst SHMMAX stillingarinnar. Eftir 9.2 skipti PostgreSQL yfir í POSIX samnýtt minni. Svo nú þarf færri bæti af System V samnýtt minni.

Fyrir útgáfu 9.3 var SHMMAX mikilvægasta kjarnabreytan. SHMMAX gildið er tilgreint í bætum.

Að sama skapi SHMALL er önnur kjarnabreyta sem notuð er til að ákvarða
Umfang samnýttra minnisblaða um allt kerfið. Notaðu skipunina til að skoða núverandi SHMMAX, SHMALL eða SHMMIN gildi ipcs.

SHM* Upplýsingar - 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* Upplýsingar - 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 notar Kerfi V IPC til að úthluta sameiginlegu minni. Þessi færibreyta er ein mikilvægasta kjarnabreytan. Alltaf þegar þú færð eftirfarandi villuboð þýðir það að þú ert með eldri útgáfu af PostgreSQL og SHMMAX gildið þitt er mjög lágt. Gert er ráð fyrir að notendur stilli og hækki gildið í samræmi við samnýtt minni sem þeir ætla að nota.

Mögulegar rangstillingarvillur

Ef SHMMAX er ekki rétt stillt gætirðu fengið villu þegar reynt er að frumstilla PostgreSQL klasa með skipuninni initdb.

initdb bilun
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

Sömuleiðis gætirðu fengið villu þegar þú ræsir PostgreSQL netþjóninn með því að nota skipunina pg_ctl.

pg_ctl Bilun
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.

Að skilja muninn á skilgreiningum

Að skilgreina SHMMAX/SHMALL færibreyturnar er aðeins öðruvísi á Linux og MacOS X:

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

Team sysctl hægt að nota til að breyta gildinu tímabundið. Til að stilla fast gildi skaltu bæta færslu við /etc/sysctl.conf. Upplýsingar eru hér að neðan.

Breyting á kjarnastillingum á 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

Breyting á kjarnabreytum á 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

Ekki gleyma: Til að gera breytingar varanlegar skaltu bæta þessum gildum við /etc/sysctl.conf

Stórar síður

Linux notar sjálfgefið 4 KB minnissíður, BSD notar XNUMX KB minnissíður. Ofur blaðsíður, og á Windows - Stórar síður. Síða er stykki af vinnsluminni sem úthlutað er í ferli. Ferli getur haft margar síður eftir minniskröfum. Því meira minni sem ferli krefst, því fleiri síður er úthlutað. Stýrikerfið heldur úti síðuúthlutunartöflu fyrir ferla. Því minni sem síðustærðin er, því stærri taflan, því lengri tíma tekur að finna síðu í þeirri blaðsíðutöflu. Stórar síður leyfa því að nota mikið magn af minni með minni kostnaði; færri síðuflettingar, færri síðuvillur, hraðari lestur/skrifaðgerðir yfir stærri biðminni. Niðurstaðan er bætt frammistaða.

PostgreSQL styður aðeins stórar síður á Linux. Sjálfgefið er að Linux notar 4 KB minnissíður, þannig að í þeim tilvikum þar sem minnisaðgerðir eru of margar er nauðsynlegt að stilla stærri síður. Frammistöðuaukning sést þegar notaðar eru stórar síður upp á 2 MB og allt að 1 GB. Hægt er að stilla stóra síðustærð við ræsingu. Þú getur auðveldlega athugað stóru breytur síðunnar og notkun þeirra á Linux vélinni þinni með því að nota skipunina köttur /proc/meminfo | grep -i risastórt.

Að fá upplýsingar um stórar síður (aðeins 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

Í þessu dæmi, þó að stór síðustærð sé stillt á 2048 (2 MB), er heildarfjöldi stórra síðna stilltur á 0. Þetta þýðir að stórar síður eru óvirkar.

Forskrift til að ákvarða fjölda stórra síðna

Þetta einfalda handrit skilar tilskildum fjölda stórra síðna. Keyrðu handritið á Linux netþjóninum þínum á meðan PostgreSQL er í gangi. Gakktu úr skugga um að fyrir umhverfisbreytuna $PGDATA PostgreSQL gagnaskrá er tilgreind.

Að fá fjölda nauðsynlegra stórra síðna

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

Handritsúttakið lítur svona út:

Forskriftarúttak

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

Ráðlagt gildi fyrir stórar síður er 88, svo þú ættir að stilla það á 88.

Að setja upp stórar síður

sysctl -w vm.nr_hugepages=88

Athugaðu stórar síður núna, þú munt sjá að stórar síður eru ekki notaðar (HugePages_Free = HugePages_Total).

Stórar síður skoðaðar aftur (aðeins 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

Stilltu nú huge_pages færibreytuna á "on" í $PGDATA/postgresql.conf og endurræstu þjóninn.

Enn og aftur upplýsingar um stórar síður (aðeins 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

Nú sérðu að mjög fáar stórar síður eru notaðar. Við skulum nú reyna að bæta nokkrum gögnum við gagnagrunninn.

Sumar gagnagrunnsaðgerðir til að endurvinna stórar síður

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

Við skulum sjá hvort við notum fleiri stórar síður núna en áður.

Frekari upplýsingar á stórum síðum (aðeins 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

Nú sérðu að flestar stóru síðurnar eru notaðar.

Athugið: Áætlað gildi fyrir HugePages sem er notað hér er mjög lágt, sem er ekki eðlilegt gildi fyrir vél sem keyrir vöruumhverfi. Vinsamlega áætlaðu nauðsynlegan fjölda síðna fyrir kerfið þitt og stilltu þær í samræmi við það miðað við álag og tilföng.

vm.skipti

vm.skipti er önnur kjarnabreyta sem getur haft áhrif á afköst gagnagrunnsins. Þessi valkostur er notaður til að stjórna hegðun skipta (skipta síðum inn og út úr minni) á Linux. Gildið er á bilinu 0 til 100. Það ákvarðar hversu mikið minni verður blaðað eða blaðað út. Núll þýðir engin skipti og 100 þýðir árásargjarn skipti.

Þú getur náð góðum árangri með því að setja lægri gildi.

Ef þetta er stillt á 0 á nýrri kjarna getur það valdið því að OOM Killer (minnishreinsunarferli Linux) drepur ferlið. Svo það er óhætt að stilla það á 1 ef þú vilt lágmarka skipti. Sjálfgefið gildi í Linux er 60. Hærra gildi veldur því að MMU (memory management unit) notar meira skiptipláss en vinnsluminni, á meðan lægra gildi heldur meiri gögnum/kóða í minni.

Lægra gildi er gott veðmál fyrir bætta frammistöðu í PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Forrit eignast minni og losa það þegar þess er ekki lengur þörf. En í sumum tilfellum fær forritið of mikið minni og sleppir því ekki. Þetta getur valdið OOM morðingja. Hér eru möguleg færibreytugildi vm.overcommit_memory með lýsingu fyrir hvern:

  1. Heuristic overcommit (sjálfgefið); kjarna-undirstaða heuristic
  2. Leyfðu ofskuldbindingu samt
  3. Ekki ofleika það, ekki fara yfir overcommit hlutfallið.

Tilvísun: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — hlutfall af vinnsluminni tiltækt fyrir ofhleðslu. Gildi upp á 50% á kerfi með 2 GB af vinnsluminni getur úthlutað allt að 3 GB af vinnsluminni.

Gildið 2 fyrir vm.overcommit_memory veitir betri afköst fyrir PostgreSQL. Þetta gildi hámarkar vinnsluminni notkun netþjónsferlisins án verulegrar hættu á að verða drepinn af OOM killer ferlinu. Forritið mun vera fær um að endurhlaða, en aðeins innan marka yfirkeyrslu, sem dregur úr hættu á að OOM morðingi drepi ferlið. Þess vegna gefur gildið 2 betri afköst en sjálfgefið gildi 0. Hins vegar er hægt að bæta áreiðanleika með því að tryggja að minni utan sviðs sé ekki of mikið. Þetta útilokar hættuna á að ferlið verði drepið af OOM morðingja.

Á kerfum án þess að skipta getur vandamál komið upp með vm.overcommit_memory jafnt og 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 er hlutfall minnis sem er fyllt af óhreinum síðum sem þarf að skrifa á disk. Flutningur á disk á sér stað í bakgrunni. Gildi þessarar færibreytu er á bilinu 0 til 100; Hins vegar getur gildi undir 5 verið óvirkt og sumir kjarna styðja það ekki. 10 er sjálfgefið í flestum Linux kerfum. Þú getur bætt afköst fyrir ritfrekar aðgerðir með minni þátt, sem þýðir að Linux mun skola óhreinum síðum í bakgrunni.

Þú þarft að stilla gildið vm.dirty_background_bytes eftir hraða akstursins.

Það eru engin „góð“ gildi fyrir þessar tvær breytur þar sem báðar eru háðar vélbúnaði. Hins vegar, að stilla vm.dirty_background_ratio á 5 og vm.dirty_background_bytes á 25% af hraða disksins bætir afköst í ~25% í flestum tilfellum.

vm.dirty_ratio/dirty_bytes

Þetta er það sama og vm.dirty_background_ratio/dirty_background_bytes, nema að endurstillingin er framkvæmd í vinnulotu, sem hindrar forritið. Þess vegna ætti vm.dirty_ratio að vera hærra en vm.dirty_background_ratio. Þetta tryggir að bakgrunnsferli hefjist fyrr til að forðast að loka forritinu eins mikið og mögulegt er. Þú getur stillt mismuninn á þessum tveimur hlutföllum eftir I/O álagi disksins.

Samtals

Þú getur lagfært aðrar stillingar til að bæta árangur, en endurbæturnar verða í lágmarki og þú munt ekki sjá mikinn ávinning. Við verðum að muna að ekki allir valkostir eiga við um allar tegundir forrita. Sum forrit virka betur þegar við stillum sumar stillingar og önnur ekki. Þú verður að finna rétta jafnvægið á milli þess að stilla þessar stillingar fyrir væntanlegt vinnuálag og tegund forrita, og þú verður einnig að huga að hegðun stýrikerfisins þegar þú stillir. Að stilla kjarnafæribreytur er ekki eins auðvelt og að stilla gagnagrunnsfæribreytur; það er erfiðara að koma með tillögur.

Heimild: www.habr.com

Bæta við athugasemd