Linuxi tuumaparameetrite seadistamine PostgreSQL optimeerimiseks

Linuxi tuumaparameetrite seadistamine PostgreSQL optimeerimiseks PostgreSQL'i optimeerimine sĂ”ltub Ă”igesti mÀÀratud operatsioonisĂŒsteemi parameetritest. Vale konfiguratsiooniga OS-i tuumaparameetrid vĂ”ivad vĂ€hendada andmebaasi serveri jĂ”udlust. SeetĂ”ttu on oluline, et need parameetrid oleksid seadistatud vastavalt andmebaasi serverile ja selle koormusele. Selles postituses arutame mĂ”ningaid olulisi Linuxi tuumaparaametreid, mis vĂ”ivad mĂ”jutada andmebaasi serveri jĂ”udlust ja nende seadistamise viise.

SHMMAX / SHMALL

SHMMAX on tuumaparameeter, mida kasutatakse maksimaalse ĂŒhte jagatud mĂ€lu (shared memory) segmenti suuruse mÀÀramiseks, mille Linuxi protsess saab eraldada. Enne versiooni 9.2 kasutas PostgreSQL System V (SysV), mis nĂ”udis SHMMAX seadistamist. PĂ€rast versiooni 9.2 on PostgreSQL ĂŒlemineku POSIX jagatud mĂ€lule. Nii et nĂŒĂŒd on vajalik vĂ€hem System V jagatud mĂ€lu baite.

Enne versiooni 9.3 oli SHMMAX kÔige olulisem tuumaparameeter. SHMMAX vÀÀrtus on tiksustatud baitides.

Sarnasel viisil, SHMALL on veel ĂŒks tuumaparameeter, mida kasutatakse mÀÀramiseks
ĂŒldise jagatud mĂ€lu lehtede (shared memory) 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 segmendi suurus (kbytes) = 1073741824
max kogu jagatud mÀlu (kbytes) = 17179869184
min segmendi suurus (baitides) = 1

SHM* Üksikasjad — MacOS X

$ ipcs -M
IPC staatuse aruandlus alates Thu Aug 16 22:20:35 PKT 2018
shminfo:
	shmmax: 16777216	(max jagatud mÀlu segmenti suurus)
	shmmin:       1	(min jagatud mÀlu segmenti suurus)
	shmmni:      32	(max jagatud mÀlu identifikaatorite arv)
	shmseg:       8	(max jagatud mÀlu segmente protsessi kohta)
	shmall:    1024	(max jagatud mÀlu hulk lehtedes)

PostgreSQL kasutab System V IPC jagatud mĂ€lu eraldamiseks. See parameeter on ĂŒks tĂ€htsamaid 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. Eeldatakse, et kasutajad kohandavad ja suurendavad vÀÀrtust vastavalt jagatud mĂ€lule, mida nad kavatsevad kasutada.

Vale konfiguratsiooni vead

Kui SHMMAX on valesti seadistatud, vÔite saada vea, kui proovite PostgreSQL klastrit initsialiseerida kÀsuga initdb.

initdb ebaÔnnestumine
DETAIL: Eba sĂŒsteemikĂ”ne, mida ei suudetud tĂ€ita, oli shmget(key=1, size=2072576, 03600).

HINT: See viga tĂ€hendab tavaliselt, et PostgreSQL'i pĂ€ring jagatud mĂ€lufragmenti ĂŒletas teie kernelis oleva SHMMAX parameetri. 
VÔite kas vÀhendada pÀringu suurust vÔi konfigureerida kernelit suurema SHMMAX-iga. PÀringu suuruse vÀhendamiseks (praegu 2072576 baitset),
vÀhendage PostgreSQL'i jagatud mÀlukasutust, vÔib-olla vÀhendades shared_buffers vÔi max_connections.

Kui pÀringu suurus on juba vÀike, vÔib see olla vÀiksem kui teie kernelis oleva SHMMIN parameeter,
sel juhul on vajalik pÀringu suuruse suurendamine vÔi SHMMIN-i konfigureerimine.

PostgreSQLi dokumentatsioonis on rohkem teavet jagatud mÀlukonfiguratsiooni kohta. lapseprotsess lÔpetas töö vÀljundkoodiga 1

Sarnaselt vÔite saada vea, kui kÀivitate PostgreSQL serveri kÀsuga pg_ctl.

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

HINT: See viga tĂ€hendab tavaliselt, et PostgreSQL'i pĂ€ring jagatud mĂ€lufragmenti ĂŒletas teie kernelis oleva SHMMAX parameetri.

Saate kas vÀhendada pÀringu suurust vÔi konfigureerida kernelit suurema SHMMAX-i mÀÀraga. VÀhendamiseks (hetkel 14385152 baitides) vÀhendage PostgreSQL jagatud mÀlu kasutamist, vÔib-olla vÀhendades shared_buffers vÔi max_connections.

Kui pÀringu suurus on juba vÀike, vÔib see olla vÀiksem kui teie kernelis oleva SHMMIN parameeter,
sel juhul on vajalik pÀringu suuruse suurendamine vÔi SHMMIN-i konfigureerimine.

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

