Linuxi kerneli valikute häälestamine PostgreSQL-i optimeerimiseks

Linuxi kerneli valikute häälestamine PostgreSQL-i optimeerimiseks Optimaalne PostgreSQL-i jõudlus sõltub õigesti määratletud operatsioonisüsteemi parameetritest. Halvasti konfigureeritud OS-i kerneli sätted võivad põhjustada andmebaasiserveri halva jõudluse. Seetõttu on hädavajalik, et need sätted oleksid konfigureeritud vastavalt andmebaasiserverile ja selle töökoormusele. Selles postituses käsitleme mõningaid olulisi Linuxi kerneli parameetreid, mis võivad mõjutada andmebaasiserveri jõudlust ja kuidas neid konfigureerida.

SHMMAX / SHMALL

SHMMAX on tuuma parameeter, mida kasutatakse ühe jagatud mälusegmendi maksimaalse suuruse määramiseks, mida Linuxi protsess saab eraldada. Enne versiooni 9.2 kasutas PostgreSQL System V-d (SysV), mis nõuab SHMMAX-i seadistust. Pärast versiooni 9.2 lülitus PostgreSQL POSIX-i ühismälule. Seega on nüüd vaja vähem baite System V ühismälu.

Enne versiooni 9.3 oli SHMMAX kõige olulisem kerneli parameeter. SHMMAX väärtus määratakse baitides.

Samamoodi SHMALL on teine ​​määramiseks kasutatav kerneli parameeter
süsteemiülene ühismälu lehtede maht. Praeguste SHMMAX-, SHMALL- või SHMMIN-väärtuste vaatamiseks kasutage käsku ipcs.

SHM* üksikasjad – 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* üksikasjad – 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 kasutab Süsteemi V IPC ühismälu eraldamiseks. See parameeter on üks olulisemaid kerneli parameetreid. Kui teile kuvatakse järgmised veateated, tähendab see, et teil on PostgreSQL-i vanem versioon ja teie SHMMAX väärtus on väga madal. Eeldatakse, et kasutajad kohandavad ja suurendavad väärtust vastavalt ühismälule, mida nad kavatsevad kasutada.

Võimalikud valesti seadistamise vead

Kui SHMMAX pole õigesti konfigureeritud, võite saada tõrketeate, kui proovite käsku kasutades PostgreSQL-klastri initsialiseerida initdb.

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

Samuti võite käsuga PostgreSQL-serveri käivitamisel kuvada veateate pg_ctl.

pg_ctl Ebaõnnestumine
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.

Definitsioonide erinevuste mõistmine

SHMMAX/SHMALLi parameetrite määratlemine on Linuxis ja MacOS X-is pisut erinev:

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

Meeskond sysctl saab kasutada väärtuse ajutiseks muutmiseks. Konstantsete väärtuste määramiseks lisage kirje /etc/sysctl.conf. Üksikasjad on allpool.

Kerneli sätete 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

Kerneli 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

Ära unusta: muudatuste püsivaks muutmiseks lisage need väärtused faili /etc/sysctl.conf

Suured lehed

Linux kasutab vaikimisi 4 KB mälulehti, BSD kasutab XNUMX KB mälulehti. Super leheküljedja Windowsis - Suured lehed. Leht on protsessile eraldatud RAM-i osa. Sõltuvalt mälunõuetest võib protsessil olla mitu lehekülge. Mida rohkem mälu protsess nõuab, seda rohkem lehti sellele eraldatakse. OS haldab protsesside jaoks lehtede eraldamise tabelit. Mida väiksem on lehe suurus, seda suurem on tabel, seda kauem kulub lehe leidmiseks sellest lehetabelist. Suured leheküljed võimaldavad seetõttu kasutada suurel hulgal mälu väiksema üldkuluga; vähem lehevaatamisi, vähem lehevigu, kiiremad lugemis-/kirjutustoimingud suuremate puhvrite kaudu. Tulemuseks on parem jõudlus.

PostgreSQL toetab Linuxis ainult suuri lehti. Vaikimisi kasutab Linux 4 KB mälulehti, seega juhtudel, kui mäluoperatsioone on liiga palju, on vaja seadistada suuremad leheküljed. Jõudluse suurenemist täheldatakse suurte 2 MB ja kuni 1 GB lehtede kasutamisel. Suure lehe suuruse saab seadistada alglaadimise ajal. Saate hõlpsasti kontrollida suuri lehe parameetreid ja nende kasutamist oma Linuxi masinas käsuga kass /proc/meminfo | grep -i tohutu.

