„Linux“ branduolio parinkčių konfigūravimas, norint optimizuoti „PostgreSQL“.

„Linux“ branduolio parinkčių konfigūravimas, norint optimizuoti „PostgreSQL“. Optimalus PostgreSQL našumas priklauso nuo teisingai apibrėžtų operacinės sistemos parametrų. Prastai sukonfigūruoti OS branduolio nustatymai gali lemti prastą duomenų bazės serverio veikimą. Todėl būtina, kad šie parametrai būtų sukonfigūruoti pagal duomenų bazės serverį ir jo darbo krūvį. Šiame įraše aptarsime kai kuriuos svarbius „Linux“ branduolio parametrus, kurie gali turėti įtakos duomenų bazės serverio veikimui, ir kaip juos sukonfigūruoti.

SHMMAX / SHMALL

SHMMAX yra branduolio parametras, naudojamas nustatyti didžiausią vieno bendros atminties segmento dydį, kurį gali skirti Linux procesas. Prieš 9.2 versiją PostgreSQL naudojo System V (SysV), kuriai reikalingas SHMMAX nustatymas. Po 9.2 „PostgreSQL“ perėjo į POSIX bendrinamą atmintį. Taigi dabar reikia mažiau System V bendros atminties baitų.

Prieš 9.3 versiją SHMMAX buvo svarbiausias branduolio parametras. SHMMAX reikšmė nurodoma baitais.

Panašiai SHMALL yra dar vienas branduolio parametras, naudojamas nustatyti
visos sistemos bendros atminties puslapių apimtis. Norėdami peržiūrėti dabartines SHMMAX, SHMALL arba SHMMIN reikšmes, naudokite komandą ipcs.

SHM* Informacija – 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* Išsami informacija – 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)

Naudoja PostgreSQL V sistemos IPC paskirstyti bendrą atmintį. Šis parametras yra vienas iš svarbiausių branduolio parametrų. Kai gaunate šiuos klaidos pranešimus, tai reiškia, kad turite senesnę PostgreSQL versiją ir jūsų SHMMAX reikšmė yra labai maža. Tikimasi, kad vartotojai pakoreguos ir padidins vertę pagal bendrinamą atmintį, kurią jie ketina naudoti.

Galimos netinkamos konfigūracijos klaidos

Jei SHMMAX netinkamai sukonfigūruotas, galite gauti klaidos pranešimą bandydami inicijuoti PostgreSQL klasterį naudodami komandą initdb.

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

Taip pat galite gauti klaidą paleidę PostgreSQL serverį naudodami komandą pg_ctl.

pg_ctl Nesėkmė
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.

Suprasti apibrėžimų skirtumus

„Linux“ ir „MacOS X“ SHMMAX / SHMALL parametrų apibrėžimas šiek tiek skiriasi:

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

Komanda sysctl gali būti naudojamas laikinai pakeisti vertę. Norėdami nustatyti pastovias reikšmes, pridėkite įrašą prie /etc/sysctl.conf. Išsami informacija pateikta žemiau.

Branduolio nustatymų keitimas „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

Branduolio parametrų keitimas sistemoje „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

Nepamiršk: Jei norite, kad pakeitimai būtų nuolatiniai, pridėkite šias reikšmes į /etc/sysctl.conf

Milžiniški puslapiai

Linux pagal numatytuosius nustatymus naudoja 4 KB atminties puslapius, BSD – XNUMX KB atminties puslapius. Super puslapiai, o sistemoje „Windows“ – Dideli puslapiai. Puslapis yra RAM dalis, skirta procesui. Procesas gali turėti kelis puslapius, atsižvelgiant į atminties reikalavimus. Kuo daugiau atminties reikalauja procesui, tuo daugiau puslapių jam skiriama. OS palaiko puslapių paskirstymo lentelę procesams. Kuo mažesnis puslapio dydis, tuo didesnė lentelė, tuo ilgiau užtrunka rasti puslapį toje puslapio lentelėje. Todėl dideli puslapiai leidžia naudoti didelius atminties kiekius su mažesnėmis sąnaudomis; mažiau puslapių peržiūrų, mažiau puslapių klaidų, greitesnės skaitymo / rašymo operacijos naudojant didesnius buferius. Rezultatas – geresnis našumas.

