Fanamboarana Linux Kernel Options hanatsarana ny PostgreSQL

Fanamboarana Linux Kernel Options hanatsarana ny PostgreSQL Ny fahombiazan'ny PostgreSQL tsara indrindra dia miankina amin'ny mari-pamantarana rafitra fiasa voafaritra tsara. Ny firafitry ny kernel OS tsy voalamina tsara dia mety hiteraka tsy fahombiazan'ny mpizara database. Noho izany dia tsy maintsy amboarina araka ny lohamilina database sy ny enta-mavesany ireo fandrindrana ireo. Ato amin'ity lahatsoratra ity dia hiresaka momba ireo mari-pamantarana kernel Linux manan-danja izay mety hisy fiantraikany amin'ny fahombiazan'ny server database sy ny fomba fanamboarana azy ireo.

SHMMAX / SHMALL

SHMMAX dia mari-pamantarana kernel ampiasaina hamaritana ny habe ambony indrindra amin'ny fizarana fahatsiarovana iombonana tokana azon'ny fizotran'ny Linux iray. Talohan'ny version 9.2, PostgreSQL dia nampiasa System V (SysV), izay mitaky ny SHMMAX. Taorian'ny 9.2, PostgreSQL dia nivadika ho fahatsiarovana iombonana POSIX. Noho izany dia vitsy kokoa ny bita amin'ny fitadidiana iombonana System V no ilaina.

Talohan'ny dikan-9.3, SHMMAX no mari-pamantarana kernel manan-danja indrindra. Ny sanda SHMMAX dia voafaritra amin'ny bytes.

Toy izany koa SHMALL dia parameter kernel iray hafa ampiasaina hamaritana
ny habetsahan'ny pejy fitadidiana zaraina manerana ny rafitra. Raha hijery ny soatoavina SHMMAX, SHMALL, na SHMMIN amin'izao fotoana izao dia ampiasao ny baiko ipcs.

SHM* Details - 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* Details - 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)

Mampiasa ny PostgreSQL Rafitra V IPC hanokana fahatsiarovana iombonana. Ity parameter ity dia iray amin'ireo masontsivana kernel manan-danja indrindra. Isaky ny mahazo ireto hafatra diso manaraka ireto ianao dia midika izany fa manana dikan-teny taloha amin'ny PostgreSQL ianao ary ambany dia ambany ny sandan'ny SHMMAX anao. Ny mpampiasa dia andrasana hanitsy sy hampitombo ny sandany araka ny fahatsiarovana iombonana kasainy hampiasaina.

Fahadisoana mety ho diso konfigurasi

Raha tsy voarindra tsara ny SHMMAX dia mety hahazo hadisoana ianao rehefa manandrana manangana cluster PostgreSQL mampiasa ny baiko. initdb.

initdb tsy fahombiazana
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

Toy izany koa, mety hahazo fahadisoana ianao rehefa manomboka ny mpizara PostgreSQL mampiasa ny baiko pg_ctl.

pg_ctl tsy fahombiazana
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.

Fahatakarana ny fahasamihafana eo amin'ny famaritana

Ny famaritana ny masontsivana SHMMAX/SHMALL dia hafa kely amin'ny Linux sy MacOS X:

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

ekipa sysctl azo ampiasaina hanovana vonjimaika ny sandany. Mba hametrahana sanda tsy miova, ampio ny fidirana amin'ny /etc/sysctl.conf. Ny antsipiriany dia eto ambany.

Manova ny fandrindrana Kernel amin'ny 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

Fanovana ny parametres Kernel amin'ny 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

Aza hadino: Mba hanaovana fanovana maharitra, ampio ireto soatoavina ireto amin'ny /etc/sysctl.conf

Pejy lehibe

Linux dia mampiasa pejy fitadidiana 4 KB raha default, BSD mampiasa pejy fitadidiana XNUMX KB. Pejy Super, ary amin'ny Windows - Pejy lehibe. Ny pejy dia ampahany amin'ny RAM natokana ho an'ny dingana iray. Mety manana pejy maromaro ny dingana iray arakaraka ny fitadidiana fitadidiana. Arakaraky ny fitadidiana ilain'ny dingana iray no atokana ho azy. Ny OS dia mitazona latabatra fizarana pejy ho an'ny dingana. Arakaraka ny kely kokoa ny haben'ny pejy, ny lehibe kokoa ny latabatra, ny ela kokoa ny hitadiavana pejy iray ao amin'io latabatra pejy io. Ny pejy lehibe noho izany dia mamela fahatsiarovana be dia be hampiasaina amin'ny vidiny ambany kokoa; Vitsy kokoa ny fijerin'ny pejy, vitsy ny lesoka amin'ny pejy, haingana kokoa ny famakiana/manoratra amin'ny buffer lehibe kokoa. Ny vokatra dia fanatsarana fampisehoana.