MÔistmine definitsioonide erinevustest

SHMMAX/SHMALL parameetrite mÀÀratlemine on Linuxis ja MacOS X-is veidi erinev:

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

Meeskond sysctl seda saab kasutada vÀÀrtuse ajutiseks muutmiseks. PĂŒsivalt vÀÀrtuste seadmiseks lisage kirje /etc/sysctl.conf. Üksikasjad on allpool.

Tuuma seadete muutmine MacOS X-is

# 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

Tuuma seadete 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 oleksid pĂŒsivad, lisage need vÀÀrtused faili /etc/sysctl.conf

Suurendatud lehed (Huge Pages)

Linuxis kasutatakse vaikimisi 4 KB mĂ€lulehti, BSD-s — Super Pages, ja Windowsis — Suured lehed. Leht on protsessile eraldatud osa töömĂ€lu. Protsessil vĂ”ib olla mitu lehte sĂ”ltuvalt mĂ€lu nĂ”udmistest. Mida rohkem mĂ€lu protsess vajab, seda rohkem lehti talle eraldatakse. OPS toetab protsesside 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 mĂ€lumahtu vĂ€iksemate halduskuludega; vĂ€hem lehte vaadatakse, vĂ€hem lehe vigu, kiiremad lugemis-/kirjutamisoperatsioonid suurte pubufferitega. Tulemuseks on jĂ”udluse paranemine.

PostgreSQL toetab suuri lehti ainult Linuxis. Vaikimisi kasutab Linux 4 KB mÀlulehti, seetÔttu, kui mÀluoperatsioone on liiga palju, on vajalik seadistada suuremad lehed. Suurte lehtede kasutamisel, mille suurus on 2 MB kuni 1 GB, on tÀheldatud jÔudluse kasvu. Suure lehe suurust saab mÀÀrata kÀivitamise ajal. Saate oma Linuxi arvuti suurte lehtede seadistusi ja kasutust hÔlpsasti kontrollida kÀsuga cat /proc/meminfo | grep -i huge.

Suurete lehtede teabe saamine (ainult Linuxis)

MĂ€rkus: see kehtib ainult Linuxile, teiste opsĂŒsteemide puhul see toiming ignoreeritakse $ 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 suure lehe suurus on seadistatud 2048 (2 MB), on suurte lehtede koguarv 0. See tĂ€hendab, et suured lehed on vĂ€lja lĂŒlitatud.

Suurte lehtede arvu mÀÀramise skript

See on lihtne skript, mis tagastab vajalikku arvu suuri lehti. KÀivitage skript oma Linuxi serveris, kuni PostgreSQL töötab. Veenduge, et keskkonnamuutuja $PGDATA on seadistatud PostgreSQLi andmekatalooge.

Suure lehe arvu mÀÀramine

#!/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 seadistama vÀÀrtuseks 88.

Suurte lehtede seadmine

sysctl -w vm.nr_hugepages=88

Kontrollige nĂŒĂŒd suurte lehtede staatust, nĂ€ete, et suurte lehti ei kasutata (HugePages_Free = HugePages_Total).

