Linux kodola opciju konfigurÄ“Å”ana, lai optimizētu PostgreSQL

Linux kodola opciju konfigurÄ“Å”ana, lai optimizētu PostgreSQL Optimāla PostgreSQL veiktspēja ir atkarÄ«ga no pareizi definētiem operētājsistēmas parametriem. Slikti konfigurēti OS kodola iestatÄ«jumi var izraisÄ«t sliktu datu bāzes servera veiktspēju. Tāpēc Å”ie iestatÄ«jumi ir obligāti jākonfigurē atbilstoÅ”i datu bāzes serverim un tā darba slodzei. Å ajā ziņojumā mēs apspriedÄ«sim dažus svarÄ«gus Linux kodola parametrus, kas var ietekmēt datu bāzes servera veiktspēju, un to konfigurÄ“Å”anu.

SHMMAX / SHMALL

SHMMAX ir kodola parametrs, ko izmanto, lai noteiktu maksimālo viena koplietotās atmiņas segmenta lielumu, ko var pieŔķirt Linux process. Pirms versijas 9.2 PostgreSQL izmantoja System V (SysV), kam nepiecieÅ”ams SHMMAX iestatÄ«jums. Pēc versijas 9.2 PostgreSQL pārgāja uz POSIX koplietoto atmiņu. Tātad tagad ir nepiecieÅ”ams mazāk System V koplietotās atmiņas baitu.

Pirms versijas 9.3 SHMMAX bija vissvarīgākais kodola parametrs. SHMMAX vērtība ir norādīta baitos.

Līdzīgi SHMALL ir vēl viens kodola parametrs, ko izmanto, lai noteiktu
sistēmas mēroga koplietojamās atmiņas lapu apjoms. Lai skatÄ«tu paÅ”reizējās SHMMAX, SHMALL vai SHMMIN vērtÄ«bas, izmantojiet komandu ipcs.

SHM* informācija ā€” 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* informācija ā€” 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 lietojumi Sistēmas V IPC lai pieŔķirtu koplietojamo atmiņu. Å is parametrs ir viens no svarÄ«gākajiem kodola parametriem. Ikreiz, kad saņemat tālāk norādÄ«tos kļūdu ziņojumus, tas nozÄ«mē, ka jums ir vecāka PostgreSQL versija un jÅ«su SHMMAX vērtÄ«ba ir ļoti zema. Lietotājiem ir jāpielāgo un jāpalielina vērtÄ«ba atbilstoÅ”i koplietotajai atmiņai, ko viņi plāno izmantot.

Iespējamas nepareizas konfigurācijas kļūdas

Ja SHMMAX nav pareizi konfigurēts, var tikt parādīts kļūdas ziņojums, mēģinot inicializēt PostgreSQL klasteru, izmantojot komandu initdb.

initdb kļūme
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

Tāpat var tikt parādīta kļūda, startējot PostgreSQL serveri, izmantojot komandu pg_ctl.

pg_ctl Kļūme
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.

Izpratne par definīciju atŔķirībām

SHMMAX/SHMALL parametru definÄ“Å”ana operētājsistēmās Linux un MacOS X nedaudz atŔķiras:

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

Komanda sysctl var izmantot, lai īslaicīgi mainītu vērtību. Lai iestatītu nemainīgas vērtības, pievienojiet ierakstu /etc/sysctl.conf. Sīkāka informācija ir sniegta zemāk.

Kodola iestatījumu maiņa operētājsistēmā 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

Kodola parametru maiņa operētājsistēmā 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

Neaizmirsti: lai izmaiņas bÅ«tu pastāvÄ«gas, pievienojiet Ŕīs vērtÄ«bas failam /etc/sysctl.conf

Milzīgas lapas

Linux pēc noklusējuma izmanto 4 KB atmiņas lapas, BSD izmanto XNUMX KB atmiņas lapas. Super lapas, un operētājsistēmā Windows - Lielas lapas. Lapa ir RAM daļa, kas pieŔķirta procesam. Procesam var bÅ«t vairākas lapas atkarÄ«bā no atmiņas prasÄ«bām. Jo vairāk atmiņas process prasa, jo vairāk lapu tam tiek pieŔķirts. OS uztur lapu pieŔķirÅ”anas tabulu procesiem. Jo mazāks ir lapas izmērs, jo lielāka ir tabula, jo ilgāks laiks nepiecieÅ”ams, lai atrastu lapu Å”ajā lapu tabulā. Tāpēc lielas lapas ļauj izmantot lielus atmiņas apjomus, samazinot pieskaitāmās izmaksas; mazāk lapu skatÄ«jumu, mazāk lappuÅ”u kļūdu, ātrākas lasÄ«Å”anas/rakstÄ«Å”anas darbÄ«bas, izmantojot lielākus buferus. Rezultāts ir uzlabota veiktspēja.