Tsy manohana pejy lehibe amin'ny Linux ihany ny PostgreSQL. Amin'ny alΓ lan'ny default, Linux dia mampiasa pejy fitadidiana 4 KB, ka amin'ny tranga izay misy hetsika fitadidiana be loatra dia ilaina ny mametraka pejy lehibe kokoa. Voamarika ny tombony amin'ny fampisehoana rehefa mampiasa pejy lehibe 2 MB ary hatramin'ny 1 GB. Ny haben'ny pejy lehibe dia azo apetraka amin'ny fotoana boot. Azonao atao ny manamarina mora foana ny masontsivana pejy lehibe sy ny fampiasana azy amin'ny milina Linux anao amin'ny alΓ lan'ny baiko cat /proc/meminfo | grep -i lehibe.

Mahazoa fampahalalana momba ny pejy lehibe (Linux ihany)

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

Amin'ity ohatra ity, na dia apetraka amin'ny 2048 (2 MB) aza ny haben'ny pejy lehibe, dia apetraka amin'ny 0 ny fitambaran'ny pejy lehibe. Midika izany fa tapaka ny pejy lehibe.

Skripta hamaritana ny isan'ny pejy lehibe

Ity script tsotra ity dia mamerina ny isan'ny pejy lehibe ilaina. Alefaso amin'ny mpizara Linux anao ny script raha mandeha ny PostgreSQL. Ataovy azo antoka fa ho an'ny fari-piainan'ny tontolo iainana $PGDATA Ny lahatahiry data PostgreSQL dia voafaritra.

Mahazo ny isan'ny pejy lehibe ilaina

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

Ny output script dia toy izao:

Output script

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

Ny sanda atolotra ho an'ny pejy lehibe dia 88, ka tokony apetrakao amin'ny 88 izany.

Fametrahana pejy lehibe

sysctl -w vm.nr_hugepages=88

Jereo ny pejy lehibe izao, ho hitanao fa tsy ampiasaina ny pejy lehibe (HugePages_Free = HugePages_Total).

Pejy lehibe nojerena (Linux ihany)

$ 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

Apetraho amin'ny "on" ao amin'ny $PGDATA/postgresql.conf ny parameter huge_pages ary avereno indray ny mpizara.

Indray mandeha, fampahalalana momba ny pejy lehibe (Linux ihany)

$ 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

Hitanao izao fa vitsy dia vitsy ny pejy lehibe ampiasaina. Andeha isika izao hanandrana hampiditra angona sasany amin'ny angon-drakitra.

Hetsika sasany amin'ny angon-drakitra hanodinana pejy lehibe

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

Andeha hojerentsika raha mampiasa pejy lehibe kokoa isika ankehitriny noho ny teo aloha.

Fanazavana bebe kokoa momba ny pejy lehibe (Linux ihany)

$ 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

Hitanao izao fa ny ankamaroan'ny pejy lehibe dia ampiasaina.

Fanamarihana: Ny sanda tombanana ho an'ny HugePages ampiasaina eto dia ambany dia ambany, izay tsy sanda ara-dalΓ na ho an'ny milina iray miasa tontolo iainana vokatra. Tombano azafady ny isan'ny pejy ilaina ho an'ny rafitrao ary apetraho mifanaraka amin'ny entana sy loharano.

vm.swappiness

vm.swappiness dia parameter kernel iray hafa izay mety hisy fiantraikany amin'ny fahombiazan'ny database. Ity safidy ity dia ampiasaina mba hifehezana ny fihetsiky ny swappiness (famadihana pejy ao anaty sy ivelan'ny fahatsiarovana) amin'ny Linux. Manomboka amin'ny 0 ka hatramin'ny 100 ny sanda. Ny aotra dia midika hoe tsy misy fifanakalozana ary ny 100 dia midika hoe fifanakalozana mahery vaika.

Afaka mahazo fampisehoana tsara ianao amin'ny fametrahana sanda ambany kokoa.

Ny fametrahana izany ho 0 amin'ny kernel vaovao dia mety hahatonga ny OOM Killer (ny fomba fanadiovana fahatsiarovana an'ny Linux) hamono ny dingana. Noho izany dia azo antoka ny mametraka azy amin'ny 1 raha te hanamaivana ny fifandimbiasana ianao. Ny sandan'ny default amin'ny Linux dia 60. Ny sanda ambony kokoa dia mahatonga ny MMU (fikambanan'ny fitadidiana fitadidiana) hampiasa habaka swap bebe kokoa noho ny RAM, fa ny sanda ambany kokoa kosa dia mitazona angona/kaody bebe kokoa ao anaty fitadidiana.

Ny sanda ambany dia filokana tsara ho an'ny fanatsarana ny fahombiazan'ny PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Ny fampiharana dia mahazo fitadidiana ary mamoaka izany rehefa tsy ilaina intsony. Saingy amin'ny toe-javatra sasany, ny fampiharana dia mahazo fitadidiana be loatra ary tsy mamoaka azy. Mety hiteraka famonoana OOM izany. Ireto ny sandan'ny paramètre mety vm.overcommit_memory misy famaritana ho an'ny tsirairay:

  1. Heuristic overcommit (default); heuristic mifototra amin'ny kernel
  2. Avelao ny fanoloran-tena tafahoatra na izany aza
  3. Aza be loatra, aza mihoatra ny tahan'ny overcommit.

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

vm.overcommit_ratio - isan-jaton'ny RAM azo ampiasaina amin'ny entana be loatra. Ny sandan'ny 50% amin'ny rafitra misy RAM 2 GB dia afaka mizara hatramin'ny 3 GB RAM.

Ny sanda 2 ho an'ny vm.overcommit_memory dia manome fampisehoana tsara kokoa ho an'ny PostgreSQL. Io sanda io dia mampitombo ny fampiasana RAM amin'ny fizotry ny mpizara nefa tsy misy atahorana ho faty noho ny fizotry ny famonoana OOM. Ny fampiharana dia afaka mamerina indray, fa ao anatin'ny fetran'ny fihoaram-pefy ihany, izay mampihena ny mety hisian'ny mpamono OOM hamono ny dingana. Noho izany, ny sandan'ny 2 dia manome fampisehoana tsara kokoa noho ny sanda default amin'ny 0. Na izany aza, azo hatsaraina ny fahamendrehana amin'ny fiantohana fa tsy be loatra ny fitadidiana ivelan'ny faritra. Izany dia manafoana ny mety hisian'ny fizotry ny famonoana olona OOM.

Amin'ny rafitra tsy mifanakalo dia mety hisy olana amin'ny vm.overcommit_memory mitovy amin'ny 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 dia ny isan-jaton'ny fitadidiana feno pejy maloto izay mila soratana amin'ny kapila. Ny flush amin'ny kapila dia mitranga ao ambadika. Ny sandan'ity mari-pamantarana ity dia manomboka amin'ny 0 ka hatramin'ny 100; na izany aza, ny sanda ambany 5 dia mety tsy mahomby ary ny voany sasany dia tsy manohana izany. 10 no default amin'ny ankamaroan'ny rafitra Linux. Azonao atao ny manatsara ny fampandehanana amin'ny asa an-tsoratra amin'ny alΓ lan'ny anton-javatra kely kokoa, izay midika fa ny Linux dia hanala pejy maloto any ambadika.

Mila mametraka ny sandany ianao vm.dirty_background_bytes arakaraka ny hafainganam-pandehan'ny fiaranao.

Tsy misy sanda "tsara" ho an'ireo masontsivana roa ireo satria samy miankina amin'ny fitaovana izy ireo. Na izany aza, ny fametrahana vm.dirty_background_ratio ho 5 sy vm.dirty_background_bytes amin'ny 25% amin'ny hafainganam-pandehan'ny kapila dia manatsara ny fahombiazan'ny ~ 25% amin'ny ankamaroan'ny tranga.

vm.dirty_ratio/dirty_bytes

Io dia mitovy amin'ny vm.dirty_background_ratio/dirty_background_bytes, afa-tsy hoe ny famerenana dia atao amin'ny fotoam-pivorian'ny mpiasa, manakana ny fampiharana. Noho izany dia tokony ho ambony noho ny vm.dirty_ratio vm.dirty_background_ratio. Izany dia miantoka fa manomboka aloha kokoa ny fizotran'ny background mba hisorohana ny fanakanana ny fampiharana araka izay azo atao. Azonao atao ny manitsy ny fahasamihafana misy eo amin'ireo ratios roa ireo arakaraka ny enta-mavesatra I/O.

Ny vokany

Azonao atao ny manitsy toe-javatra hafa hanatsarana ny fampisehoana, saingy ho kely ny fanatsarana ary tsy hahita tombony betsaka ianao. Tokony hotadidintsika fa tsy ny safidy rehetra dia mihatra amin'ny karazana fampiharana rehetra. Ny fampiharana sasany dia miasa tsara kokoa rehefa manitsy ny toe-javatra sasany isika, ary ny sasany tsy mandeha. Tsy maintsy mahita ny fifandanjana mety ianao eo amin'ny fanamboarana ireo toe-javatra ireo ho an'ny enta-mavesatry ny asa sy ny karazana fampiharana, ary tsy maintsy mandinika ny fitondran-tena OS koa ianao rehefa manitsy. Tsy mora toy ny fanamboarana ny mari-pamantarana angon-drakitra ny fanamboarana ny masontsivana kernel; sarotra kokoa ny manao tolo-kevitra.

Source: www.habr.com

Add a comment