Konfigirasyon Opsyon Kernel Linux pou Optimize PostgreSQL

Konfigirasyon Opsyon Kernel Linux pou Optimize PostgreSQL Pèfòmans optimal PostgreSQL depann de paramèt sistèm operasyon yo byen defini. Anviwònman nwayo OS ki mal configuré ka lakòz move pèfòmans sèvè baz done. Se poutèt sa, li se enperatif ke paramèt sa yo configuré dapre sèvè baz done a ak kantite travay li yo. Nan pòs sa a, nou pral diskite sou kèk paramèt nwayo Linux enpòtan ki ka afekte pèfòmans sèvè baz done ak kouman yo konfigirasyon yo.

SHMMAX / SHMALL

SHMMAX se yon paramèt nwayo yo itilize pou detèmine gwosè maksimòm yon sèl segman memwa pataje ke yon pwosesis Linux ka asiyen. Anvan vèsyon 9.2, PostgreSQL te itilize System V (SysV), ki mande anviwònman SHMMAX la. Apre 9.2, PostgreSQL chanje nan memwa pataje POSIX. Se konsa, kounye a gen mwens octets nan memwa pataje System V yo obligatwa.

Anvan vèsyon 9.3, SHMMAX te paramèt nwayo ki pi enpòtan an. Valè SHMMAX espesifye an byte.

Menm jan an tou, SHMALL se yon lòt paramèt nwayo yo itilize pou detèmine
volim nan tout sistèm nan paj memwa pataje. Pou wè valè aktyèl SHMMAX, SHMALL, oswa SHMMIN, sèvi ak kòmandman an ipcs.

SHM* Detay - 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* Detay - 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 itilize Sistèm V IPC pou asiyen memwa pataje. Paramèt sa a se youn nan paramèt nwayo ki pi enpòtan yo. Chak fwa ou resevwa mesaj erè sa yo, sa vle di ke ou gen yon vèsyon ki pi gran nan PostgreSQL ak valè SHMMAX ou a trè ba. Itilizatè yo dwe ajiste ak ogmante valè a dapre memwa pataje yo gen entansyon itilize.

Erè move konfigirasyon posib

Si SHMMAX pa configuré kòrèkteman, ou ka resevwa yon erè lè w ap eseye inisyalize yon gwoup PostgreSQL lè l sèvi avèk kòmandman an. initdb.

initdb Echè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

Menm jan an tou, ou ka resevwa yon erè lè w kòmanse sèvè PostgreSQL la lè l sèvi avèk lòd la pg_ctl.

pg_ctl Echè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.

Konprann diferans ki genyen nan definisyon

Defini paramèt SHMMAX/SHMALL yo yon ti kras diferan sou Linux ak MacOS X:

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

Ekip sysctl ka itilize pou chanje tanporèman valè a. Pou mete valè konstan, ajoute yon antre nan /etc/sysctl.conf. Detay yo anba a.

Chanje Anviwònman Kernel sou 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

Chanje paramèt Kernel sou 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

Pa bliye: Pou fè chanjman pèmanan, ajoute valè sa yo nan /etc/sysctl.conf

Paj gwo

Linux itilize paj memwa 4 KB pa default, BSD itilize paj memwa XNUMX KB. Paj Super, ak sou Windows - Gwo Paj. Yon paj se yon moso RAM ki afekte nan yon pwosesis. Yon pwosesis ka gen plizyè paj depann sou kondisyon memwa. Plis memwa yon pwosesis mande, se plis paj li resevwa. OS la kenbe yon tab alokasyon paj pou pwosesis yo. Pi piti gwosè paj la, pi gwo tab la, se plis li pran tan pou jwenn yon paj nan tablo paj sa a. Gwo paj Se poutèt sa pèmèt gwo kantite memwa yo dwe itilize ak sou tèt redwi; mwens paj wè, mwens paj defo, pi vit operasyon lekti/ekri sou pi gwo tanpon. Rezilta a se pèfòmans amelyore.

PostgreSQL sèlman sipòte gwo paj sou Linux. Pa default, Linux itilize paj memwa 4 KB, kidonk nan ka kote gen twòp operasyon memwa, li nesesè yo mete pi gwo paj. Yo obsève pwogrè pèfòmans lè w ap itilize gwo paj 2 MB ak jiska 1 GB. Gwosè paj la ka mete nan moman bòt la. Ou ka byen fasil tcheke paramèt gwo paj yo ak itilizasyon yo sou machin Linux ou lè l sèvi avèk lòd la chat /proc/meminfo | grep -i gwo.

Jwenn enfòmasyon sou gwo paj (Linux sèlman)

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

Nan egzanp sa a, byenke gwosè paj gwo yo mete sou 2048 (2 MB), kantite total gwo paj yo mete sou 0. Sa vle di gwo paj yo enfim.

Script pou detèmine kantite gwo paj

Script senp sa a retounen kantite gwo paj ki nesesè yo. Kouri script la sou sèvè Linux ou pandan PostgreSQL ap kouri. Asire w ke pou anviwònman an varyab $PGDATA Anyè done PostgreSQL espesifye.

Jwenn kantite gwo paj ki nesesè yo

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

Pwodiksyon script la sanble sa a:

Pwodiksyon script

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

Valè rekòmande pou gwo paj se 88, kidonk ou ta dwe mete l sou 88.

Enstale paj gwo

sysctl -w vm.nr_hugepages=88

Tcheke paj gwo kounye a, ou pral wè ke paj gwo yo pa itilize (HugePages_Free = HugePages_Total).

Gwo paj revize (Linux sèlman)

$ 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

Koulye a, mete paramèt huge_pages nan "on" nan $PGDATA/postgresql.conf epi rekòmanse sèvè a.

Yon fwa ankò, enfòmasyon sou gwo paj (Linux sèlman)

$ 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

Koulye a, ou ka wè ke trè kèk gwo paj yo te itilize. Ann eseye ajoute kèk done nan baz done a.

Gen kèk operasyon baz done resikle gwo paj

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

Ann wè si n ap itilize plis paj gwo kounye a pase anvan.

Plis enfòmasyon sou gwo paj (Linux sèlman)

$ 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

Koulye a, ou ka wè ke pifò nan paj gwo yo te itilize.

Remak: Valè estime pou HugePages yo itilize isit la trè ba, ki se pa yon valè nòmal pou yon machin ki kouri yon anviwònman pwodwi. Tanpri estime kantite paj ki nesesè pou sistèm ou an epi mete yo kòmsadwa dapre chaj ak resous yo.

vm.swappiness

vm.swappiness se yon lòt paramèt nwayo ki ka afekte pèfòmans baz done a. Opsyon sa a itilize pou kontwole konpòtman swappiness (chanje paj antre ak soti nan memwa) nan Linux. Valè a varye ant 0 a 100. Li detèmine konbyen memwa yo pral paj oswa paj soti. Zewo vle di pa gen echanj ak 100 vle di echanj agresif.

Ou ka jwenn bon pèfòmans lè w mete pi ba valè.

Mete sa a 0 sou nouvo nwayo ka lakòz OOM Killer (pwosesis netwayaj memwa Linux la) touye pwosesis la. Se konsa, li an sekirite yo mete li nan 1 si ou vle minimize swapping. Valè default nan Linux se 60. Yon valè ki pi wo lakòz MMU (inite jesyon memwa) sèvi ak plis espas swap pase RAM, pandan y ap yon valè ki pi ba kenbe plis done / kòd nan memwa.

Yon valè ki pi ba se yon bon parye pou amelyore pèfòmans nan PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Aplikasyon yo jwenn memwa epi lage li lè li pa nesesè ankò. Men, nan kèk ka, aplikasyon an vin twòp memwa epi li pa lage li. Sa ka lakòz yon asasen OOM. Men valè paramèt posib yo vm.overcommit_memory ak yon deskripsyon pou chak:

  1. Euristik overcommit (default); eristik ki baze sou nwayo
  2. Pèmèt overcommit de tout fason
  3. Pa twòp li, pa depase rapò a overcommit.

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

vm.overcommit_ratio — pousantaj RAM ki disponib pou surcharge. Yon valè 50% sou yon sistèm ki gen 2 GB RAM ka asiyen jiska 3 GB RAM.

Yon valè 2 pou vm.overcommit_memory bay pi bon pèfòmans pou PostgreSQL. Valè sa a maksimize itilizasyon RAM pwosesis sèvè a san okenn risk enpòtan pou yo touye pa pwosesis asasen OOM la. Aplikasyon an pral kapab rechaje, men sèlman nan limit yo nan depase, ki diminye risk pou yon asasen OOM touye pwosesis la. Se poutèt sa, yon valè 2 bay pi bon pèfòmans pase valè default 0. Sepandan, fyab ka amelyore lè w asire ke memwa andeyò ranje pa twò chaje. Sa a elimine risk pou pwosesis la te touye pa yon asasen OOM.

Sou sistèm san yo pa chanje, yon pwoblèm ak vm.overcommit_memory egal a 2 ka rive.

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 se pousantaj memwa ki ranpli ak paj sal ki bezwen ekri sou disk. Flòch la nan disk rive nan background nan. Valè paramèt sa a varye ant 0 a 100; sepandan, yon valè ki anba a 5 ka pa efikas ak kèk nwayo pa sipòte li. 10 se default sou pifò sistèm Linux. Ou ka amelyore pèfòmans pou operasyon ekri entansif pa yon faktè ki pi piti, ki pral vle di Linux pral kole paj sal nan background nan.

Ou bezwen mete valè a vm.dirty_background_bytes depann sou vitès kondwi ou a.

Pa gen okenn valè "bon" pou de paramèt sa yo paske tou de depann sou pyès ki nan konpitè. Sepandan, mete vm.dirty_background_ratio a 5 ak vm.dirty_background_bytes a 25% nan vitès disk amelyore pèfòmans nan ~25% nan pifò ka yo.

vm.dirty_ratio/dirty_bytes

Sa a se menm jan ak vm.dirty_background_ratio/dirty_background_bytes, eksepte ke reset la fèt nan yon sesyon travayè, bloke aplikasyon an. Se poutèt sa vm.dirty_ratio ta dwe pi wo pase vm.dirty_background_ratio. Sa asire ke pwosesis background kòmanse pi bonè pou evite bloke aplikasyon an otank posib. Ou ka ajiste diferans ki genyen ant de rapò sa yo depann sou chaj la I/O ki gen kapasite.

Total

Ou ka ajiste lòt paramèt pou amelyore pèfòmans, men amelyorasyon yo pral minim epi ou pa pral wè anpil benefis. Nou dwe sonje ke se pa tout opsyon ki aplike nan tout kalite aplikasyon yo. Gen kèk aplikasyon ki travay pi byen lè nou ajiste kèk paramèt, epi kèk pa fè sa. Ou dwe jwenn bon balans ant konfigirasyon paramèt sa yo pou kantite travay ou espere ak kalite aplikasyon an, epi ou dwe konsidere tou konpòtman OS lè réglage. Konfigirasyon paramèt nwayo se pa fasil tankou konfigirasyon paramèt baz done; li pi difisil pou fè rekòmandasyon.

Sous: www.habr.com

Add nouvo kòmantè