Teabe hankimine suurte lehtede kohta (ainult 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

Kuigi selles näites on suure lehe suuruseks seatud 2048 (2 MB), on suurte lehtede koguarvuks seatud 0. See tähendab, et suured leheküljed on keelatud.

Skript suurte lehtede arvu määramiseks

See lihtne skript tagastab vajaliku arvu suuri lehti. Käivitage skript oma Linuxi serveris, kui PostgreSQL töötab. Veenduge, et keskkonnamuutuja puhul $PGDATA PostgreSQL-i andmekataloog on määratud.

Vajalike suurte lehtede arvu hankimine

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

Skripti väljund

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

Suurte lehtede soovitatav väärtus on 88, seega peaksite määrama selle väärtuseks 88.

Suurte lehtede paigaldamine

sysctl -w vm.nr_hugepages=88

Kontrollige kohe suuri lehti, näete, et suuri lehti ei kasutata (HugePages_Free = HugePages_Total).

Suured lehed uuesti läbi vaadatud (ainult 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

Nüüd määrake failis $PGDATA/postgresql.conf parameeter huge_pages olekusse "on" ja taaskäivitage server.

Taaskord teave suurte lehtede kohta (ainult 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üüd näete, et suuri lehti kasutatakse väga vähe. Proovime nüüd andmebaasi lisada mõned andmed.

Mõned andmebaasitoimingud suurte lehtede taaskasutamiseks

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

Vaatame, kas kasutame praegu varasemast rohkem suuri lehti.

Lisateave suurte lehtede kohta (ainult 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üüd näete, et enamik suuri lehti on kasutusel.

Märkus. Siin kasutatud HugePagesi hinnanguline väärtus on väga madal, mis ei ole tootekeskkonda käitava masina puhul tavaline väärtus. Hinnake oma süsteemi jaoks vajalikku lehtede arvu ja määrake need vastavalt koormusele ja ressurssidele.

vm.vahetus

vm.vahetus on teine ​​kerneli parameeter, mis võib mõjutada andmebaasi jõudlust. Seda suvandit kasutatakse Linuxis vahetamise (mällu sisse ja välja vahetamise) käitumise juhtimiseks. Väärtus on vahemikus 0 kuni 100. See määrab, kui palju mälu lehitsetakse või välja lapitakse. Null tähendab vahetuse puudumist ja 100 agressiivset vahetust.

Väiksemate väärtuste seadmisega saate saavutada hea jõudluse.

Uuemate tuumade puhul väärtuseks 0 seadmine võib põhjustada OOM Killeri (Linuxi mälupuhastusprotsess) protsessi peatamise. Seega on turvaline seada see väärtusele 1, kui soovite vahetamist minimeerida. Linuxi vaikeväärtus on 60. Kõrgema väärtuse tõttu kasutab MMU (mäluhaldusüksus) rohkem vahetusruumi kui RAM, samas kui madalam väärtus hoiab mälus rohkem andmeid/koodi.

Madalam väärtus on hea panus PostgreSQL-i jõudluse parandamiseks.

vm.overcommit_memory / vm.overcommit_ratio

Rakendused omandavad mälu ja vabastavad selle, kui seda enam ei vajata. Kuid mõnel juhul saab rakendus liiga palju mälu ega vabasta seda. See võib põhjustada OOM-i tapja. Siin on parameetrite võimalikud väärtused vm.overcommit_memory koos kirjeldusega igaühe kohta:

  1. Heuristiline ülekohustus (vaikimisi); tuumapõhine heuristiline
  2. Luba ülekohustust ikkagi
  3. Ära pinguta üle, ära ületa ülekohustuste suhet.

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

vm.overcommit_ratio — ülekoormuse jaoks saadaoleva RAM-i protsent. Väärtus 50% 2 GB RAM-iga süsteemis võib eraldada kuni 3 GB muutmälu.

Vm.overcommit_memory väärtus 2 tagab PostgreSQL-i parema jõudluse. See väärtus maksimeerib serveriprotsessi RAM-i kasutust ilma märkimisväärse ohuta, et OOM-i tapmisprotsess teid tapab. Rakendust saab uuesti laadida, kuid ainult ületamise piires, mis vähendab ohtu, et OOM-i tapja protsessi tapab. Seetõttu annab väärtus 2 parema jõudluse kui vaikeväärtus 0. Usaldusväärsust saab aga parandada, tagades, et vahemikust välja jäävat mälu ei koormata üle. See välistab ohu, et protsessi tapab OOM-i tapja.

Ilma vahetamiseta süsteemides võib tekkida probleem vm.overcommit_memory väärtusega 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 on määrdunud lehtedega täidetud mälu protsent, mis tuleb kettale kirjutada. Kettale loputamine toimub taustal. Selle parameetri väärtus on vahemikus 0 kuni 100; aga väärtus alla 5 võib olla ebaefektiivne ja mõned tuumad seda ei toeta. 10 on enamiku Linuxi süsteemide vaikeseade. Kirjutamismahukate toimingute jõudlust saate parandada väiksema teguriga, mis tähendab, et Linux loputab taustal mustad lehed.

Peate määrama väärtuse vm.dirty_background_bytes sõltuvalt teie sõidu kiirusest.

Nende kahe parameetri jaoks pole "häid" väärtusi, kuna mõlemad on riistvarast sõltuvad. Kuid vm.dirty_background_ratio määramine väärtusele 5 ja vm.dirty_background_bytes 25%-le ketta kiirusest parandab enamikul juhtudel jõudlust ~25%-ni.

vm.dirty_ratio/dirty_bytes

See on sama mis vm.dirty_background_ratio/dirty_background_bytes, välja arvatud see, et lähtestamine toimub tööliseansil, mis blokeerib rakenduse. Seetõttu peaks vm.dirty_ratio olema suurem kui vm.dirty_background_ratio. See tagab, et taustaprotsessid käivituvad varem, et vältida rakenduse võimalikult palju blokeerimist. Nende kahe suhte erinevust saate reguleerida sõltuvalt ketta sisend-/väljundkoormusest.

Summaarne

Saate jõudluse parandamiseks kohandada muid sätteid, kuid täiustused on minimaalsed ja te ei näe erilist kasu. Peame meeles pidama, et mitte kõik valikud ei kehti igat tüüpi rakenduste puhul. Mõned rakendused töötavad paremini, kui me mõnda seadet kohandame, ja mõned mitte. Peate leidma õige tasakaalu nende sätete konfigureerimise vahel teie eeldatava töökoormuse ja rakenduse tüübi jaoks ning häälestamisel peate arvestama ka OS-i käitumisega. Kerneli parameetrite seadistamine ei ole nii lihtne kui andmebaasi parameetrite seadistamine; soovituste andmine on keerulisem.

Allikas: www.habr.com

Lisa kommentaar