PostgreSQL atbalsta tikai lielas lapas operētājsistēmā Linux. Pēc noklusējuma Linux izmanto 4 KB atmiņas lapas, tāpēc gadÄ«jumos, kad ir pārāk daudz atmiņas operāciju, ir nepiecieÅ”ams iestatÄ«t lielākas lapas. Veiktspējas uzlabojumi tiek novēroti, izmantojot lielas lapas no 2 MB un lÄ«dz 1 GB. Lielo lapas izmēru var iestatÄ«t sāknÄ“Å”anas laikā. Izmantojot komandu, varat viegli pārbaudÄ«t lielos lapas parametrus un to lietojumu savā Linux maŔīnā kaÄ·is /proc/meminfo | grep -i milzÄ«gs.

Informācijas iegūŔana par lielām lapām (tikai 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

Lai gan Å”ajā piemērā lielais lapas izmērs ir iestatÄ«ts uz 2048 (2 MB), kopējais lielo lapu skaits ir iestatÄ«ts uz 0. Tas nozÄ«mē, ka lielas lapas ir atspējotas.

Skripts lielu lapu skaita noteikŔanai

Å is vienkārÅ”ais skripts atgriež nepiecieÅ”amo lielu lapu skaitu. Palaidiet skriptu savā Linux serverÄ«, kamēr darbojas PostgreSQL. Pārliecinieties, ka tas attiecas uz vides mainÄ«go $PGDATA Ir norādÄ«ts PostgreSQL datu direktorijs.

NepiecieŔamo 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ā vērtība lielām lapām ir 88, tāpēc iestatiet to uz 88.

Lielu lapu instalēŔana

sysctl -w vm.nr_hugepages=88

Pārbaudiet lielas lapas tūlīt, jūs redzēsiet, ka lielas lapas netiek izmantotas (HugePages_Free = HugePages_Total).

Atkārtoti apmeklētas lielas lapas (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 failā $PGDATA/postgresql.conf iestatiet parametru huge_pages uz "on" un restartējiet serveri.

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 tiek izmantots ļoti maz lielu lapu. Tagad mēģināsim datubāzei pievienot dažus datus.

Dažas datu bāzes darbības, lai pārstrādātu lielas lapas

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

Paskatīsimies, vai Ŕobrīd izmantojam vairāk lielu lapu nekā iepriekŔ.

Vairāk informācijas lielās lapās (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 tiek izmantota lielākā daļa lielo lapu.

PiezÄ«me. Å eit izmantotā HugePages aptuvenā vērtÄ«ba ir ļoti zema, kas nav normāla vērtÄ«ba iekārtai, kurā darbojas produkta vide. LÅ«dzu, novērtējiet savai sistēmai nepiecieÅ”amo lapu skaitu un atbilstoÅ”i iestatiet tās, pamatojoties uz slodzi un resursiem.

vm.swapiness

vm.swapiness ir vēl viens kodola parametrs, kas var ietekmēt datu bāzes veiktspēju. Å Ä« opcija tiek izmantota, lai kontrolētu mijmaiņas darbÄ«bu (lapu apmaiņu atmiņā un no tās) operētājsistēmā Linux. VērtÄ«ba svārstās no 0 lÄ«dz 100. Tas nosaka, cik daudz atmiņas tiks lappuÅ”u vai izņemtas. Nulle nozÄ«mē bez maiņas un 100 nozÄ«mē agresÄ«vu apmaiņu.

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

Iestatot Å”o vērtÄ«bu uz 0 jaunākos kodolos, OOM Killer (Linux atmiņas tÄ«rÄ«Å”anas process) var pārtraukt procesu. Tāpēc ir droÅ”i iestatÄ«t to uz 1, ja vēlaties samazināt apmaiņu. Linux noklusējuma vērtÄ«ba ir 60. Augstāka vērtÄ«ba liek MMU (atmiņas pārvaldÄ«bas vienÄ«bai) izmantot vairāk mijmaiņas vietas nekā RAM, savukārt mazāka vērtÄ«ba saglabā vairāk datu/koda atmiņā.

Zemāka vērtība ir laba likme uzlabotai veiktspējai programmā PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Lietojumprogrammas iegÅ«st atmiņu un atbrÄ«vo to, kad tā vairs nav nepiecieÅ”ama. Bet dažos gadÄ«jumos lietojumprogramma iegÅ«st pārāk daudz atmiņas un to neatbrÄ«vo. Tas var izraisÄ«t OOM killer. Å eit ir norādÄ«tas iespējamās parametru vērtÄ«bas vm.overcommit_memory ar aprakstu katram:

  1. Heiristiskā pārsniegÅ”ana (noklusējums); uz kodolu balstÄ«ta heiristika
  2. Jebkurā gadījumā ļaujiet pārspīlēt
  3. Nepārspīlējiet to, nepārsniedziet pārspīlēto saistību attiecību.

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

vm.overcommit_ratio ā€” pārslodzes gadÄ«jumā pieejamās RAM procentuālā daļa. VērtÄ«ba 50% 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 PostgreSQL veiktspēju. Å Ä« vērtÄ«ba maksimāli palielina servera procesa RAM izmantoÅ”anu, neradot bÅ«tisku risku, ka OOM slepkavas process varētu tikt nogalināts. Lietojumprogrammu varēs atkārtoti ielādēt, taču tikai pārtÄ«Å”anas robežās, kas samazina risku, ka OOM slepkava iznÄ«cinās procesu. Tāpēc vērtÄ«ba 2 nodroÅ”ina labāku veiktspēju nekā noklusējuma vērtÄ«ba 0. Tomēr uzticamÄ«bu var uzlabot, nodroÅ”inot, ka ārpus diapazona esoŔā atmiņa netiek pārslogota. Tas novērÅ” risku, ka procesu var nogalināt OOM slepkava.

Sistēmās bez mijmaiņas var rasties problēma ar vm.overcommit_memory, kas vienāda 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 ir ar netÄ«rām lapām piepildÄ«tās atmiņas procentuālais daudzums, kas jāieraksta diskā. IzskaloÅ”ana diskā notiek fonā. Å Ä« parametra vērtÄ«ba ir robežās no 0 lÄ«dz 100; tomēr vērtÄ«ba, kas ir mazāka par 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. Varat uzlabot veiktspēju intensÄ«vām rakstÄ«Å”anas darbÄ«bām ar mazāku faktoru, kas nozÄ«mē, ka Linux fonā izskalos netÄ«rās lapas.

Jums ir jāiestata vērtÄ«ba vm.dirty_background_bytes atkarÄ«bā no jÅ«su braukÅ”anas ātruma.

Šiem diviem parametriem nav "labu" vērtību, jo abi ir atkarīgi no aparatūras. Tomēr, iestatot vm.dirty_background_ratio uz 5 un vm.dirty_background_bytes līdz 25% no diska ātruma, vairumā gadījumu veiktspēja uzlabojas līdz ~25%.

vm.dirty_ratio/dirty_bytes

Tas ir tas pats, kas vm.dirty_background_ratio/dirty_background_bytes, izņemot to, ka atiestatÄ«Å”ana tiek veikta darbinieka sesijā, bloķējot lietojumprogrammu. Tāpēc vm.dirty_ratio jābÅ«t lielākam par vm.dirty_background_ratio. Tas nodroÅ”ina, ka fona procesi sākas agrāk, lai pēc iespējas izvairÄ«tos no lietojumprogrammas bloÄ·Ä“Å”anas. Varat pielāgot atŔķirÄ«bu starp Ŕīm divām attiecÄ«bām atkarÄ«bā no diska I/O slodzes.

Kopsavilkums

Varat pielāgot citus iestatÄ«jumus, lai uzlabotu veiktspēju, taču uzlabojumi bÅ«s minimāli, un jÅ«s neredzēsit lielu labumu. Jāatceras, ka ne visas iespējas attiecas uz visu veidu lietojumprogrammām. Dažas lietotnes darbojas labāk, ja pielāgojam dažus iestatÄ«jumus, bet dažas ne. Jums ir jāatrod pareizais lÄ«dzsvars starp Å”o iestatÄ«jumu konfigurÄ“Å”anu paredzētajai darba slodzei un lietojumprogrammas veidam, kā arÄ«, veicot regulÄ“Å”anu, jāņem vērā OS darbÄ«ba. Kodola parametru konfigurÄ“Å”ana nav tik vienkārÅ”a kā datu bāzes parametru konfigurÄ“Å”ana; ir grÅ«tāk sniegt ieteikumus.

Avots: www.habr.com

Pievieno komentāru