Taaskord suurte lehtede teave (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 «on» $PGDATA/postgresql.conf failis ja taaskĂ€ivitage server.

Ja taas suurte lehtede teave (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 vĂ€ga vĂ€he suuri lehti on kasutatud. Proovime nĂŒĂŒd andmeid andmebaasi lisada.

Andmebaasi operatsioonid suurte lehtede Àra kasutamiseks

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

Vaadakem, kas me nĂŒĂŒd kasutame rohkem suuri lehti kui varem.

Veel kord suurte lehtede teave (ainult Linuxis)

$ 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 lehti on kasutusel.

MĂ€rkus: siinkohal kasutatud HugePagesi ligikaudne vÀÀrtus on vĂ€ga madal, mis ei ole tootmisringkonna masina jaoks normaalne. Palun hinnake oma sĂŒsteemi jaoks vajalik lehtede arv ning seadistage need vastavalt koormusele ja ressurssidele.

vm.swappiness

vm.swappiness — see on veel ĂŒks tuuma parameeter, mis vĂ”ib mĂ”jutada andmebaasi jĂ”udlust. Seda parameetrit kasutatakse lehe vahetamise (swappiness) kĂ€itumise juhtimiseks Linuxis. VÀÀrtus ulatub 0 kuni 100. See mÀÀrab, kui palju mĂ€lu laaditakse vĂ”i laaditakse tagasi. Null tĂ€histab vahetamise keelamist, 100 aga agressiivset vahetamist.

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

Uute tuumade puhul 0 vÀÀrtuse seadmine vĂ”ib tuua kaasa selle, et OOM Killer (Linuxi mĂ€lu puhastamise protsess) tapab protsessi. Seega on ohutu seada vÀÀrtus 1, kui soovite vahetamisest teadlikult vĂ€ltida. Linuxi vaikimisi vÀÀrtus on 60. KĂ”rgem vÀÀrtus paneb MMU (mĂ€lu haldamise ĂŒhik) kasutama rohkem vahetusruumi kui RAM, samas kui madalam vÀÀrtus hoiab rohkem andmeid/koodi mĂ€lus.

Madalam vÀÀrtus on hea valik PostgreSQL jÔudluse parandamiseks.

vm.overcommit_memory / vm.overcommit_ratio

Rakendused saavad mĂ€lu ja vabastavad selle, kui see enam ei ole vajalik. Kuid mĂ”nel juhul saab rakendus liiga palju mĂ€lu ja ei vabasta seda. See vĂ”ib pĂ”hjustada OOM killer'i. Siin on vĂ”imalike parameetrite vÀÀrtused vm.overcommit_memory igaĂŒhe kirjeldusega:

  1. Heuristiline ĂŒlekompenseerimine (vaikimisi); pĂ”hineb tuuma heuristikatel
  2. Lubada ĂŒlekompenseerimine igal juhul
  3. Ärge ĂŒle pingutage, Ă€rge ĂŒletage ĂŒlekompensatsiooni suhet.

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

vm.overcommit_ratio — protsent RAM-ist, mis on saadaval ĂŒlekompenseerimiseks. 50% vÀÀrtus 2 GB RAM-iga sĂŒsteemis vĂ”ib eraldada kuni 3 GB RAM-i.

VÀÀrtus 2 vm.overcommit_memory jaoks tagab parema jĂ”udluse PostgreSQL-ile. See maksimeerib serveri protsessi RAM-i kasutamise ilma OOM killer'iga tapmise mĂ€rkimisvÀÀrse riskita. Rakendus saab taaskĂ€ivitada, kuid ainult ĂŒletatavates piirides, vĂ€hendades OOM killer'i protsessi tapmise ohtu. Seega annab vÀÀrtus 2 parema jĂ”udluse kui vaikimisi 0. Siiski, usaldusvÀÀrsust saab parandada, vĂ€ltides lubatust kĂ”rgemal pĂ”hineva mĂ€lu ĂŒlekoormamist. See vĂ€listab riski, et protsess tapetakse OOM killer'i poolt.

Ilma vahetusruumita sĂŒsteemides vĂ”ib tekkida probleem, kui vm.overcommit_memory on 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 — see on protsent mĂ€lu, mis on tĂ€idetud â€žĂŒlalolevate” lehtedega, mis tuleb kirjutada kettale. Kettale kirjutamine toimub taustal. Selle parameetri vÀÀrtus on vahemikus 0 kuni 100; siiski vĂ”ib vÀÀrtus alla 5 olla ebaefektiivne ja mĂ”ned tuumad ei pruugi seda toetada. Enamikes Linuxi sĂŒsteemides on vaikimisi vÀÀrtus 10. Saate kirjutamisintensiivsete toimingute jaoks töövĂ”imet suurendada madalama suhtarvuga, mis tĂ€hendab, et Linux kirjutab â€žĂŒlalolevad” lehed taustal.

Peate seadistama vÀÀrtuse vm.dirty_background_bytes vastavalt teie ketta kiirus.

Neil kahel parameetril pole „hĂ€id” vÀÀrtusi, kuna mĂ”lemad sĂ”ltuvad riistvarast. Kuid vm.dirty_background_ratio seadistamine vÀÀrtusele 5 ja vm.dirty_background_bytes seadistamine 25% ketta kiirusest tĂ”stab jĂ”udlust enamikes juhtudel ~ 25%.

vm.dirty_ratio / dirty_bytes

See on sama, mis vm.dirty_background_ratio / dirty_background_bytes, vĂ€lja arvatud see, et kirjutamine toimub aktiivses sessioonis, blokeerides rakendust. SeetĂ”ttu peab vm.dirty_ratio olema suurem kui vm.dirty_background_ratio. See tagab, et taustprotsessid kĂ€ivitatakse varem, et vĂ€ltida rakenduse maksimaalselt vĂ”imalikku blokeerimist. Saate reguleerida nende kahe suhte erinevust vastavalt kettasisendite ĂŒlesande koormusele.

KokkuvÔte

Saate seadistada muid parameetreid jĂ”udluse suurendamiseks, kuid parandused on minimaalset laadi ja reaalset kasu pole. Peame meeles pidama, et mitte kĂ”ik parameetrid ei kehti kĂ”ikidele rakendustele. MĂ”ned rakendused toimivad paremini, kui seadistame teatud parameetrite, ja mĂ”ned mitte. Peate leidma Ă”ige tasakaalu nende parameetrite seadete vahel oodatava koormuse ja rakendustĂŒĂŒbi jaoks, samuti tuleb seadistamisel arvestada operatsioonisĂŒsteemi kĂ€itumisega. SĂŒdamiku parameetrite seadistamine pole nii lihtne kui andmebaasi parameetrite seadmine: siin on keerulisem anda oma soovitusi.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster