Dejinta Xulashada Kernel Linux si loo hagaajiyo PostgreSQL

Dejinta Xulashada Kernel Linux si loo hagaajiyo PostgreSQL Waxqabadka ugu Fiican PostgreSQL wuxuu ku xiran yahay cabbirrada nidaamka qalliinka ee sida saxda ah loo qeexay. Nidaamyada kernel-ka OS ee si liidata loo habeeyey waxay keeni kartaa hawl-qabad server-ka xogta oo liita. Sidaa darteed, waa lama huraan in goobahan loo habeeyey si waafaqsan server-ka xogta iyo culayska shaqada. Maqaalkan, waxaan kaga hadli doonaa qaar ka mid ah xuduudaha muhiimka ah ee Linux kernel kuwaas oo saameyn kara waxqabadka server-ka xogta iyo sida loo habeeyo.

SHMMAX / SHMALL

SHMMAX waa halbeegga kernel ee loo isticmaalo in lagu go'aamiyo cabbirka ugu badan ee hal qayb oo xusuusta la wadaago oo habka Linux u qoondayn karo. Kahor nooca 9.2, PostgreSQL waxay isticmaashay System V (SysV), kaas oo u baahan dejinta SHMMAX. Kadib 9.2, PostgreSQL waxay u wareegtay POSIX xusuusta la wadaago. Markaa hadda waxa loo baahan yahay bytes ka yar ee nidaamka V la wadaago.

Kahor nooca 9.3, SHMMAX wuxuu ahaa halbeegga ugu muhiimsan ee kernel. Qiimaha SHMMAX waxaa lagu qeexay bytes.

Sidoo kale SHMALL waa halbeeg kale oo kernel loo isticmaalo si loo go'aamiyo
mugga nidaamka-ballaaran ee bogagga xusuusta la wadaago. Si aad u aragto SHMMAX, SHMALL, ama qiyamka SHMMIN, isticmaal amarka ipcs.

SHM* Faahfaahinta - 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* Faahfaahinta - 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 waxay isticmaashaa Nidaamka V IPC si loo qoondeeyo xusuusta la wadaago. Halbeeggani waa mid ka mid ah halbeegyada kernel-ka ugu muhiimsan. Mar kasta oo aad hesho farriimaha khaladka ah ee soo socda, waxay la macno tahay inaad haysato noocii hore ee PostgreSQL oo qiimaha SHMMAX aad buu u hooseeyaa. Isticmaalayaasha waxaa laga filayaa inay hagaajiyaan oo ay kordhiyaan qiimaha iyadoo loo eegayo xusuusta la wadaago ee ay doonayaan inay isticmaalaan.

Khaladaadka qaabeynta khaldan ee suurtagalka ah

Haddii SHMMAX aan si sax ah loo habeynin, waxaa laga yaabaa inaad hesho qalad markaad isku dayeyso inaad bilowdo kutlada PostgreSQL adoo isticmaalaya amarka initdb.

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

Sidoo kale, waxaa laga yaabaa inaad hesho qalad markaad bilaabayso server-ka PostgreSQL adoo isticmaalaya amarka pg_ctl.

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

Fahamka kala duwanaanshaha qeexitaannada

Qeexida halbeegyada SHMMAX/SHMALL ayaa waxyar ka duwan Linux iyo MacOS X:

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

kooxda sysctl waxaa loo isticmaali karaa in si ku meel gaar ah loo beddelo qiimaha. Si aad u dejiso qiimayaal joogto ah, ku dar gelid /etc/sysctl.conf. Faahfaahinta halkan hoose ka daawo

Beddelka Kernel Settings ee 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

Beddelida Halbeegyada Kernel ee 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

Ha iloobinSi aad isbeddel joogto ah u samayso, ku dar qiimayaashan /etc/sysctl.conf

Bogag waaweyn

Linux waxay isticmaashaa 4 KB xusuusta bogag si caadi ah, BSD waxay isticmaashaa XNUMX KB xusuusta. Super Pages, iyo Windows- Bogag waaweyn. Boggu waa qayb RAM ah oo loo qoondeeyay habsocod Nidaamku wuxuu yeelan karaa bogag badan iyadoo ku xiran shuruudaha xusuusta. Markasta oo ay sii bataan xusuusta geeddi-socodku u baahan yahay, baa bogag badan ayaa loo qoondeeyey. OS-gu waxa uu hayaa shaxda qoondaynta bogga habsocodka. Inta yar ee cabbirka bogga, miisku wuu weynaadaa, way dheeraanaysaa in bog laga helo shaxda boggaas. Bogagga waaweyn ayaa sidaas darteed u oggolaanaya xaddi badan oo xusuusta ah in la isticmaalo iyada oo la dhimay; Aragtida bogag ka yar, khaladaadka bogga oo yar, dhaqsaha badan u akhri/qorista hawlgallada kor u qaadaya kaydinta waaweyn. Natiijadu waa waxqabad la wanaajiyey.

