Vebijarkên Kernelê yên Linux-ê ji bo Optimîzekirina PostgreSQL-ê rast bikin

Vebijarkên Kernelê yên Linux-ê ji bo Optimîzekirina PostgreSQL-ê rast bikin Performansa Optimal PostgreSQL bi pîvanên pergala xebitandinê ya rast ve girêdayî ye. Mîhengên kernelê yên OS-ê yên ku nebaş hatine mîheng kirin dikarin performansa servera databasê ya nebaş encam bidin. Ji ber vê yekê, pêdivî ye ku van mîhengan li gorî servera databasê û barê xebata wê werin mîheng kirin. Di vê postê de, em ê li ser hin parametreyên kernel Linux-ê yên girîng ên ku dikarin li ser performansa servera databasê bandor bikin û meriv çawa wan mîheng bike nîqaş bikin.

SHMMAX / SHMALL

SHMMAX Parametreyek kernelê ye ku ji bo destnîşankirina mezinahiya herî zêde ya perçeyek bîranîna hevpar a ku pêvajoyek Linux dikare veqetîne tê bikar anîn. Berî guhertoya 9.2, PostgreSQL Pergala V (SysV) bikar anî, ku mîhenga SHMMAX hewce dike. Piştî 9.2, PostgreSQL veguherî bîranîna hevpar a POSIX. Ji ber vê yekê naha kêmtir baytên bîranîna hevpar a System V hewce ne.

Berî guhertoya 9.3, SHMMAX pîvana kernelê ya herî girîng bû. Nirxa SHMMAX di byte de tête diyar kirin.

Bi heman rengî, SHMALL Parametreyek din a kernelê ye ku ji bo destnîşankirinê tê bikar anîn
qebareya pergalê ya rûpelên bîranîna hevpar. Ji bo dîtina nirxên heyî yên SHMMAX, SHMALL, an SHMMIN, fermanê bikar bînin ipcs.

SHM * Hûrgulî - 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* hûragahiyan - 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 bikar tîne Pergala V IPC ji bo veqetandina bîra hevpar. Ev pîvan yek ji pîvanên kernelê yên herî girîng e. Gava ku hûn peyamên xeletiya jêrîn bistînin, ev tê vê wateyê ku we guhertoyek kevntir a PostgreSQL heye û nirxa weya SHMMAX pir kêm e. Tê payîn ku bikarhêner li gorî bîranîna hevpar a ku ew dixwazin bikar bînin nirxê rast bikin û zêde bikin.

Çewtiyên mîhengê yên muhtemel

Ger SHMMAX rast nehatibe mîheng kirin, dibe ku hûn gava ku hûn bi karanîna fermanê hewl didin ku komek PostgreSQL dest pê bikin xeletiyek bistînin. initdb.

initdb Têkçû
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

Di heman demê de, hûn dikarin gava ku servera PostgreSQL bi karanîna fermanê dest pê dike xeletiyek bistînin pg_ctl.

pg_ctl Têkçû
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.

Fêmkirina cudahiyên di pênaseyan de

Diyarkirina parametreyên SHMMAX/SHMALL li Linux û MacOS X hinekî cûda ye:

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

tîma sysctl dikare ji bo guheztina demkî ya nirxê were bikar anîn. Ji bo danîna nirxên domdar, navnîşek lê zêde bike /etc/sysctl.conf. Agahiyên li jêr in.

Guhertina Mîhengên Kernelê li 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

Guhertina Parametreyên Kernel li 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

Gelek baş: Ji bo guhertinên daîmî bikin, van nirxan li /etc/sysctl.conf zêde bikin

Rûpelên Mezin

Linux ji hêla xwerû ve 4 KB rûpelên bîranînê bikar tîne, BSD rûpelên bîranînê XNUMX KB bikar tîne. Rûpelên super, û li ser Windows - Rûpelên Mezin. Rûpel perçeyek RAM-ê ye ku ji pêvajoyek re hatî veqetandin. Pêvajoyek li gorî hewcedariyên bîranînê dikare gelek rûpelan hebe. Pêvajoyek çiqas bêtir bîranîn hewce dike, ew qas bêtir rûpel têne veqetandin. OS ji bo pêvajoyan tabloyek veqetandina rûpelan diparêze. Mezinahiya rûpelê her ku piçûktir be, tablo çiqas mezin be, ew qas dirêjtir hewce dike ku rûpelek di wê tabloya rûpelê de bibîne. Ji ber vê yekê rûpelên mezin dihêlin ku mîqdarên mezin ên bîranînê bi sermaya kêmkirî were bikar anîn; kêm dîtinên rûpelan, kêm xeletiyên rûpelan, xebatên xwendin/nivîsandina zûtir li ser tamponên mezintir. Encam performansa çêtir e.

PostgreSQL tenê rûpelên mezin li ser Linux piştgirî dike. Bi xwerû, Linux rûpelên bîranînê 4 KB bikar tîne, ji ber vê yekê di rewşên ku gelek operasyonên bîranînê hene, pêdivî ye ku rûpelên mezintir werin danîn. Dema ku rûpelên mezin ên 2 MB û heya 1 GB bikar bînin, destkeftiyên performansê têne dîtin. Mezinahiya rûpela mezin dikare di dema bootê de were danîn. Hûn dikarin bi karanîna fermanê bi hêsanî parametreyên rûpela mezin û karanîna wan li ser makîneya xweya Linux-ê kontrol bikin pisîk /proc/meminfo | grep -i mezin.

Agahdariyê di derbarê rûpelên mezin de (tenê 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

Di vê nimûneyê de, her çend mezinahiya rûpela mezin wek 2048 (2 MB) hatiye danîn, hejmara giştî ya rûpelên mezin 0 ye. Ev tê wê wateyê ku rûpelên mezin neçalak in.

Skrîpta ji bo destnîşankirina hejmara rûpelên mezin

Ev skrîpta hêsan hejmara hewce ya rûpelên mezin vedigerîne. Dema ku PostgreSQL dixebite, skrîptê li ser servera xweya Linux-ê bimeşînin. Piştrast bikin ku ji bo guhêrbar jîngehê $PGDATA Peldanka daneya PostgreSQL tête diyar kirin.

Danîna hejmara rûpelên mezin ên pêwîst

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

Derketina skrîptê wiha xuya dike:

Derketina skrîptê

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

Nirxa pêşniyar ji bo rûpelên mezin 88 e, ji ber vê yekê divê hûn wê li 88-ê bicîh bikin.

Sazkirina Rûpelên Mezin

sysctl -w vm.nr_hugepages=88

Naha rûpelên mezin kontrol bikin, hûn ê bibînin ku rûpelên mezin nayên bikar anîn (HugePages_Free = HugePages_Total).

Rûpelên Mezin Ji Nûve Veیrîn (Tenê 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

Niha di $PGDATA/postgresql.conf de parametreya large_pages wek "on" saz bike û pêşkêşkarê ji nû ve bide destpêkirin.

Carek din, agahdariya di derbarê rûpelên mezin de (tenê 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

Naha hûn dikarin bibînin ku pir hindik rûpelên mezin têne bikar anîn. Ka em niha hewl bidin ku hin daneyan li databasê zêde bikin.

Hin operasyonên databasê ji bo vezîvirandina rûpelên mezin

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

Ka em bibînin ka em niha ji berê bêtir rûpelên mezin bikar tînin.

Agahiyên bêtir li ser rûpelên mezin (tenê 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

Naha hûn dikarin bibînin ku piraniya rûpelên mezin têne bikar anîn.

Nîşe: Nirxa texmînkirî ji bo HugePages ku li vir têne bikar anîn pir kêm e, ku ji bo makîneyek ku hawîrdorek hilberek dixebitîne ne nirxek normal e. Ji kerema xwe hejmara rûpela pêwîst ji bo pergala xwe binirxînin û wan li gorî barkirin û çavkaniyan saz bikin.

vm.swappiness

vm.swappiness Parametreyek din a kernelê ye ku dikare bandorê li performansa databasê bike. Ev vebijark ji bo kontrolkirina tevgera guheztinê (guheztina rûpelan di nav û ji bîrê de) di Linux de tê bikar anîn. Nirx ji 0 heta 100 diguhere. Ew diyar dike ku dê çiqas bîranîn were rûpel kirin an jî rûpel were derxistin. Zero tê wateya neguhertinê û 100 tê wateya danûstendina êrîşkar.

Hûn dikarin bi danîna nirxên jêrîn performansa baş bistînin.

Danîna vê 0-ê li ser kernelên nûtir dibe ku OOM Killer (pêvajoya paqijkirina bîranîna Linux) pêvajoyê bikuje. Ji ber vê yekê ew ewle ye ku hûn wê li 1-ê saz bikin ger hûn dixwazin guheztinê kêm bikin. Nirxa xwerû di Linuxê de 60 e. Nirxek bilindtir dibe sedem ku MMU (yekîneya rêveberiya bîranînê) ji RAM-ê bêtir cîhê veguheztinê bikar bîne, lê nirxek kêmtir bêtir daneyan/kod di bîranînê de digire.

Nirxek kêmtir ji bo performansa çêtir di PostgreSQL de behîsek baş e.

vm.overcommit_memory / vm.overcommit_ratio

Serlêdan bîranînê digirin û gava ku êdî hewce nebe wê berdidin. Lê di hin rewşan de, serîlêdan pir bîranîn digire û wê bernade. Ev dibe sedema kujerek OOM. Li vir nirxên parametreyên gengaz hene vm.overcommit_memory bi ravekirinek ji bo her yekê:

  1. Heuristic overcommit (default); heurîstîk-based kernel
  2. Bi her awayî destûr bidin serhevkirinê
  3. Zêde nekin, ji rêjeya zêdebûnê derbas nekin.

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

vm.overcommit_ratio - ji sedî RAM-ê ji bo zêdebarkirinê peyda dibe. Nirxa 50% li ser pergalek bi 2 GB RAM dikare heya 3 GB RAM veqetîne.

Nirxa 2 ji bo vm.overcommit_memory ji bo PostgreSQL performansa çêtir peyda dike. Ev nirx karanîna RAM-ê ya pêvajoya serverê bêyî xeterek girîng a kuştina ji hêla pêvajoya kuştina OOM-ê ve zêde dike. Serlêdan dê bikaribe ji nû ve were barkirin, lê tenê di nav sînorên dorpêçkirinê de, ku xetera kuştina kujerê OOM pêvajoyê kêm dike. Ji ber vê yekê, nirxek 2 performansa çêtir ji nirxa xwerû ya 0-yê dide. Lêbelê, pêbawerî dikare bi piştrastkirina ku bîranîna derveyî-rêveberê zêde neyê barkirin çêtir dibe. Ev xetera ku pêvajoyê ji hêla kujerek OOM ve were kuştin ji holê radike.

Li ser pergalên bêyî guheztinê, dibe ku pirsgirêkek bi vm.overcommit_memory re wekhev 2 derkeve.

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 rêjeya bîranîna bi rûpelên qirêj dagirtî ye ku divê li ser dîskê were nivîsandin. Rakirina dîskê di paşperdeyê de pêk tê. Nirxa vê pîvanê ji 0 heta 100 diguhere; Lêbelê, nirxek li jêr 5 dibe ku bêbandor be û hin kernel wê piştgirî nakin. 10 li ser piraniya pergalên Linux-ê xwerû ye. Hûn dikarin performansê ji bo operasyonên nivîsandinê-dijwar bi faktorek piçûktir çêtir bikin, ku ev tê vê wateyê ku Linux dê rûpelên qirêj di paşerojê de bişewitîne.

Pêdivî ye ku hûn nirxê saz bikin vm.dirty_background_bytes li ser leza ajotina we girêdayî ye.

Ji bo van her du pîvanan nirxên "baş" tune ji ber ku her du jî bi hardware ve girêdayî ne. Lêbelê, danîna vm.dirty_background_ratio li ser 5 û vm.dirty_background_bytes ji% 25 ji leza dîskê di pir rewşan de performansê ji% ~25 çêtir dike.

vm.dirty_ratio/dirty_bytes

Ev heman wekî ye vm.dirty_background_ratio/dirty_background_bytes, ji bilî ku reset di danişîna karker de tête kirin, serîlêdanê asteng dike. Ji ber vê yekê divê vm.dirty_ratio ji bilindtir be vm.dirty_background_ratio. Ev piştrast dike ku pêvajoyên paşerojê zû dest pê dikin da ku bi qasî ku gengaz be astengkirina serîlêdanê nehêlin. Hûn dikarin cûdahiya di navbera van her du rêjeyan de li gorî barkirina I/O ya dîskê eyar bikin.

Encam

Hûn dikarin mîhengên din biguhezînin da ku performansê baştir bikin, lê çêtirkirin dê hindik bin û hûn ê pir feyde nebînin. Divê em ji bîr mekin ku ne hemî vebijark ji bo hemî celeb serlêdanan derbas dibin. Gava ku em hin mîhengan eyar bikin, hin sepan çêtir dixebitin, û hin jî nakin. Pêdivî ye ku hûn di navbera mîhengkirina van mîhengan de ji bo bargiraniya xebata xweya bendewar û celebê serîlêdanê de hevsengiya rast bibînin, û divê hûn di heman demê de guheztina OS-ê jî dema ku bişkînin bifikirin. Veavakirina parametreyên kernel bi qasî mîhengkirina parametreyên databasê ne hêsan e; çêkirina pêşniyaran dijwartir e.

Source: www.habr.com

Add a comment