Linuxi sĂŒdamiku seadete kohandamine PostgreSQL-i optimeerimiseks

Linuxi sĂŒdamiku seadete kohandamine PostgreSQL-i optimeerimiseks PostgreSQL-i optimaalne jĂ”udlus sĂ”ltub Ă”igesti mÀÀratletud operatsioonisĂŒsteemi parameetritest. Vale seadistamine vĂ”ib viia andmebaasiserveri jĂ”udluse languseni. SeetĂ”ttu on hĂ€davajalik, et need parameetrid oleksid seadistatud vastavalt andmebaasiserverile ja selle koormusele. Selles postituses arutame mĂ”ningaid olulisi Linuxi sĂŒdamiku parameetreid, mis vĂ”ivad mĂ”jutada andmebaasiserveri jĂ”udlust ja nende seadistamise viise.

SHMMAX / SHMALL

SHMMAX — on sĂŒdamiku parameeter, mida kasutatakse Linuxi protsessi poolt eraldatava maksimumi mÀÀramiseks ĂŒhe jagatud mĂ€lu (shared memory) segmendi suuruse osas. Enne versiooni 9.2 kasutas PostgreSQL System V (SysV), mille jaoks on vajalik SHMMAX-i seadistamine. PĂ€rast 9.2 on PostgreSQL hĂŒpanud POSIX jagatud mĂ€lule. Nii et nĂŒĂŒd on vaja vĂ€hem System V jagatud mĂ€lu baite.

Enne versiooni 9.3 oli SHMMAX kĂ”ige olulisem sĂŒdamiku parameeter. SHMMAX-i vÀÀrtus mÀÀratakse bittides.

Sarnaselt, SHMALL — on veel ĂŒks sĂŒdamiku parameeter, mida kasutatakse mÀÀramiseks
ĂŒldiselt sĂŒsteemne jagatud mĂ€lu (shared memory) lehtede maht. Praeguste SHMMAX, SHMALL vĂ”i SHMMIN vÀÀrtuste vaatamiseks kasutage kĂ€sku ipcs.

SHM* ĂŒksikasjad — Linux

$ ipcs -lm

------ Jagatud mÀlu piirangud --------
max segmentide arv = 4096
max segment suurus (kbytes) = 1073741824
max kogu jagatud mÀlu (kbytes) = 17179869184
min segment suurus (bytes) = 1

SHM* ĂŒksikasjad — MacOS X

$ ipcs -M
IPC olek alates  Thu Aug 16 22:20:35 PKT 2018
shminfo:
	shmmax: 16777216	(max jagatud mÀlu segment suurus)
	shmmin:       1	(min jagatud mÀlu segment suurus)
	shmmni:      32	(max jagatud mÀlu identifikaatorite arv)
	shmseg:       8	(max jagatud mÀlu segmente protsessi kohta)
	shmall:    1024	(max jagatud mĂ€lu kogus lehekĂŒlgede kaupa)

PostgreSQL kasutab System V IPC jagatud mĂ€lu eraldamiseks. See seade on ĂŒks kĂ”ige olulisemaid tuumaparameetreid. Iga kord, kui saate jĂ€rgmised veateated, tĂ€hendab see, et teil on vanem PostgreSQL versioon ja SHMMAX vÀÀrtus on vĂ€ga madal. Oodatakse, et kasutajad kohandavad ja suurendavad vÀÀrtust vastavalt jagatud mĂ€lu hulgale, mida nad kavatsevad kasutada.

Vale konfiguratsiooni vead

Kui SHMMAX on vale seadistusega, vÔite saada veateate, kui proovite algatada PostgreSQL klastrit kÀsuga initdb.

initdb ebaÔnnestumine
DETAIL: EbaĂ”nnestunud sĂŒsteemi kĂ”ne oli shmget(key=1, size=2072576, 03600).

NÕU: See viga tĂ€hendab tavaliselt, et PostgreSQL-i nĂ”ue jagatud mĂ€lu segmendi jaoks ĂŒletab teie sĂŒdamiku SHMMAX parameetrit. 
Saate kas vĂ€hendada nĂ”ude suurust vĂ”i konfigureerida sĂŒdamikku suurema SHMMAX-iga. NĂ”ude suuruse vĂ€hendamiseks (praegu 2072576 baiti),
vÀhendage PostgreSQL-i jagatud mÀlu kasutamist, nÀiteks vÀhendades shared_buffers vÔi max_connections.

