Sintonizza l'opzioni di u kernel Linux per ottimisà PostgreSQL

Sintonizza l'opzioni di u kernel Linux per ottimisà PostgreSQL U rendiment ottimale di PostgreSQL dipende da i paràmetri di u sistema operatore definiti currettamente. I paràmetri di u kernel OS mal cunfigurati ponu risultatu in un rendimentu di u servitore di basa di dati. Dunque, hè imperativu chì questi paràmetri sò cunfigurati secondu u servitore di basa di dati è a so carica di travagliu. In questu post, discuteremu alcuni parametri impurtanti di u kernel Linux chì ponu influenzà u rendiment di u servitore di basa di dati è cumu cunfigurà.

SHMMAX / SHMALL

SHMMAX hè un paràmetru di kernel utilizatu per determinà a dimensione massima di un unicu segmentu di memoria spartutu chì un prucessu Linux pò attribuisce. Prima di a versione 9.2, PostgreSQL hà utilizatu System V (SysV), chì richiede l'impostazione SHMMAX. Dopu à 9.2, PostgreSQL hà cambiatu à a memoria sparta POSIX. Allora avà menu byte di memoria sparta System V sò richiesti.

Prima di a versione 9.3, SHMMAX era u paràmetru di kernel più impurtante. U valore SHMMAX hè specificatu in bytes.

Similmente, SHMALL hè un altru paràmetru di kernel utilizatu per determinà
volume di u sistema di pagine di memoria spartuta. Per vede i valori attuali SHMMAX, SHMALL, o SHMMIN, utilizate u cumandimu ipcs.

Dettagli SHM* - 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

Dettagli SHM* - 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 usa Sistema V IPC per assignà a memoria spartuta. Stu paràmetru hè unu di i paràmetri di kernel più impurtanti. Ogni volta chì ricevi i seguenti missaghji di errore, significa chì avete una versione più vechja di PostgreSQL è u vostru valore SHMMAX hè assai bassu. L'utilizatori sò previsti per aghjustà è aumentà u valore secondu a memoria cumuna chì intendenu aduprà.

Possibile errore di cunfigurazione sbagliata

Se SHMMAX ùn hè micca cunfiguratu bè, pudete riceve un errore quandu pruvate d'inizializà un cluster PostgreSQL cù u cumandimu. initdb.

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

In listessu modu, pudete riceve un errore quandu inizià u servitore PostgreSQL cù u cumandimu pg_ctl.

pg_ctl Fiascu
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.

Capisce e differenze in e definizione

A definizione di i paràmetri SHMMAX / SHMALL hè un pocu sfarente in Linux è MacOS X:

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

squadra sysctl pò esse usatu per cambià temporaneamente u valore. Per stabilisce valori custanti, aghjunghje una voce à /etc/sysctl.conf. I dettagli sò quì sottu.

Cambia i paràmetri di u kernel in 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

Cambia i parametri di u kernel in 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

Ùn ti scurdà: Per fà cambiamenti permanenti, aghjunghje questi valori à /etc/sysctl.conf

Pagine enormi

Linux usa pagine di memoria di 4 KB per automaticamente, BSD usa pagine di memoria di XNUMX KB. Super Pagine, è in Windows - Grandi Pagine. Una pagina hè un pezzu di RAM attribuitu à un prucessu. Un prucessu pò avè parechje pagine sicondu i bisogni di memoria. A più memoria hè bisognu di un prucessu, più pagine hè attribuita. U SO mantene una tabella di allocazione di pagine per i prucessi. A più chjuca hè a dimensione di a pagina, u più grande u tavulu, u più longu hè necessariu per truvà una pagina in quella tabella di pagina. E pagine grande permettenu dunque grandi quantità di memoria per esse aduprate cù un overhead ridutta; menu viste di pagina, menu difetti di pagina, operazioni di lettura / scrittura più veloci nantu à buffer più grande. U risultatu hè un rendimentu migliuratu.

PostgreSQL supporta solu pagine grandi in Linux. Per automaticamente, Linux usa pagine di memoria di 4 KB, cusì in i casi induve ci sò troppu operazioni di memoria, hè necessariu di stabilisce pagine più grande. I guadagni di rendiment sò osservati quandu si usanu pagine grandi di 2 MB è finu à 1 GB. A grande dimensione di a pagina pò esse stabilita à u tempu di boot. Pudete cuntrollà facilmente i paràmetri di grande pagina è u so usu in a vostra macchina Linux cù u cumandamentu cat /proc/meminfo | grep -i enormu.

Ottene infurmazione nantu à e pagine grandi (solu 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

In questu esempiu, ancu s'ellu a dimensione di a pagina grande hè stabilita à 2048 (2 MB), u numeru tutale di pagine grande hè stabilitu à 0. Questu significa chì e pagine grande sò disattivate.

Scrittura per a determinazione di u numeru di grandi pagine

Stu script simplice torna u numeru necessariu di grandi pagine. Eseguite u script in u vostru servitore Linux mentre PostgreSQL hè in esecuzione. Assicuratevi chì per a variabile ambientale $PGDATA U cartulare di dati PostgreSQL hè specificatu.

Ottene u numeru di pagine grandi richieste

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

L'output di script hè cusì:

Pruduzzione di script

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

U valore cunsigliatu per e pagine grande hè 88, cusì duvete stabilisce à 88.

Installazione di e pagine grandi

sysctl -w vm.nr_hugepages=88

Verificate e pagine grande avà, vi vede chì e pagine grande ùn sò micca usate (HugePages_Free = HugePages_Total).

Grandi pagine rivisitate (solu 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

Avà stabilisce u paràmetru di huge_pages à "on" in $PGDATA/postgresql.conf è riavvia u servitore.

Una volta, infurmazione nantu à e pagine grandi (solu 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

Avà pudete vede chì assai pochi pagine grande sò aduprate. Andemu avà à pruvà à aghjunghje qualchi dati à a basa di dati.

Alcune operazioni di basa di dati per riciclà pagine grandi

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

Videmu s'ellu usemu più pagine grandi avà chè prima.

Più infurmazione nantu à e pagine grandi (solu 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

Avà pudete vede chì a maiò parte di e grandi pagine sò aduprate.

Nota: U valore stimatu per HugePages utilizatu quì hè assai bassu, chì ùn hè micca un valore normale per una macchina chì gestisce un ambiente di produttu. Per piacè stimate u numeru necessariu di pagine per u vostru sistema è stabilisceli in cunsequenza basatu nantu à a carica è e risorse.

vm.scambiu

vm.scambiu hè un altru paràmetru di u kernel chì pò influenzà u rendiment di a basa di dati. Questa opzione hè aduprata per cuntrullà u cumpurtamentu di swappiness (scambià pagine in e fora di memoria) in Linux. U valore varieghja da 0 à 100. Determina quantu memoria serà paginata o paginata. Zero significa micca scambiu è 100 significa scambiu aggressivu.

Pudete ottene un bonu rendimentu mettendu valori più bassi.

Stabilisce questu à 0 nantu à i kernels più recenti pò causà OOM Killer (processu di pulizia di memoria di Linux) per tumbà u prucessu. Allora hè sicuru di mette à 1 se vulete minimizzà u scambiu. U valore predeterminatu in Linux hè 60. Un valore più altu face chì a MMU (unità di gestione di memoria) aduprate più spaziu di swap chì RAM, mentre chì un valore più bassu mantene più dati / codice in memoria.

Un valore più bassu hè una bona scumessa per un rendimentu migliuratu in PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

L'applicazioni acquistanu memoria è liberanu quandu ùn hè più necessariu. Ma in certi casi, l'applicazione riceve troppu memoria è ùn libera micca. Questu pò causà un assassinu OOM. Eccu i valori pussibuli di i paràmetri vm.overcommit_memory cù una descrizzione per ognunu:

  1. Overcommit euristicu (predeterminatu); euristica basata nantu à u kernel
  2. Permettite l'overcommit in ogni modu
  3. Ùn esce micca, ùn trapassa u rapportu di overcommit.

Ссылка: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio - percentualità di RAM dispunibule per a sobrecarga. Un valore di 50% in un sistema cù 2 GB di RAM pò attribuisce finu à 3 GB di RAM.

Un valore di 2 per vm.overcommit_memory furnisce un rendimentu megliu per PostgreSQL. Stu valore maximizeghja l'usu di RAM di u prucessu di u servitore senza alcun risicu significativu di esse uccisu da u prucessu assassinu OOM. L'applicazione serà capace di ricaricà, ma solu in i limiti di overrun, chì riduce u risicu di un assassinu OOM chì uccide u prucessu. Per quessa, un valore di 2 dà un rendimentu megliu cà u valore predeterminatu di 0. In ogni casu, a fiducia pò esse migliurata assicurendu chì a memoria fora di gamma ùn hè micca sopracargata. Questu elimina u risicu di u prucessu di esse uccisu da un assassinu OOM.

In i sistemi senza scambià, un prublema cù vm.overcommit_memory uguale à 2 pò esse.

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 hè a percentuale di memoria piena di pagine brutte chì deve esse scritte à u discu. U flush à u discu si faci in fondo. U valore di stu paràmetru varieghja da 0 à 100; in ogni modu, un valore sottu à 5 pò esse inefficace è certi kernels ùn u supportanu micca. 10 hè u predefinitu in a maiò parte di i sistemi Linux. Pudete migliurà u rendiment per l'operazioni intensive di scrittura da un fattore più chjucu, chì significherà chì Linux sguasserà e pagine brutte in u sfondate.

Avete bisognu di stabilisce u valore vm.dirty_background_bytes secondu a vitezza di u vostru drive.

Ùn ci hè micca valori "boni" per questi dui parametri postu chì i dui sò dipendenti di hardware. In ogni casu, stabilisce vm.dirty_background_ratio à 5 è vm.dirty_background_bytes à 25% di a velocità di u discu migliurà u rendiment à ~ 25% in a maiò parte di i casi.

vm.dirty_ratio/dirty_bytes

Questu hè listessu cum'è vm.dirty_background_ratio/dirty_background_bytes, eccettu chì u reset hè realizatu in una sessione di u travagliu, bluccà l'applicazione. Dunque vm.dirty_ratio deve esse più altu ch'è vm.dirty_background_ratio. Questu assicura chì i prucessi di fondo cumincianu prima per evità di bluccà l'applicazione quant'è pussibule. Pudete aghjustà a diffarenza trà sti dui rapporti secondu a carica di I / O di discu.

U risultatu

Pudete aghjustà altre paràmetri per migliurà u rendiment, ma i migliuramentu seranu minimi è ùn vedete micca assai benefiziu. Avemu da ricurdà chì micca tutte l'opzioni s'applicanu à tutti i tipi di applicazioni. Alcune app funzionanu megliu quandu aghjustemu certi paràmetri, è altri micca. Duvete truvà l'equilibriu ghjusta trà a cunfigurazione di sti paràmetri per a vostra carica di travagliu prevista è u tipu d'applicazione, è duvete ancu cunsiderà u cumportamentu di u SO quandu sintonizza. A cunfigurazione di i paràmetri di u kernel ùn hè micca cusì faciule cum'è a cunfigurazione di i paràmetri di a basa di dati; hè più difficiule di fà cunsiglii.

Source: www.habr.com

Add a comment