Pag-tune sa Linux Kernel Options aron Ma-optimize ang PostgreSQL

Pag-tune sa Linux Kernel Options aron Ma-optimize ang PostgreSQL Ang labing maayo nga pasundayag sa PostgreSQL nagdepende sa husto nga gihubit nga mga parameter sa operating system. Ang dili maayo nga pag-configure sa OS kernel settings mahimong moresulta sa dili maayo nga performance sa database server. Busa, gikinahanglan nga kini nga mga setting gi-configure sumala sa database server ug sa workload niini. Niini nga post, atong hisgutan ang pipila ka importante nga mga parameter sa kernel sa Linux nga makaapekto sa performance sa database server ug unsaon kini pag-configure.

SHMMAX / SHMALL

SHMMAX mao ang usa ka kernel parameter nga gigamit sa pagtino sa pinakataas nga gidak-on sa usa ka gibahin nga bahin sa memorya nga ang usa ka proseso sa Linux magahin. Sa wala pa ang bersyon 9.2, PostgreSQL migamit sa System V (SysV), nga nagkinahanglan sa SHMMAX setting. Human sa 9.2, ang PostgreSQL mibalhin ngadto sa POSIX shared memory. Busa karon mas gamay nga bytes sa System V shared memory ang gikinahanglan.

Sa wala pa ang bersyon 9.3, ang SHMMAX mao ang labing hinungdanon nga parameter sa kernel. Ang kantidad sa SHMMAX gipiho sa mga byte.

Ingon usab SHMALL mao ang laing kernel parameter nga gigamit sa pagtino
sa tibuok sistema nga gidaghanon sa gipaambit nga mga panid sa panumduman. Para tan-awon ang kasamtangang SHMMAX, SHMALL, o SHMMIN nga mga bili, gamita ang command ipcs.

Mga Detalye sa 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

Mga Detalye sa 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)

Paggamit sa PostgreSQL Sistema V IPC sa paggahin og shared memory. Kini nga parameter usa sa labing hinungdanon nga mga parameter sa kernel. Sa matag higayon nga makadawat ka sa mosunod nga mga mensahe sa sayop, kini nagpasabot nga ikaw adunay mas daan nga bersyon sa PostgreSQL ug ang imong SHMMAX nga bili ubos kaayo. Ang mga tiggamit gilauman nga mag-adjust ug magpataas sa kantidad sumala sa gipaambit nga panumduman nga ilang gitinguha nga gamiton.

Posible nga sayop nga pag-configure nga mga sayup

Kung ang SHMMAX dili husto nga pag-configure, mahimo ka makadawat usa ka sayup sa pagsulay sa pagsugod sa usa ka cluster sa PostgreSQL gamit ang mando initdb.

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

Ingon usab, mahimo ka makadawat usa ka sayup sa pagsugod sa PostgreSQL server gamit ang mando pg_ctl.

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

Pagsabot sa mga kalainan sa mga kahulugan

Ang pagpasabot sa mga parametro sa SHMMAX/SHMALL gamay rag kalainan sa Linux ug MacOS X:

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

team sysctl mahimong gamiton sa temporaryo nga pag-usab sa bili. Aron mabutang ang kanunay nga mga kantidad, pagdugang usa ka entry sa /etc/sysctl.conf. Ang mga detalye anaa sa ubos.

Pag-usab sa Mga Setting sa Kernel sa 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

Pag-usab sa Kernel Parameter sa 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

Ayaw kalimti: Aron mahimong permanente ang mga pagbag-o, idugang kini nga mga kantidad sa /etc/sysctl.conf

Daghang Panid

Ang Linux naggamit sa 4 KB nga mga panid sa panumduman sa default, ang BSD naggamit sa XNUMX KB nga mga panid sa panumduman. Mga Super Panid, ug sa Windows - Dagkong Panid. Ang usa ka panid usa ka piraso sa RAM nga gigahin sa usa ka proseso. Ang usa ka proseso mahimong adunay daghang mga panid depende sa mga kinahanglanon sa memorya. Ang dugang nga memorya nga gikinahanglan sa usa ka proseso, mas daghang mga panid ang gigahin niini. Ang OS nagmintinar sa usa ka talaan sa alokasyon sa panid alang sa mga proseso. Kon mas gamay ang gidak-on sa panid, mas dako ang lamesa, mas dugay nga makit-an ang usa ka panid sa maong panid nga lamesa. Busa ang dagkong mga panid motugot sa dagkong kantidad sa memorya nga gamiton uban ang pagkunhod sa overhead; mas gamay nga page view, mas gamay nga page faults, mas paspas nga read/write operations sa mas dagkong buffers. Ang resulta mao ang mas maayo nga performance.