Kui nĂ”ude suurus on juba vĂ€ike, on vĂ”imalik, et see on vĂ€iksem kui teie sĂŒdamiku SHMMIN parameeter,
sel juhul tuleb nÔude suurust suurendada vÔi SHMMIN-i konfigureerida.

PostgreSQL-i dokumentatsioon sisaldab rohkem teavet jagatud mÀlu konfiguratsiooni kohta. lastprotsess lÔpetas exit koodiga 1

Samuti vÔite saada vea PostgreSQL-serveri kÀivitamisel kasutades kÀsku pg_ctl.

pg_ctl ebaÔnnestumine
DETAIL: EbaĂ”nnestunud sĂŒsteemi kĂ”ne oli shmget(key=5432001, size=14385152, 03600).

NÕU: See viga tĂ€hendab tavaliselt, et PostgreSQL-i nĂ”ue jagatud mĂ€lu segmendi jaoks ĂŒletab teie sĂŒdamiku SHMMAX parameetrit.

Saate kas vĂ€hendada nĂ”ude suurust vĂ”i konfigureerida sĂŒdamikku suurema SHMMAX-iga. NĂ”ude suuruse vĂ€hendamiseks (praegu 14385152 baiti) vĂ€hendage PostgreSQL-i jagatud mĂ€lu kasutamist, nĂ€iteks vĂ€hendades shared_buffers vĂ”i max_connections.

Kui nĂ”ude suurus on juba vĂ€ike, on vĂ”imalik, et see on vĂ€iksem kui teie sĂŒdamiku SHMMIN parameeter,
sel juhul tuleb nÔude suurust suurendada vÔi SHMMIN-i konfigureerida.

PostgreSQL-i dokumentatsioon sisaldab rohkem teavet jagatud mÀlu konfiguratsiooni kohta.

MÔistmine mÀÀratlemise erinevustest

SHMMAX/SHMALL parameetrite mÀÀratlemine erineb Linuxis ja MacOS X-is:

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

Meeskond sysctl vĂ”ib ajutiste vÀÀrtuste muutmiseks kasutada. PĂŒsivate vÀÀrtuste seadmiseks lisage kirje /etc/sysctl.conf. Üksikasjad on allpool.

SĂŒdamiku parameetrite muutmine MacOS X-il

# 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

SĂŒdamiku parameetrite muutmine Linuxis

# 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

Ärge unustage: et muudatused pĂŒsivaks muuta, lisage need vÀÀrtused faili /etc/sysctl.conf

Suured lehed (Huge Pages)

Linuxis kasutatakse vaikimisi 4 KB mĂ€lu lehti, BSD-s — Super Pages, Windowsis — Suured lehed. Leht on osa operatiivmĂ€lu, mis on eraldatud protsessile. Protsessil vĂ”ib olla mitu lehte, sĂ”ltuvalt mĂ€lunĂ”udest. Mida rohkem mĂ€lu protsess vajab, seda rohkem lehti talle eraldatakse. OS toetab protsesside jaoks lehtede eraldamise tabelit. Mida vĂ€iksem on lehe suurus, seda suurem on tabel, seda rohkem aega kulub lehe leidmiseks selles lehtede tabelis. SeetĂ”ttu vĂ”imaldavad suured lehed kasutada suurt hulka mĂ€lu vĂ€henenud kuludega; vĂ€hem lehe vaatamisi, vĂ€hem lehe vigu, kiirem lugemise/kirjutamise töötlus suurte pubufferitega. Tulemusena — jĂ”udluse paranemine.

PostgreSQL toetab suuri lehti ainult Linuxis. Vaikimisi kasutab Linux 4 KB mĂ€lu lehti, seega, kui mĂ€luoperatsioone on liiga palju, tuleb kasutada suuremaid lehti. Suuruse suurenemine on mĂ€rgatav, kui kasutada suuri lehti, mille suurus on 2 MB kuni 1 GB. Suure lehe suurust saab seadistada sĂŒsteemi kĂ€ivitamisel. Suuri lehti ja nende kasutust saate oma Linuxi arvutis hĂ”lpsasti kontrollida, kasutades kĂ€sku cat /proc/meminfo | grep -i huge.

Suure lehe teabe saamine (ainult Linuxi jaoks)

MĂ€rkus: see kehtib ainult Linuxile, teistele opsĂŒsteemidele seda toimingut ei rakendata $ 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

Selles nÀites, kuigi suur leht on seadistatud 2048 (2 MB), on suurte lehtede koguhulk 0. See tÀhendab, et suured lehed on keelatud.

Suure lehe arvu mÀÀramise skript

See on lihtne skript, mis tagastab vajaliku suurte lehtede arvu. KÀivitage skript oma Linuxi serveris, kuni PostgreSQL töötab. Veenduge, et keskkonnamuutuja $PGDATA on mÀÀratud PostgreSQL andme kataloogiks.

Suurte lehtede arv

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

Skripti vÀljund nÀeb vÀlja jÀrgmine:

Skripti vÀljund

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

Soovitatav suurte lehtede vÀÀrtus on 88, seega peaksite mÀÀrama vÀÀrtuse 88.

Suure lehe seadmine

sysctl -w vm.nr_hugepages=88

Kontrollige nĂŒĂŒd suuri lehti, nĂ€ete, et suured lehed ei ole kasutusel (HugePages_Free = HugePages_Total).

JĂ€llegi teave suurte lehtede kohta (ainult Linuxis)

$ 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

NĂŒĂŒd seadke huge_pages parameeter 'on' failis $PGDATA/postgresql.conf ja taaskĂ€ivitage server.

Ja jÀlle teave suurte lehtede kohta (ainult Linuxis)

$ 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ĂŒĂŒd nĂ€ete, et suurt lehekĂŒlge kasutatakse vĂ€ga vĂ€he. Proovime nĂŒĂŒd andmeid andmebaasi lisada.

MĂ”ned andmebaasi toimingud suurte lehekĂŒlgede utiliseerimiseks

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

Vaadake, kas me kasutame nĂŒĂŒd rohkem suuri lehekĂŒlgi kui varem.

Veel kord teave suurte lehekĂŒlgede kohta (ainult Linuxi jaoks)

$ 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ĂŒĂŒd nĂ€ete, et enamik suuri lehekĂŒlgi on kasutuses.

MĂ€rkus: siin kasutatud HugePages'i ligikaudne vÀÀrtus on vĂ€ga madal, mis ei ole tootmiskeskkonna masina jaoks normaalne. Palun hinnake oma sĂŒsteemi vajaminevat lehekĂŒlgede arvu ja seadistage need vastavalt koormusele ja ressurssidele.

vm.swappiness

vm.swappiness — see on veel ĂŒks tuumaparameeter, mis vĂ”ib andmebaasi jĂ”udlust mĂ”jutada. Seda parameetrit kasutatakse vahetuse (swappiness) kĂ€itumise juhtimiseks (lehekĂŒlgede vahetamine mĂ€llu ja sealt vĂ€lja) Linuxis. VÀÀrtus jÀÀb vahemikku 0 kuni 100. See mÀÀrab, kui palju mĂ€lu vabastatakse vĂ”i vahetatakse. Null tĂ€histab, et vahetust ei ole, ja 100 tĂ€hendab agressiivset vahetust.

Saate head jÔudlust saavutada, seadistades madalamad vÀÀrtused.

VÀÀrtuse seadmine 0 uutesse kÀrgedesse vÔib pÔhjustada OOM Killeri (Linuxi mÀlu puhastamise protsess) protsessi tapmise. Seega on ohutu seada vÀÀrtus 1, kui soovite vÀhendada vahetust. Vaikimisi on Linuxi vÀÀrtus 60. KÔrgem vÀÀrtus muudab MMU (mÀlu juhtimise blokki) kasutama rohkem vahetusruumi kui RAM, samas kui madalam vÀÀrtus hoiab rohkem andmeid/koodi mÀlus.

Madalam vÀÀrtus on hea vÔimalus PostgreSQL sooritusvÔime parandamiseks.

vm.overcommit_memory / vm.overcommit_ratio