„PostgreSQL“ palaiko tik didelius puslapius „Linux“. Pagal numatytuosius nustatymus Linux naudoja 4 KB atminties puslapius, todėl tais atvejais, kai atminties operacijų yra per daug, būtina nustatyti didesnius puslapius. Našumo padidėjimas pastebimas naudojant didelius 2 MB ir iki 1 GB puslapius. Didelis puslapio dydis gali būti nustatytas įkrovos metu. Naudodami komandą galite lengvai patikrinti didelius puslapio parametrus ir jų naudojimą „Linux“ įrenginyje cat /proc/meminfo | grep -i didžiulis.

Informacijos apie didelius puslapius gavimas (tik 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

Šiame pavyzdyje, nors didelis puslapio dydis nustatytas į 2048 (2 MB), bendras didelių puslapių skaičius nustatytas į 0. Tai reiškia, kad dideli puslapiai yra išjungti.

Scenarijus, skirtas didelių puslapių skaičiui nustatyti

Šis paprastas scenarijus grąžina reikiamą didelių puslapių skaičių. Vykdykite scenarijų savo Linux serveryje, kol veikia PostgreSQL. Įsitikinkite, kad aplinkos kintamasis $PGDATA Nurodytas PostgreSQL duomenų katalogas.

Reikiamo didelių puslapių skaičiaus gavimas

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

Scenarijaus išvestis atrodo taip:

Scenarijaus išvestis

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

Rekomenduojama didelių puslapių vertė yra 88, todėl turėtumėte nustatyti 88.

Didelių puslapių diegimas

sysctl -w vm.nr_hugepages=88

Dabar patikrinkite didelius puslapius, pamatysite, kad dideli puslapiai nenaudojami (HugePages_Free = HugePages_Total).

Dideli puslapiai peržiūrėti dar kartą (tik „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

Dabar $PGDATA/postgresql.conf parametrą huge_pages nustatykite į "on" ir paleiskite serverį iš naujo.

Dar kartą informacija apie didelius puslapius (tik 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

Dabar matote, kad naudojama labai mažai didelių puslapių. Dabar pabandykime į duomenų bazę įtraukti kai kuriuos duomenis.

Kai kurios duomenų bazės operacijos dideliems puslapiams perdirbti

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

Pažiūrėkime, ar dabar naudojame daugiau didelių puslapių nei anksčiau.

Daugiau informacijos dideliuose puslapiuose (tik 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

Dabar matote, kad naudojama dauguma didelių puslapių.

Pastaba: čia naudojama apskaičiuota „HugePages“ vertė yra labai maža, o tai nėra įprasta įrenginio, kuriame veikia produkto aplinka, vertė. Apskaičiuokite reikiamą sistemos puslapių skaičių ir atitinkamai nustatykite juos pagal apkrovą ir išteklius.

vm.sukeitimas

vm.sukeitimas yra dar vienas branduolio parametras, galintis turėti įtakos duomenų bazės veikimui. Ši parinktis naudojama keitimo (puslapių keitimo į atmintį ir iš jos) valdymui Linux sistemoje. Reikšmė svyruoja nuo 0 iki 100. Ji nustato, kiek atminties bus puslapiuose arba puslapiuose. Nulis reiškia, kad nėra mainų, o 100 reiškia agresyvius mainus.

Gerą našumą galite pasiekti nustatę mažesnes vertes.

Nustačius 0 naujesniuose branduoliuose, OOM Killer (Linux atminties valymo procesas) gali sustabdyti procesą. Taigi saugu nustatyti jį į 1, jei norite sumažinti keitimąsi. Numatytoji reikšmė sistemoje „Linux“ yra 60. Dėl didesnės vertės MMU (atminties valdymo blokas) sunaudoja daugiau apsikeitimo vietos nei RAM, o mažesnė vertė atmintyje išlaiko daugiau duomenų / kodo.

Mažesnė vertė yra geras pasirinkimas norint pagerinti PostgreSQL našumą.

vm.overcommit_memory / vm.overcommit_ratio

Programos įgyja atmintį ir išleidžia ją, kai jos nebereikia. Tačiau kai kuriais atvejais programa gauna per daug atminties ir jos neatleidžia. Tai gali sukelti OOM žudiką. Čia pateikiamos galimos parametrų reikšmės vm.overcommit_memory su kiekvieno aprašymu:

  1. Euristinis įsipareigojimas (numatytasis); branduolio euristika
  2. Vis tiek leiskite per daug įsipareigoti
  3. Nepersistenkite, neviršykite įsipareigojimų santykio.

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

vm.overcommit_ratio - procentinė RAM dalis, skirta perkrovai. 50% vertė sistemoje su 2 GB RAM gali skirti iki 3 GB RAM.

2 vm.overcommit_memory reikšmė užtikrina geresnį PostgreSQL našumą. Ši vertė maksimaliai padidina serverio proceso RAM naudojimą be jokios didelės rizikos, kad bus nužudytas OOM žudiko procesas. Programą bus galima įkelti iš naujo, tačiau tik perviršio ribose, o tai sumažina riziką, kad OOM žudikas nužudys procesą. Todėl 2 reikšmė suteikia geresnį našumą nei numatytoji reikšmė 0. Tačiau patikimumą galima pagerinti užtikrinant, kad nebūtų perkrauta už diapazono ribų esanti atmintis. Tai pašalina riziką, kad procesą nužudys OOM žudikas.

Sistemose be apsikeitimo gali kilti problema, susijusi su vm.overcommit_memory lygiu 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 yra atminties, užpildytos nešvariais puslapiais, kuriuos reikia įrašyti į diską, procentas. Nuleidimas į diską vyksta fone. Šio parametro reikšmė svyruoja nuo 0 iki 100; tačiau mažesnė nei 5 reikšmė gali būti neveiksminga ir kai kurie branduoliai jos nepalaiko. 10 yra numatytasis daugelyje Linux sistemų. Galite pagerinti intensyvaus rašymo operacijų našumą mažesniu veiksniu, o tai reikš, kad „Linux“ išplaus nešvarius puslapius fone.

Turite nustatyti vertę vm.dirty_background_bytes priklausomai nuo jūsų važiavimo greičio.

Šiems dviem parametrams nėra „gerų“ verčių, nes abu priklauso nuo aparatinės įrangos. Tačiau nustačius vm.dirty_background_ratio į 5 ir vm.dirty_background_bytes iki 25% disko greičio, daugeliu atvejų našumas pagerinamas iki ~25%.

vm.dirty_ratio/dirty_bytes

Tai tas pats kaip vm.dirty_background_ratio/dirty_background_bytes, išskyrus tai, kad nustatymas iš naujo atliekamas darbuotojo seanso metu, blokuojant programą. Todėl vm.dirty_ratio turėtų būti didesnis nei vm.dirty_background_ratio. Taip užtikrinama, kad foniniai procesai prasidėtų anksčiau, kad programa būtų kiek įmanoma neužblokuota. Galite reguliuoti skirtumą tarp šių dviejų santykių, priklausomai nuo disko I/O apkrovos.

Visas

Galite koreguoti kitus nustatymus, kad pagerintumėte našumą, tačiau patobulinimai bus minimalūs ir nematysite didelės naudos. Turime atsiminti, kad ne visos parinktys taikomos visų tipų programoms. Kai kurios programos veikia geriau, kai pakoreguojame kai kuriuos nustatymus, o kai kurios – ne. Turite rasti tinkamą pusiausvyrą tarp šių nustatymų konfigūravimo pagal numatomą darbo krūvį ir programos tipą, taip pat derindami turite atsižvelgti į OS elgseną. Branduolio parametrų konfigūravimas nėra taip paprastas, kaip duomenų bazės parametrų konfigūravimas; sudėtingiau pateikti rekomendacijas.

Šaltinis: www.habr.com

Добавить комментарий