PostgreSQL kaliya waxay taageertaa bogag waaweyn Linux. Sida caadiga ah, Linux waxay isticmaashaa 4 KB bogag xusuusta ah, markaa xaaladaha ay jiraan hawlo badan oo xusuusta ah, waxaa lagama maarmaan ah in la dejiyo bogag waaweyn. Horumarka waxqabadka waxaa la arkaa marka la isticmaalayo bogag waaweyn oo 2 MB ah iyo ilaa 1 GB. Cabbirka bogga weyn waxa la dejin karaa wakhtiga bootinta. Waxaad si fudud u hubin kartaa xuduudaha bogga weyn iyo isticmaalkooda mashiinka Linux adiga oo isticmaalaya amarka bisad /proc/meminfo | grep - aad u weyn.

Helitaanka macluumaadka ku saabsan bogag waaweyn (Linux kaliya)

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

Tusaalahan, inkasta oo cabbirka weyn ee bogga lagu dejiyay 2048 (2 MB), wadarta tirada boggaga waaweyn ayaa loo dejiyay 0. Tani waxay ka dhigan tahay in bogag waaweyni ay naafo yihiin.

Qoraal si loo go'aamiyo tirada bogag waaweyn

Qoraalkan fudud wuxuu soo celinayaa tirada loo baahan yahay ee bogag waaweyn. Ku socodsii qoraalka serverkaaga Linux inta PostgreSQL uu socdo. Hubi in doorsoomaha deegaanka $PGDATA Hagaha xogta PostgreSQL waa la cayimay.

Helitaanka tirada boggaga waaweyn ee loo baahan yahay

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

Soo saarista qoraalku waxay u egtahay sidan:

Soo saarista qoraalka

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

Qiimaha lagu taliyey ee bogagga waaweyn waa 88, markaa waa inaad ka dhigtaa 88.

Rakibaadda Bogag Waaweyn

sysctl -w vm.nr_hugepages=88

Hubi bogag waaweyn hadda, waxaad arki doontaa inaan bogag waaweyn la isticmaalin (HugePages_Free = HugePages_Total).

Bogag waaweyn ayaa dib loo eegay (Linux Kaliya)

$ 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

Hadda dhig cabbirka weyn_boggaga "on" gudaha $PGDATA/postgresql.conf oo dib u billow serfarka.

Mar labaad, macluumaadka ku saabsan boggaga waaweyn (Linux kaliya)

$ 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

Hadda waxaad arki kartaa in bogag aad u yar la isticmaalo. Aynu hadda isku dayno inaan xog ku darno kaydka xogta.

Qaar ka mid ah hawlgallada kaydka si dib loogu warshadeeyo bogag waaweyn

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

Aan aragno haddii aan isticmaaleyno bogag ka badan sidii hore.

Macluumaad dheeraad ah oo ku saabsan bogag waaweyn (Linux kaliya)

$ 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

Hadda waxaad arki kartaa in inta badan bogagga waaweyn la isticmaalo.

Fiiro gaar ah: Qiimaha lagu qiyaasay ee HugePages ee halkan lagu isticmaalo aad ayuu u hooseeyaa, taas oo aan ahayn qiimaha caadiga ah ee mishiinka ku shaqeeya deegaanka alaabta. Fadlan qiyaas tirada boggaga loo baahan yahay ee nidaamkaaga oo u deji si waafaqsan culeyska iyo agabka.

vm. isdhaafsi

vm. isdhaafsi waa halbeeg kale oo kernel ah oo saameyn kara waxqabadka xogta. Doorashadan waxa loo istcmaalay in lagu xakameeyo hab-dhaqanka is beddelka (bogag beddelashada iyo xusuusta ka baxsan) Linux. Qiimuhu waxa uu u dhexeeyaa 0 ilaa 100. Waxa ay go'aaminaysaa inta xusuusta la bogagi doono ama laga saari doono. Eber macnaheedu waa beddelaad la'aan iyo 100 macnaheedu waa sarifka gardarrada.

Waxaad ku heli kartaa waxqabad wanaagsan adiga oo dejinaya qiimayaal hoose.

Dejinta tan 0 ee kernels cusub waxay keeni kartaa OOM Killer (Nidaamka nadiifinta xusuusta Linux) inuu dilo habka. Markaa waa badbaado inaad ka dhigto 1 haddii aad rabto inaad yarayso isdhaafsiga. Qiimaha caadiga ah ee Linux waa 60. Qiimaha sare wuxuu keenaa MMU (cutubka maaraynta xusuusta) inuu isticmaalo boos isku beddelasho ka badan RAM, halka qiimaha hoose uu xafido xog/code badan oo xusuusta ah.