Ang PostgreSQL nagsuporta lamang sa dagkong mga panid sa Linux. Sa kasagaran, ang Linux naggamit sa 4 KB nga mga panid sa panumduman, mao nga sa mga kaso diin adunay daghan kaayo nga mga operasyon sa panumduman, gikinahanglan nga magbutang og mas dagkong mga panid. Ang mga kadaugan sa pasundayag maobserbahan kung mogamit ug dagkong mga panid nga 2 MB ug hangtod sa 1 GB. Ang dako nga gidak-on sa panid mahimong itakda sa oras sa pag-boot. Dali nimo masusi ang dagkong mga parameter sa panid ug ang ilang paggamit sa imong Linux machine gamit ang command iring /proc/meminfo | grep -i dako.

Pagkuha og impormasyon bahin sa dagkong mga panid (Linux lang)

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

Niini nga pananglitan, bisan tuod ang dako nga gidak-on sa panid gitakda sa 2048 (2 MB), ang kinatibuk-ang gidaghanon sa dagkong mga panid gitakda sa 0. Kini nagpasabot nga ang dagkong mga panid gibabagan.

Script alang sa pagtino sa gidaghanon sa dagkong mga panid

Kining yano nga script nagbalik sa gikinahanglan nga gidaghanon sa dagkong mga panid. Pagdalagan ang script sa imong server sa Linux samtang nagdagan ang PostgreSQL. Siguruha nga alang sa variable sa palibot $PGDATA Gitakda ang direktoryo sa datos sa PostgreSQL.

Pagkuha sa gidaghanon sa gikinahanglan nga dagkong mga panid

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

Ang output sa script ingon niini:

Output sa script

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

Ang girekomendar nga kantidad alang sa dagkong mga panid mao ang 88, busa kinahanglan nimo nga ibutang kini sa 88.

Pag-instalar sa Dagkong Panid

sysctl -w vm.nr_hugepages=88

Susiha ang dagkong mga panid karon, imong makita nga ang dagkong mga panid wala gigamit (HugePages_Free = HugePages_Total).

Dagkong Mga Panid Gibalik-balik (Linux Lamang)

$ 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

Karon ibutang ang huge_pages parameter sa "on" sa $PGDATA/postgresql.conf ug i-restart ang server.

Sa makausa pa, impormasyon bahin sa dagkong mga panid (Linux lang)

$ 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

Karon imong makita nga gamay ra kaayo nga dagkong mga panid ang gigamit. Atong sulayan karon ang pagdugang sa pipila ka datos sa database.

Ang ubang mga operasyon sa database aron ma-recycle ang dagkong mga panid

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

Atong tan-awon kon kita naggamit ug mas dagkong mga panid karon kaysa kaniadto.

Dugang impormasyon sa dagkong mga panid (Linux lang)

$ 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

Karon imong makita nga kadaghanan sa dagkong mga panid gigamit.

Mubo nga sulat: Ang gibanabana nga kantidad alang sa HugePages nga gigamit dinhi ubos kaayo, nga dili normal nga kantidad alang sa usa ka makina nga nagpadagan sa usa ka palibot sa produkto. Palihog banabanaa ang gikinahanglang gidaghanon sa mga panid para sa imong sistema ug itakda kini sumala sa karga ug mga kapanguhaan.

vm.swappiness

vm.swappiness mao ang laing kernel parameter nga makaapekto sa database performance. Kini nga opsyon gigamit sa pagkontrolar sa kinaiya sa swappiness (pagbayloay sa mga panid sulod ug gawas sa memorya) sa Linux. Ang kantidad gikan sa 0 hangtod 100. Kini nagtino kung pila ang memorya nga paged o paged out. Ang zero nagpasabot nga walay exchange ug ang 100 nagpasabot nga agresibo nga pagbayloay.

Makuha nimo ang maayo nga performance pinaagi sa pagtakda og mas ubos nga mga kantidad.

Ang pagbutang niini sa 0 sa mas bag-ong mga kernel mahimong hinungdan sa OOM Killer (proseso sa paglimpyo sa memorya sa Linux) sa pagpatay sa proseso. Mao nga luwas nga ibutang kini sa 1 kung gusto nimo nga maminusan ang pagbayloay. Ang default nga bili sa Linux mao ang 60. Ang mas taas nga bili maoy hinungdan nga ang MMU (memory management unit) mogamit ug mas daghang swap space kay sa RAM, samtang ang mas ubos nga kantidad magtipig ug dugang data/code sa memorya.