Rakendused saavad mĂ€lu ja vabastavad selle, kui see enam vajalik ei ole. Kuid mĂ”nel juhul saavad rakendused liiga palju mĂ€lu ja ei vabasta seda. See vĂ”ib pĂ”hjustada OOM-killerit. Siin on vĂ”imalikud parameetri vÀÀrtused vm.overcommit_memory igaĂŒhe kirjeldusega:

  1. Heuristiline ĂŒlekoormus (vaikekĂ€itumine); tuumapĂ”hine heuristika
  2. Lubage ĂŒlekoormus igal juhul
  3. Ärge ĂŒle pingutage, Ă€rge ĂŒletage ĂŒlekoormuse suhet.

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

vm.overcommit_ratio — protsent töötavast mĂ€lust, mis on ĂŒlekoormuse jaoks saadaval. 50% vÀÀrtus sĂŒsteemis, kus on 2 GB RAM-i, vĂ”ib eraldada kuni 3 GB RAM-i.

vm.overcommit_memory vÀÀrtus 2 tagab PostgreSQL-i jaoks parema jĂ”udluse. See vÀÀrtus maksimeerib serveriprotsessi mĂ€lukasutust ilma OOM killer'i protsessi tapmise olulise riskita. Rakendus suudab taaskĂ€ivituda, kuid ainult ĂŒlejÀÀgi piires, mis vĂ€hendab riski, et OOM killer protsessi tapab. SeetĂ”ttu pakub vÀÀrtus 2 parem jĂ”udlus kui vaikevÀÀrtus 0. Siiski, usaldusvÀÀrsust saab parandada, kui mĂ€lu ei ĂŒletata lubatud vahemikku. See vĂ€listab riski, et protsess tapetakse OOM killer'i poolt.

Ilma vahetusfailita sĂŒsteemides vĂ”ib vm.overcommit_memory vÀÀrtus 2 pĂ”hjustada probleeme.

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 — see on protsent mĂ€lust, mis on tĂ€idetud rĂ€paste lehtedega, mis tuleb kettale kirjutada. Kettale kirjutamine toimub taustal. Selle parameetri vÀÀrtus vĂ”ib varieeruda 0 kuni 100; siiski vĂ”ib vÀÀrtus alla 5 olla ebaefektiivne ja mĂ”ned kernelid ei toeta seda. 10 on vaikimisi vÀÀrtus enamikus Linuxi sĂŒsteemides. Saate suurendada jĂ”udlust intensiivse kirjutamise operatsioonide puhul madalama koefitsiendiga, mis tĂ€hendab, et Linux kirjutab rĂ€pased lehed taustal.

Peate seadma vÀÀrtuse vm.dirty_background_bytes vastavalt teie ketta kiirusest.

Nende kahe parameetri jaoks ei ole "head" vÀÀrtused, kuna mÔlemad sÔltuvad riistvarast. Siiski, kui seada vm.dirty_background_ratio vÀÀrtuseks 5 ja vm.dirty_background_bytes 25% ketta kiirusest, parendab see jÔudlust kuni ~ 25% enamikul juhtudel.

vm.dirty_ratio / dirty_bytes

See on sama mis vm.dirty_background_ratio / dirty_background_bytes, vÀlja arvatud see, et kirjutamine toimub tööseansi ajal, blokeerides rakenduse. SeetÔttu peab vm.dirty_ratio olema kÔrgem kui vm.dirty_background_ratio. See tagab, et taustprotsessid kÀivituvad varem, et vÀltida rakenduse maksimaalse vÔimaliku blokeerimise tekkimist. Saate seada nende kahe suhte vahelise erinevuse vastavalt kettasisendi-vÀljundi koormusele.

KokkuvÔte

Saate konfigureerida teisi parameetreid, et parandada jĂ”udlust, kuid paranemist on minimaalne ja kasu ei ole suurt. Peame meeles pidama, et mitte kĂ”ik parameetrid ei kehti kĂ”ikide rakendustĂŒĂŒpide jaoks. mĂ”ned rakendused toimivad paremini, kui seadistame teatud parameetreid, ja mĂ”ned — mitte. Peate leidma Ă”ige tasakaalu nende parameetrite seadistuste vahel oodatava töökoormuse ja rakendustĂŒĂŒbi jaoks ning arvestama seadistamisel ka opsĂŒsteemi kĂ€itumisega. Tuuma seadistamine ei ole nii lihtne nagu andmebaasi seade: siin on keerulisem anda soovitusi.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster