Ajustar les opcions del nucli de Linux per optimitzar PostgreSQL

Ajustar les opcions del nucli de Linux per optimitzar PostgreSQL El rendiment òptim de PostgreSQL depèn dels paràmetres del sistema operatiu definits correctament. La configuració del nucli del sistema operatiu mal configurada pot provocar un rendiment deficient del servidor de bases de dades. Per tant, és imprescindible que aquests paràmetres es configuren segons el servidor de bases de dades i la seva càrrega de treball. En aquesta publicació, parlarem d'alguns paràmetres importants del nucli de Linux que poden afectar el rendiment del servidor de bases de dades i com configurar-los.

SHMMAX / SHMALL

SHMMAX és un paràmetre del nucli utilitzat per determinar la mida màxima d'un únic segment de memòria compartida que un procés Linux pot assignar. Abans de la versió 9.2, PostgreSQL utilitzava System V (SysV), que requereix la configuració SHMMAX. Després de la 9.2, PostgreSQL va canviar a la memòria compartida POSIX. Per tant, ara es necessiten menys bytes de memòria compartida de System V.

Abans de la versió 9.3, SHMMAX era el paràmetre més important del nucli. El valor SHMMAX s'especifica en bytes.

De la mateixa manera SHMALL és un altre paràmetre del nucli utilitzat per determinar
volum de pàgines de memòria compartida a tot el sistema. Per veure els valors SHMMAX, SHMALL o SHMMIN actuals, utilitzeu l'ordre ipcs.

Detalls 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

Detalls de 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)

Usa PostgreSQL Sistema V IPC per assignar memòria compartida. Aquest paràmetre és un dels paràmetres més importants del nucli. Sempre que rebeu els missatges d'error següents, vol dir que teniu una versió anterior de PostgreSQL i que el vostre valor SHMMAX és molt baix. S'espera que els usuaris ajustin i augmentin el valor segons la memòria compartida que pretenen utilitzar.

Possibles errors de configuració incorrecta

Si SHMMAX no està configurat correctament, és possible que rebeu un error quan intenteu inicialitzar un clúster PostgreSQL mitjançant l'ordre initdb.

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

De la mateixa manera, és possible que rebeu un error en iniciar el servidor PostgreSQL mitjançant l'ordre pg_ctl.

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

Comprendre les diferències en les definicions

La definició dels paràmetres SHMMAX/SHMALL és lleugerament diferent a Linux i MacOS X:

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

Equip sysctl es pot utilitzar per canviar temporalment el valor. Per establir valors constants, afegiu una entrada a /etc/sysctl.conf. Els detalls es troben a continuació.

Canviar la configuració del nucli 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

Canviar els paràmetres del nucli 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

No oblidis: Per fer que els canvis siguin permanents, afegiu aquests valors a /etc/sysctl.conf

Pàgines enormes

Linux utilitza pàgines de memòria de 4 KB de manera predeterminada, BSD utilitza pàgines de memòria de XNUMX KB. Super pàgines, i a Windows - Pàgines grans. Una pàgina és una part de memòria RAM assignada a un procés. Un procés pot tenir diverses pàgines en funció dels requisits de memòria. Com més memòria requereixi un procés, més pàgines s'assignarà. El sistema operatiu manté una taula d'assignació de pàgines per als processos. Com més petita sigui la mida de la pàgina, més gran sigui la taula, més temps es triga a trobar una pàgina en aquesta taula de pàgines. Per tant, les pàgines grans permeten utilitzar grans quantitats de memòria amb una sobrecàrrega reduïda; menys visualitzacions de pàgines, menys errors de pàgina, operacions de lectura/escriptura més ràpides en buffers més grans. El resultat és un rendiment millorat.

PostgreSQL només admet pàgines grans a Linux. Per defecte, Linux utilitza pàgines de memòria de 4 KB, de manera que en els casos en què hi ha massa operacions de memòria, cal configurar pàgines més grans. S'observen guanys de rendiment quan s'utilitzen pàgines grans de 2 MB i fins a 1 GB. La mida gran de la pàgina es pot configurar en el moment de l'arrencada. Podeu comprovar fàcilment els paràmetres de la pàgina gran i el seu ús a la vostra màquina Linux mitjançant l'ordre cat /proc/meminfo | grep -i enorme.

Obtenció d'informació sobre pàgines grans (només 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

En aquest exemple, tot i que la mida de la pàgina gran s'estableix en 2048 (2 MB), el nombre total de pàgines grans s'estableix en 0. Això vol dir que les pàgines grans estan desactivades.

Script per determinar el nombre de pàgines grans

Aquest senzill script retorna el nombre necessari de pàgines grans. Executeu l'script al vostre servidor Linux mentre s'està executant PostgreSQL. Assegureu-vos que per a la variable d'entorn $PGDATA S'especifica el directori de dades PostgreSQL.

Obtenció del nombre de pàgines grans necessàries

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

La sortida de l'script té aquest aspecte:

Sortida de l'script

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

El valor recomanat per a pàgines grans és 88, de manera que hauríeu de configurar-lo en 88.

Instal·lació de pàgines grans

sysctl -w vm.nr_hugepages=88

Comproveu ara les pàgines grans, veureu que no s'utilitzen pàgines grans (HugePages_Free = HugePages_Total).

Pàgines grans revisades (només 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

Ara configureu el paràmetre huge_pages a "on" a $PGDATA/postgresql.conf i reinicieu el servidor.

Una vegada més, informació sobre pàgines grans (només 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

Ara podeu veure que s'utilitzen molt poques pàgines grans. Ara intentem afegir algunes dades a la base de dades.

Algunes operacions de base de dades per reciclar pàgines grans

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

A veure si ara fem servir més pàgines grans que abans.

Més informació a pàgines grans (només 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

Ara podeu veure que la majoria de les pàgines grans s'estan utilitzant.

Nota: el valor estimat d'HugePages que s'utilitza aquí és molt baix, cosa que no és un valor normal per a una màquina que executa un entorn de producte. Si us plau, estimeu el nombre de pàgines requerides per al vostre sistema i configureu-les en funció de la càrrega i dels recursos.

vm.canvi

vm.canvi és un altre paràmetre del nucli que pot afectar el rendiment de la base de dades. Aquesta opció s'utilitza per controlar el comportament de l'intercanvi (intercanvi de pàgines dins i fora de la memòria) a Linux. El valor oscil·la entre 0 i 100. Determina quanta memòria es paginarà o s'eliminarà. Zero significa cap intercanvi i 100 significa intercanvi agressiu.

Podeu obtenir un bon rendiment establint valors més baixos.

Establir-ho a 0 en nuclis més nous pot provocar que OOM Killer (procés de neteja de memòria de Linux) mati el procés. Per tant, és segur establir-lo a 1 si voleu minimitzar l'intercanvi. El valor predeterminat a Linux és 60. Un valor més alt fa que la MMU (unitat de gestió de memòria) utilitzi més espai d'intercanvi que la RAM, mentre que un valor més baix manté més dades/codi a la memòria.

Un valor més baix és una bona aposta per millorar el rendiment a PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Les aplicacions adquireixen memòria i la alliberen quan ja no la necessiten. Però en alguns casos, l'aplicació obté massa memòria i no l'allibera. Això pot provocar un assassí OOM. Aquests són els possibles valors dels paràmetres vm.overcommit_memory amb una descripció per a cadascun:

  1. Overcommit heurístic (per defecte); heurística basada en el nucli
  2. Permet el sobrecompromis de totes maneres
  3. No us excediu, no supereu la ràtio de sobrecommissió.

Referència: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — percentatge de RAM disponible per sobrecàrrega. Un valor del 50% en un sistema amb 2 GB de RAM pot assignar fins a 3 GB de RAM.

Un valor de 2 per a vm.overcommit_memory proporciona un millor rendiment per a PostgreSQL. Aquest valor maximitza l'ús de la memòria RAM del procés del servidor sense cap risc significatiu de ser assassinat pel procés d'assassinat OOM. L'aplicació es podrà tornar a carregar, però només dins dels límits de superació, la qual cosa redueix el risc que un assassí OOM mati el procés. Per tant, un valor de 2 ofereix un millor rendiment que el valor predeterminat de 0. No obstant això, la fiabilitat es pot millorar assegurant que la memòria fora de rang no es sobrecarregui. Això elimina el risc que el procés sigui matat per un assassí OOM.

En sistemes sense intercanvi, es pot produir un problema amb vm.overcommit_memory igual a 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 és el percentatge de memòria plena de pàgines brutes que cal escriure al disc. L'encaix al disc es produeix en segon pla. El valor d'aquest paràmetre oscil·la entre 0 i 100; tanmateix, un valor inferior a 5 pot ser ineficaç i alguns nuclis no ho admeten. 10 és el predeterminat a la majoria de sistemes Linux. Podeu millorar el rendiment de les operacions intensives en escriptura per un factor més petit, la qual cosa significarà que Linux esborrarà les pàgines brutes en segon pla.

Cal establir el valor vm.dirty_background_bytes depenent de la velocitat de la teva unitat.

No hi ha valors "bons" per a aquests dos paràmetres, ja que tots dos depenen del maquinari. Tanmateix, establir vm.dirty_background_ratio a 5 i vm.dirty_background_bytes al 25% de la velocitat del disc millora el rendiment al ~25% en la majoria dels casos.

vm.dirty_ratio/dirty_bytes

Això és el mateix que vm.proporció_de_fons_sucia/bytes_de_fons_brut, excepte que el restabliment es realitza en una sessió de treball, bloquejant l'aplicació. Per tant, vm.dirty_ratio hauria de ser superior a vm.dirty_background_ratio. Això garanteix que els processos en segon pla comencen abans per evitar bloquejar l'aplicació tant com sigui possible. Podeu ajustar la diferència entre aquestes dues proporcions en funció de la càrrega d'E/S del disc.

Total

Podeu modificar altres paràmetres per millorar el rendiment, però les millores seran mínimes i no veureu gaire benefici. Hem de recordar que no totes les opcions s'apliquen a tot tipus d'aplicacions. Algunes aplicacions funcionen millor quan ajustem algunes configuracions, i d'altres no. Heu de trobar l'equilibri adequat entre configurar aquests paràmetres per a la vostra càrrega de treball esperada i el tipus d'aplicació, i també heu de tenir en compte el comportament del sistema operatiu quan l'ajusteu. Configurar els paràmetres del nucli no és tan fàcil com configurar els paràmetres de la base de dades; és més difícil fer recomanacions.

Font: www.habr.com

Afegeix comentari