Linux kodola parametru iestatīšana PostgreSQL optimizēšanai

Linux kodola parametru iestatīšana PostgreSQL optimizēšanai Optimizētā PostgreSQL veiktspēja ir atkarīga no pareizi noteiktiem operētājsistēmas parametriem. Slikti konfigurēti OS kodola parametri var samazināt datu bāzes servera veiktspēju. Tāpēc ir būtiski, lai šie parametri būtu pielāgoti datu bāzes serverim un tā slodzei. Šajā ierakstā mēs apspriedīsim dažus svarīgus Linux kodola parametrus, kas var ietekmēt datu bāzes servera veiktspēju, un to iestatīšanas veidus.

SHMMAX / SHMALL

SHMMAX ir kodola parametrs, kas tiek izmantots, lai noteiktu maksimālo vienas segmenta koplietošanas atmiņas (shared memory) izmēru, ko var piešķirt Linux process. Līdz versijai 9.2 PostgreSQL izmantoja System V (SysV), kurai nepieciešama SHMMAX iestatīšana. Pēc 9.2 PostgreSQL pārgāja uz POSIX koplietošanas atmiņu. Tātad tagad nepieciešams mazāk System V koplietošanas atmiņas baitiem.

Līdz versijai 9.3 SHMMAX bija vissvarīgākais kodola parametrs. SHMMAX vērtība tiek noteikta baitos.

Līdzīgi, SHMALL ir vēl viens kodola parametrs, kas tiek izmantots, lai noteiktu
kopējo lapu apjomu koplietošanas atmiņā (shared memory). Lai apskatītu pašreizējās SHMMAX, SHMALL vai SHMMIN vērtības, izmantojiet komandu ipcs.

SHM* detaļas — Linux

$ ipcs -lm

------ Koplietošanas Atmiņas Ierobežojumi --------
maksimālais segmentu skaits = 4096
maksimālais segmenta lielums (kbytes) = 1073741824
maksimālā kopējā koplietošanas atmiņa (kbytes) = 17179869184
minimālais segmenta lielums (baitos) = 1

SHM* detaļas — MacOS X

$ ipcs -M
IPC statuss no 2018. gada 16. augusta 22:20:35 PKT
shminfo:
	shmmax: 16777216	(maksimālais koplietošanas atmiņas segmenta lielums)
	shmmin:       1	(minimālais koplietošanas atmiņas segmenta lielums)
	shmmni:      32	(maksimālais koplietošanas atmiņas identifikatoru skaits)
	shmseg:       8	(maksimālais koplietošanas atmiņas segmentu skaits uz procesu)
	shmall:    1024	(maksimālais koplietošanas atmiņas apjoms lapās)

PostgreSQL izmanto System V IPC lai piešķirtu koplietošanas atmiņu. Šis parametrs ir viens no vissvarīgākajiem kodola parametriem. Katru reizi, kad saņemat sekojošās kļūdas ziņas, tas nozīmē, ka jums ir vecāka PostgreSQL versija un ļoti zema SHMMAX vērtība. Tiek sagaidīts, ka lietotāji pielāgos un palielinās vērtību saskaņā ar koplietošanas atmiņu, ko viņi plāno izmantot.

Iespējamās nepareizas konfigurācijas kļūdas

Ja SHMMAX ir nepareizi iestatīts, jūs varat saņemt kļūdu, mēģinot inicializēt PostgreSQL klasteri, izmantojot komandu initdb.

initdb neveiksme
DETAĻAS: Neizdevās izsaukt sistēmas funkciju shmget(key=1, size=2072576, 03600).

PADOMS: Šī kļūda parasti nozīmē, ka PostgreSQL pieprasījums pēc koplietojamās atmiņas segmenta pārsniedza jūsu kodola SHMMAX parametrus. 
Jūs varat samazināt pieprasījuma izmēru vai pārlabot kodolu ar lielāku SHMMAX. Lai samazinātu pieprasījuma izmēru (patlaban 2072576 baitus),
samaziniet PostgreSQL koplietojamās atmiņas patēriņu, iespējams, samazinot shared_buffers vai max_connections.