Qiimaha hoose waa sharad wanaagsan oo loogu talagalay waxqabadka horumaray ee PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Codsiyada waxay helayaan xusuusta waxayna sii daayaan marka aan loo baahnayn. Laakiin xaaladaha qaarkood, codsigu wuxuu helayaa xusuusta aad u badan mana sii daayo. Tani waxay keeni kartaa dilaa OOM. Waa kuwan qiyamka cabbirka ee suurtogalka ah vm. overcommit_xusuus oo leh sharraxaad mid kasta:

  1. Heuristic overcommit (default); heuristic ku salaysan kernel
  2. U ogolow in aad ka gudubto si kastaba
  3. Ha badin, ha dhaafin saamiga xad dhaafka ah.

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

vm. overcommit_ ratio - boqolkiiba RAM diyaar u ah culeyska xad dhaafka ah. Qiimaha 50% ee nidaamka leh 2 GB ee RAM wuxuu u qoondayn karaa ilaa 3 GB ee RAM.

Qiimaha 2 ee vm.overcommit_memory wuxuu bixiyaa waxqabad wanaagsan PostgreSQL. Qiimahani waxa uu kor u qaadayaa isticmaalka RAM ee habka serverka iyada oo aanay jirin khatar la taaban karo oo ah in lagu dilo habka dilaaga OOM. Codsiga wuxuu awoodi doonaa inuu dib u soo dejiyo, laakiin kaliya xadka xad dhaafka ah, kaas oo yareynaya halista dilaaga OOM inuu dilo nidaamka. Sidaa darteed, qiimaha 2 wuxuu bixiyaa waxqabad ka wanaagsan qiimaha caadiga ah ee 0. Si kastaba ha ahaatee, isku halaynta ayaa lagu wanaajin karaa iyada oo la hubinayo in xusuusta ka baxsan aan la buuxin. Tani waxay meesha ka saaraysaa khatarta ah in nidaamka uu dilo dilaa OOM.

Nidaamyada iyada oo aan la isweydaarsaneyn, dhibaato vm.overcommit_memory oo u dhiganta 2 ayaa dhici karta.

https://www.postgresql.org/docs/current/static/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT

vm.dirty_background_ratio / vm.dirty_background_bytes

vm. wasakh_background_ ratio waa boqolleyda xusuusta ka buuxa bogag wasakh ah oo u baahan in lagu qoro saxanka. Ku shubista saxanka waxay ku dhacdaa gadaasha. Qiimaha halbeeggani wuxuu u dhexeeyaa 0 ilaa 100; si kastaba ha ahaatee, qiimaha ka hooseeya 5 wuxuu noqon karaa mid aan waxtar lahayn oo qaar ka mid ah kernels ma taageeraan. 10 ayaa ah kuwa ugu habboon nidaamyada Linux. Waxaad ku wanaajin kartaa waxqabadka qorista-degdegga ah qodob ka yar, taas oo macnaheedu yahay Linux inay gadaal ka daadin doonto boggaga wasakhaysan.

Waxaad u baahan tahay inaad dejiso qiimaha vm. wasakh_background_bytes iyada oo ku xidhan xawaaraha wadwayntaada.

Ma jiraan qiyam "wanaagsan" oo loogu talagalay labadan xuduudood sababtoo ah labaduba waxay ku xiran yihiin qalabka. Si kastaba ha ahaatee, dejinta vm.dirty_background_ratio ilaa 5 iyo vm.dirty_background_bytes ilaa 25% xawaaraha saxanka waxa ay wanaajisaa waxqabadka ilaa ~25% inta badan.

vm. wasakh_ratio/ wasakh_bytes

Tani waa isku mid sida vm.dirty_background_ratio/dirty_background_bytes, marka laga reebo in dib-u-habaynta lagu sameeyo fadhiga shaqaalaha, xannibaya codsiga. Sidaa darteed vm.dirty_ratio waa in uu ka sarreeyaa vm. wasakh_background_ ratio. Tani waxay hubinaysaa in hababka asalka ahi ay hore u bilaabmaan si looga fogaado xannibaadda codsiga intii suurtagal ah. Waxaad hagaajin kartaa farqiga u dhexeeya labadan saami iyadoo ku xiran culeyska I/O diskka.

Natiijada

Waxaad hagaajin kartaa goobaha kale si aad u horumariso waxqabadka, laakiin hagaajintu waxay ahaan doontaa mid aad u yar mana arki doontid faa'iido badan. Waa inaan xasuusannaa in dhammaan xulashooyinka aysan khuseyn dhammaan noocyada codsiyada. Qaar ka mid ah apps-yada ayaa si fiican u shaqeeya marka aan hagaajinno dejimaha qaarkood, qaarna ma shaqeeyaan. Waa inaad heshaa dheelitirka saxda ah ee u dhexeeya habaynta goobahan culayska shaqada ee laga filayo iyo nooca codsiga, waana inaad sidoo kale tixgelisaa habdhaqanka OS markaad hagaajinayso. Habaynta xuduudaha kernel-ka maaha mid fudud sida habaynta xuduudaha xogta; way adagtahay in la sameeyo talooyinka.

Source: www.habr.com

Add a comment