Ang mas mubu nga kantidad usa ka maayong pusta para sa gipaayo nga pasundayag sa PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Ang mga aplikasyon makakuha og memorya ug buhian kini kung dili na kini gikinahanglan. Apan sa pipila ka mga kaso, ang aplikasyon makakuha og daghang memorya ug dili kini buhian. Kini mahimong hinungdan sa usa ka OOM killer. Ania ang posible nga mga kantidad sa parameter vm.overcommit_memory nga adunay usa ka paghulagway sa matag usa:

  1. Heuristic overcommit (default); heuristic nga nakabase sa kernel
  2. Tugoti nga mag-overcommit gihapon
  3. Ayaw pagpasobra niini, ayaw pagsobra sa overcommit ratio.

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

vm.overcommit_ratio - porsyento sa RAM nga magamit alang sa sobra nga karga. Ang kantidad nga 50% sa usa ka sistema nga adunay 2 GB nga RAM mahimong maggahin hangtod sa 3 GB nga RAM.

Ang bili nga 2 para sa vm.overcommit_memory naghatag ug mas maayong performance para sa PostgreSQL. Kini nga kantidad nagpadako sa paggamit sa RAM sa proseso sa server nga wala’y hinungdan nga peligro nga mapatay sa proseso sa pagpatay sa OOM. Ang aplikasyon makahimo sa pag-reload, apan sulod lamang sa mga limitasyon sa overrun, nga makapamenos sa risgo sa usa ka OOM killer nga makapatay sa proseso. Busa, ang usa ka bili sa 2 naghatag og mas maayo nga performance kay sa default nga bili sa 0. Bisan pa, ang pagkakasaligan mahimong mapauswag pinaagi sa pagsiguro nga ang out-of-range nga memorya dili ma-overload. Kini nagwagtang sa risgo sa proseso nga gipatay sa usa ka OOM killer.

Sa mga sistema nga walay swapping, mahimong mahitabo ang problema sa vm.overcommit_memory nga katumbas sa 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 mao ang porsyento sa memorya nga napuno sa hugaw nga mga panid nga kinahanglan isulat sa disk. Ang flush sa disk mahitabo sa background. Ang bili niini nga parametro gikan sa 0 ngadto sa 100; bisan pa, ang usa ka kantidad nga ubos sa 5 mahimong dili epektibo ug ang pipila ka mga kernel dili mosuporta niini. 10 mao ang default sa kadaghanan sa mga sistema sa Linux. Mahimo nimong mapauswag ang pasundayag alang sa mga operasyon nga kusog sa pagsulat pinaagi sa usa ka gamay nga hinungdan, nga nagpasabut nga ang Linux mag-flush sa hugaw nga mga panid sa background.

Kinahanglan nimo nga ibutang ang bili vm.dirty_background_bytes depende sa speed sa imong drive.

Walay "maayo" nga mga bili alang niining duha ka mga parameter tungod kay ang duha nagsalig sa hardware. Apan, ang pagbutang sa vm.dirty_background_ratio ngadto sa 5 ug vm.dirty_background_bytes ngadto sa 25% sa disk speed makapauswag sa performance ngadto sa ~25% sa kadaghanang mga kaso.

vm.dirty_ratio/dirty_bytes

Kini mao ang sama sa vm.dirty_background_ratio/dirty_background_bytes, gawas nga ang pag-reset gihimo sa usa ka sesyon sa trabahante, nga gibabagan ang aplikasyon. Busa vm.dirty_ratio kinahanglan nga mas taas pa kay sa vm.dirty_background_ratio. Gisiguro niini nga ang mga proseso sa background magsugod sa sayo pa aron malikayan ang pagbabag sa aplikasyon kutob sa mahimo. Mahimo nimong i-adjust ang kalainan tali niining duha ka ratios depende sa disk I/O load.

Ang resulta

Mahimo nimong i-tweak ang ubang mga setting aron mapauswag ang pasundayag, apan ang mga pag-uswag gamay ra ug dili ka makakita og daghang kaayohan. Kinahanglan natong hinumdoman nga dili tanang opsyon magamit sa tanang matang sa aplikasyon. Ang ubang mga app mas mogana kon atong i-adjust ang pipila ka mga setting, ug ang uban dili. Kinahanglan nimo nga makit-an ang husto nga balanse tali sa pag-configure niini nga mga setting alang sa imong gipaabut nga workload ug tipo sa aplikasyon, ug kinahanglan nimo usab nga tagdon ang pamatasan sa OS kung mag-tune. Ang pag-configure sa mga parameter sa kernel dili ingon kadali sa pag-configure sa mga parameter sa database; mas lisud ang paghimo og mga rekomendasyon.

Source: www.habr.com

Idugang sa usa ka comment