Ja pieprasījuma izmērs jau ir neliels, iespējams, ka tas ir mazāks par jūsu kodola SHMMIN parametru,
tādā gadījumā jāpalielina pieprasījuma izmērs vai jāveic SHMMIN konfigurācijas izmaiņas.

PostgreSQL dokumentācija satur vairāk informācijas par koplietojamās atmiņas konfigurāciju. bērnu process iznāca ar iznākuma kodu 1.

Līdzīgi, jūs varat saņemt kļūdu, palaižot PostgreSQL serveri, izmantojot komandu pg_ctl.

pg_ctl neveiksme
DZIĻAS: Neizdevās sistēmas izsaukums shmget(key=5432001, size=14385152, 03600).

PADOMS: Šī kļūda parasti nozīmē, ka PostgreSQL pieprasījums pēc koplietojamās atmiņas segmenta pārsniedza jūsu kodola SHMMAX parametrus.

Jūs varat samazināt pieprasījuma izmēru vai pārkonfigurēt kodolu ar lielāku SHMMAX.; Lai samazinātu pieprasījuma izmēru (pašlaik 14385152 baiti), samaziniet PostgreSQL koplietošanas atmiņas patēriņu, iespējams, samazinot shared_buffers vai max_connections.

Ja pieprasījuma izmērs jau ir neliels, iespējams, ka tas ir mazāks par jūsu kodola SHMMIN parametru,
tādā gadījumā jāpalielina pieprasījuma izmērs vai jāveic SHMMIN konfigurācijas izmaiņas.

PostgreSQL dokumentācijā ir vairāk informācijas par koplietošanas atmiņas konfigurāciju.

Izpratne atšķirības definīcijās

SHMMAX/SHMALL parametru definīcija Linux un MacOS X nedaudz atšķiras:

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

Komanda sysctl var tikt izmantots, lai pagaidu mainītu vērtību. Lai iestatītu pastāvīgas vērtības, pievienojiet ierakstu /etc/sysctl.conf. Sīkāka informācija sniegta zemāk.

Kern parametru maiņa 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

Kern parametru maiņa 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

Neaizmirstiet: lai izdarītu izmaiņas pastāvīgas, pievienojiet šīs vērtības failā /etc/sysctl.conf

Lielas lapas (Huge Pages)

Linux pēc noklusējuma izmanto 4 kB atmiņas lapas, kamēr BSD — Super Pages, bet Windows — Large Pages. Lapa ir daļa no RAM, ko piešķir procesam. Procesam var būt vairākas lapas atkarībā no atmiņas prasībām. Jo vairāk atmiņas procesam nepieciešams, jo vairāk lapu tam tiks piešķirts. Operētājsistēma atbalsta lapu piešķiršanas tabulu procesiem. Jo mazāks lapas izmērs, jo lielāka tiks izmantota tabula, un ilgāk aizņems lapas meklēšana šajā lapu tabulā. Tādējādi lielas lapas ļauj izmantot lielu atmiņas apjomu ar samazinātiem izdevumiem; mazāk lapu skatījumu, mazāk lapu kļūdu, ātrākas lasīšanas/ierakstīšanas operācijas caur lieliem buferiem. Rezultātā — veiktspējas uzlabošana.

PostgreSQL atbalsta lielās lapas tikai Linux. Pēc noklusējuma Linux izmanto 4 kB atmiņas lapas, tādēļ gadījumos, kad ir pārāk daudz atmiņas operāciju, ir nepieciešams iestatīt lielāka izmēra lapas. Lielu lapu izmantošanai, kuru izmērs ir 2 MB un līdz 1 GB, novērojama veiktspējas pieaugums. Lielās lapas izmēru var iestatīt palaidē. Jūs varat viegli pārbaudīt lielo lapu parametrus un to izmantošanu savā Linux datorā, izmantojot komandu cat /proc/meminfo | grep -i huge.

Informācijas iegūšana par lielajām lapām (tikai Linux)

Piezīme: Tas attiecas tikai uz Linux, citām operētājsistēmām šī operācija tiek ignorēta$ 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

Šajā piemērā, lai gan lielās lapas izmērs ir iestatīts uz 2048 (2 MB), kopējais lielo lapu skaits ir 0. Tas nozīmē, ka lielās lapas ir izslēgtas.

Lielas lapas skaita noteikšanas skripts

Šis vienkāršais skripts atgriež nepieciešamo lielo lapu skaitu. Palaidiet skriptu savā Linux serverī, kamēr darbojas PostgreSQL. Pārliecinieties, ka videi $PGDATA ir piešķirta PostgreSQL datu katalogs.

Lielo lapu skaita iegūšana

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

Skripta izvade izskatās šādi:

Skripta izvade

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

Ieteicamā lielo lapu vērtība ir 88, tāpēc jums jāsalīdzina 88.

Lielo lapu iestatīšana

sysctl -w vm.nr_hugepages=88

Pārbaudiet lielās lapas tagad, jūs redzēsiet, ka lielās lapas netiek izmantotas (HugePages_Free = HugePages_Total).

Vēlreiz informācija par lielajām lapām (tikai 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

Tagad iestatiet huge_pages parametru «on» $PGDATA/postgresql.conf un restartējiet serveri.

Un vēlreiz informācija par lielajām lapām (tikai 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

Tagad jūs varat redzēt, ka ļoti maz lielo lapu tiek izmantots. Tagad pamēģināsim pievienot dažus datus datu bāzei.

Dažas datu bāzes operācijas, lai pārstrādātu lielās lapas

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

Vai apskatīsim, vai mēs tagad izmantojam vairāk lielo lapu nekā iepriekš.

Vēlreiz informācija par lielajām lapām (tikai 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

Tagad jūs varat redzēt, ka lielākā daļa lielo lapu tiek izmantota.

Piezīme: šeit izmantotā HugePages aptuvenā vērtība ir ļoti zema, kas nav normāla vērtība ražošanas vidē. Lūdzu, novērtējiet nepieciešamo lapu skaitu jūsu sistēmai un attiecīgi iestatiet to, ņemot vērā slodzi un resursus.

vm.swappiness

vm.swappiness — tas ir vēl viens kodola parametrs, kas var ietekmēt datu bāzes veiktspēju. Šis parametrs tiek izmantots, lai kontrolētu apmaiņas uzvedību (swappiness) (lappušu apmaiņas procesus Linux). Vērtība svārstās no 0 līdz 100. Tā nosaka, cik daudz atmiņas tiks izsvītrota vai iekļauta. Nulle nozīmē apmaiņas atslēgšanu, bet 100 nozīmē agresīvu apmaiņu.

Jūs varat panākt labu veiktspēju, iestatot zemākas vērtības.

Iestatot 0 vērtību jaunākajos kodolos, OOM Killer (atmiņas tīrīšanas process Linux) var iznīcināt procesu. Tādējādi droši varat iestatīt vērtību 1, ja vēlaties minimizēt apmaiņu. Noklusējuma vērtība Linux ir 60. Augstāka vērtība liek MMU (apziņas kontroles bloks) izmantot vairāk apmaiņas vietas nekā RAM, savukārt zemāka vērtība saglabā vairāk datu/koda atmiņā.

Zemāka vērtība ir laba likme, lai uzlabotu veiktspēju PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Lietojumprogrammas saņem atmiņu un atbrīvo to, kad tā vairs nav nepieciešama. Bet dažos gadījumos lietojumprogramma saņem pārāk daudz atmiņas un neatbrīvo to. Tas var izraisīt OOM killer. Šeit ir iespējamās parametrā vērtības vm.overcommit_memory ar aprakstu katrai:

  1. Heuristiskais overcommit (noklusējuma); kodola balstīta heuristika
  2. Atļaut overcommit jebkurā gadījumā
  3. Nepārslogojiet, nepārsniedziet overcommit koeficientu.

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

vm.overcommit_ratio — procentuālais daudzums operatīvās atmiņas, kas pieejama pārmērīgai iekraušanai. 50% vērtība sistēmā ar 2 GB RAM var piešķirt līdz 3 GB RAM.

Vērtība 2 vm.overcommit_memory nodrošina labāku veiktspēju PostgreSQL. Šī vērtība maksimizē operatīvās atmiņas izmantošanu servera procesā, nepalielinot risku, ka process tiks nogalināts ar OOM killer. Lietojumprogramma varēs restartēties, bet tikai pārsniegšanas robežās, kas samazina risku, ka OOM killer nogalinās procesu. Tādējādi vērtība 2 sniedz labāku veiktspēju nekā noklusējuma vērtība 0. Tomēr uzticamību var uzlabot, nepieļaujot, ka atmiņa pārsniedz pieļaujamo diapazonu. Tas izslēdz risku, ka process tiks nogalināts ar OOM killer.

Sistēmās bez apmaiņas var rasties problēmas ar vm.overcommit_memory, kas ir vienāds ar 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 — tas ir atmiņas procents, ko aizņem netīri lapas, kuras ir jāieraksta diskā. Ieraksts diskā notiek fona režīmā. Šī parametra vērtība svārstās no 0 līdz 100; tomēr vērtība zem 5 var būt neefektīva, un daži kodoli to neatbalsta. 10 ir noklusējuma vērtība lielākajā daļā Linux sistēmu. Jūs varat uzlabot veiktspēju rakstīšanas operācijās ar zemāku koeficientu, kas nozīmēs, ka Linux fona režīmā ierakstīs netīras lapas.

Jums jākonfigurē vērtība vm.dirty_background_bytes atkarībā no jūsu diska ātruma.

Šiem diviem parametriem nav „labu” vērtību, jo abi ir atkarīgi no aparatūras. Tomēr iestādot vm.dirty_background_ratio uz vērtību 5 un vm.dirty_background_bytes uz 25% no diska ātruma, veiktspēju var palielināt līdz ~ 25% lielākajā daļā gadījumu.

vm.dirty_ratio / dirty_bytes

Tas ir tas pats, kas vm.dirty_background_ratio / dirty_background_bytes, izņemot to, ka ieraksts notiek darba sesijā, bloķējot lietojumprogrammu. Tāpēc vm.dirty_ratio jābūt augstākam nekā vm.dirty_background_ratio. Tas nodrošina, ka fona procesi tiek aktivizēti agrāk, lai novērstu maksimālo iespējamo lietojumprogrammas bloķēšanu. Jūs varat pielāgot atšķirību starp šiem diviem ratios atkarībā no diska I/O slodzes.

Rezultāts

Jūs varat pielāgot citus parametrus, lai uzlabotu veiktspēju, bet uzlabojumi būs minimāli un ieguvumi īpaši neiegūsiet. Mums jāpatur prātā, ka ne visi parametri attiecas uz visiem lietojumprogrammu veidiem. Dažas lietojumprogrammas darbojas labāk, kad mēs konfigurējam noteiktus parametrus, bet dažas - nē. Jums jāatrod pareizais līdzsvars starp šo parametru konfigurācijām atbilstoši gaidāmajai slodzei un lietojumprogrammas veidam, kā arī jāpatur prātā OS uzvedība, konfigurējot. Kodola parametru pielāgošana nav tik vienkārša kā datu bāzes parametru pielāgošana: šeit ir grūtāk sniegt savus ieteikumus.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster