Konfigurazzjoni tal-Għażliet tal-Linux Kernel biex Jottimizza l-PostgreSQL

Konfigurazzjoni tal-Għażliet tal-Linux Kernel biex Jottimizza l-PostgreSQL Il-prestazzjoni ottimali ta' PostgreSQL tiddependi fuq parametri tas-sistema operattiva definiti b'mod korrett. Is-settings tal-kernel tal-OS konfigurati ħażin jistgħu jirriżultaw f'prestazzjoni fqira tas-server tad-database. Għalhekk, huwa imperattiv li dawn is-settings jiġu kkonfigurati skont is-server tad-database u l-ammont tax-xogħol tiegħu. F'din il-kariga, ser niddiskutu xi parametri importanti tal-kernel Linux li jistgħu jaffettwaw il-prestazzjoni tas-server tad-database u kif tikkonfigurahom.

SHMMAX / SHMALL

SHMMAX huwa parametru tal-qalba użat biex jiddetermina d-daqs massimu ta 'segment wieħed tal-memorja kondiviża li proċess Linux jista' jalloka. Qabel il-verżjoni 9.2, PostgreSQL uża Sistema V (SysV), li teħtieġ l-issettjar SHMMAX. Wara 9.2, PostgreSQL qaleb għal memorja kondiviża POSIX. Allura issa huma meħtieġa inqas bytes tal-memorja kondiviża tas-Sistema V.

Qabel il-verżjoni 9.3, SHMMAX kien l-aktar parametru importanti tal-qalba. Il-valur SHMMAX huwa speċifikat f'bytes.

Bl-istess mod, SHMALL huwa parametru tal-qalba ieħor użat biex jiġi determinat
volum tas-sistema kollha ta' paġni tal-memorja kondiviża. Biex tara l-valuri attwali SHMMAX, SHMALL, jew SHMMIN, uża l-kmand ipcs.

Dettalji 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

Dettalji 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)

PostgreSQL juża Sistema V IPC biex talloka memorja kondiviża. Dan il-parametru huwa wieħed mill-aktar parametri importanti tal-qalba. Kull meta tirċievi l-messaġġi ta 'żball li ġejjin, dan ifisser li għandek verżjoni eqdem ta' PostgreSQL u l-valur SHMMAX tiegħek huwa baxx ħafna. L-utenti huma mistennija li jaġġustaw u jżidu l-valur skont il-memorja kondiviża li beħsiebhom jużaw.

Żbalji possibbli ta' konfigurazzjoni ħażina

Jekk SHMMAX ma jkunx ikkonfigurat b'mod korrett, tista 'tirċievi żball meta tipprova tinizjalizza cluster PostgreSQL billi tuża l-kmand initdb.

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

Bl-istess mod, tista 'tirċievi żball meta tibda s-server PostgreSQL billi tuża l-kmand pg_ctl.

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

Fehim tad-differenzi fid-definizzjonijiet

Id-definizzjoni tal-parametri SHMMAX/SHMALL hija kemxejn differenti fuq Linux u MacOS X:

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

Team sysctl jista 'jintuża biex jinbidel temporanjament il-valur. Biex tissettja valuri kostanti, żid entrata ma' /etc/sysctl.conf. Id-dettalji huma hawn taħt.

Nibdlu l-issettjar tal-kernel fuq 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

Nibdlu l-Parametri Kernel fuq 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

Tinsiex: Biex tagħmel il-bidliet permanenti, żid dawn il-valuri ma' /etc/sysctl.conf

Paġni Enormi

Linux juża paġni tal-memorja ta '4 KB b'mod awtomatiku, BSD juża paġni tal-memorja ta' XNUMX KB. Paġni Super, u fuq Windows - Paġni Kbar. Paġna hija biċċa RAM allokata għal proċess. Proċess jista' jkollu paġni multipli skont ir-rekwiżiti tal-memorja. Aktar ma proċess jeħtieġ memorja, aktar paġni jiġi allokat. L-OS iżomm tabella tal-allokazzjoni tal-paġna għall-proċessi. Iktar ma jkun żgħir id-daqs tal-paġna, iktar tkun kbira t-tabella, iktar ma tieħu żmien biex issib paġna f'dik it-tabella tal-paġna. Paġni kbar għalhekk jippermettu li jintużaw ammonti kbar ta 'memorja b'overhead imnaqqas; inqas opinjonijiet tal-paġna, inqas ħsarat fil-paġna, operazzjonijiet ta 'qari/kitba aktar mgħaġġla fuq buffers akbar. Ir-riżultat huwa prestazzjoni mtejba.

PostgreSQL jappoġġja biss paġni kbar fuq Linux. B'mod awtomatiku, Linux juża paġni tal-memorja ta '4 KB, għalhekk f'każijiet fejn hemm wisq operazzjonijiet ta' memorja, huwa meħtieġ li jiġu stabbiliti paġni akbar. Żidiet fil-prestazzjoni huma osservati meta jintużaw paġni kbar ta '2 MB u sa 1 GB. Id-daqs kbir tal-paġna jista 'jiġi stabbilit fil-ħin tal-ibbutjar. Tista 'faċilment tiċċekkja l-parametri tal-paġna kbira u l-użu tagħhom fuq il-magna Linux tiegħek billi tuża l-kmand qattus /proc/meminfo | grep -i enormi.

Ikseb informazzjoni dwar paġni kbar (Linux biss)

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

F'dan l-eżempju, għalkemm id-daqs tal-paġna kbira huwa ssettjat għal 2048 (2 MB), in-numru totali ta 'paġni kbar huwa ssettjat għal 0. Dan ifisser li paġni kbar huma diżattivati.

Script biex jiġi ddeterminat in-numru ta 'paġni kbar

Din l-iskrittura sempliċi tirritorna n-numru meħtieġ ta 'paġni kbar. Mexxi l-iskript fuq is-server Linux tiegħek waqt li PostgreSQL ikun qed jaħdem. Kun żgur li għall-varjabbli ambjentali $PGDATA Id-direttorju tad-dejta PostgreSQL huwa speċifikat.

Jkollna n-numru ta' paġni kbar meħtieġa

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

L-output tal-iskript jidher bħal dan:

Output ta 'skript

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

Il-valur rakkomandat għal paġni kbar huwa 88, għalhekk għandek issettjah għal 88.

Installazzjoni ta' Paġni Kbar

sysctl -w vm.nr_hugepages=88

Iċċekkja paġni kbar issa, se tara li ma jintużawx paġni kbar (HugePages_Free = HugePages_Total).

Paġni Kbar Rivisti (Linux Biss)

$ 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

Issa ssettja l-parametru huge_pages għal "on" f'$PGDATA/postgresql.conf u terġa 'tibda s-server.

Għal darb'oħra, informazzjoni dwar paġni kbar (Linux biss)

$ 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

Issa tista' tara li ftit li xejn qed jintużaw paġni kbar. Issa ejja nippruvaw inżidu xi dejta fid-database.

Xi operazzjonijiet ta 'database biex jirriċiklaw paġni kbar

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

Ejja naraw jekk qed nużaw aktar paġni kbar issa minn qabel.

Aktar informazzjoni fuq paġni kbar (Linux biss)

$ 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

Issa tista 'tara li ħafna mill-paġni kbar qed jintużaw.

Nota: Il-valur stmat għal HugePages użat hawn huwa baxx ħafna, li mhuwiex valur normali għal magna li tħaddem ambjent tal-prodott. Jekk jogħġbok ikkalkula n-numru meħtieġ ta' paġni għas-sistema tiegħek u ssettjahom skont it-tagħbija u r-riżorsi.

vm.swappiness

vm.swappiness huwa parametru tal-qalba ieħor li jista' jaffettwa l-prestazzjoni tad-database. Din l-għażla tintuża biex tikkontrolla l-imġieba ta 'swappiness (skambju ta' paġni ġewwa u barra mill-memorja) fil-Linux. Il-valur ivarja minn 0 sa 100. Jiddetermina kemm il-memorja se tiġi paġnata jew imqabbda. Żero tfisser ebda skambju u 100 tfisser skambju aggressiv.

Tista 'tikseb prestazzjoni tajba billi tistabbilixxi valuri aktar baxxi.

L-issettjar ta' dan għal 0 fuq qlub aktar ġodda jista' jikkawża li OOM Killer (il-proċess tat-tindif tal-memorja tal-Linux) joqtol il-proċess. Għalhekk huwa tajjeb li tissettjaha għal 1 jekk trid timminimizza l-iskambju. Il-valur default fil-Linux huwa 60. Valur ogħla jikkawża li l-MMU (unità ta 'ġestjoni tal-memorja) tuża aktar spazju ta' tpartit minn RAM, filwaqt li valur aktar baxx iżomm aktar data/kodiċi fil-memorja.

Valur aktar baxx huwa bet tajjeb għal prestazzjoni mtejba f'PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

L-applikazzjonijiet jakkwistaw memorja u jirrilaxxawha meta ma tkunx aktar meħtieġa. Iżda f'xi każijiet, l-applikazzjoni tikseb wisq memorja u ma tirrilaxxha. Dan jista 'jikkawża qattiel OOM. Hawn huma l-valuri tal-parametri possibbli vm.overcommit_memory b'deskrizzjoni għal kull wieħed:

  1. Ewristiku overcommit (default); euristika bbażata fuq il-qalba
  2. Ħalli impenn żejjed xorta waħda
  3. M'għandekx overdo it, ma taqbiżx il-proporzjon ta 'overcommit.

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

vm.overcommit_ratio — persentaġġ ta' RAM disponibbli għal tagħbija żejda. Valur ta' 50% fuq sistema b'2 GB RAM jista' jalloka sa 3 GB RAM.

Valur ta' 2 għal vm.overcommit_memory jipprovdi prestazzjoni aħjar għal PostgreSQL. Dan il-valur jimmassimizza l-użu tar-RAM tal-proċess tas-server mingħajr ebda riskju sinifikanti li jinqatel mill-proċess qattiel OOM. L-applikazzjoni tkun tista 'terġa' tagħbija, iżda biss fil-limiti ta 'qabża, li tnaqqas ir-riskju li qattiel OOM joqtol il-proċess. Għalhekk, valur ta '2 jagħti prestazzjoni aħjar mill-valur default ta' 0. Madankollu, l-affidabbiltà tista 'titjieb billi jiġi żgurat li l-memorja barra mill-firxa ma tkunx mgħobbija żżejjed. Dan jelimina r-riskju li l-proċess jinqatel minn qattiel OOM.

Fuq sistemi mingħajr tpartit, tista' sseħħ problema b'vm.overcommit_memory ugwali għal 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 huwa l-perċentwal tal-memorja mimlija b'paġni maħmuġin li jeħtieġ li jinkitbu fuq id-diska. Il-flush to disk isseħħ fl-isfond. Il-valur ta 'dan il-parametru jvarja minn 0 sa 100; madankollu, valur taħt il-5 jista 'jkun ineffettiv u xi qlub ma jappoġġjawhx. 10 huwa d-default fil-biċċa l-kbira tas-sistemi Linux. Tista 'ttejjeb il-prestazzjoni għal operazzjonijiet intensivi ta' kitba b'fattur iżgħar, li jfisser li Linux se jlaħlaħ paġni maħmuġin fl-isfond.

Trid issettja l-valur vm.dirty_background_bytes skond il-veloċità tas-sewqan tiegħek.

M'hemm l-ebda valuri "tajbin" għal dawn iż-żewġ parametri peress li t-tnejn huma dipendenti fuq il-ħardwer. Madankollu, l-issettjar ta' vm.dirty_background_ratio għal 5 u vm.dirty_background_bytes għal 25% tal-veloċità tad-disk itejjeb il-prestazzjoni għal ~25% f'ħafna każijiet.

vm.dirty_ratio/dirty_bytes

Huwa l-istess bħal vm.dirty_background_ratio/dirty_background_bytes, ħlief li r-reset isir f'sessjoni tal-ħaddiem, li jimblokka l-applikazzjoni. Għalhekk vm.dirty_ratio għandu jkun ogħla minn vm.dirty_background_ratio. Dan jiżgura li l-proċessi fl-isfond jibdew aktar kmieni biex jiġi evitat l-imblukkar tal-applikazzjoni kemm jista 'jkun. Tista 'taġġusta d-differenza bejn dawn iż-żewġ proporzjonijiet skond it-tagħbija I/O tad-diska.

Total

Tista 'ttejjeb settings oħra biex ittejjeb il-prestazzjoni, iżda t-titjib se jkun minimu u mhux se tara ħafna benefiċċju. Irridu niftakru li mhux l-għażliet kollha japplikaw għat-tipi kollha ta 'applikazzjonijiet. Xi apps jaħdmu aħjar meta naġġustaw xi settings, u xi wħud le. Trid issib il-bilanċ it-tajjeb bejn il-konfigurazzjoni ta' dawn is-settings għall-ammont ta' xogħol mistenni tiegħek u t-tip ta' applikazzjoni, u trid tikkunsidra wkoll l-imġieba tal-OS meta tirfina. Il-konfigurazzjoni tal-parametri tal-kernel mhix faċli daqs il-konfigurazzjoni tal-parametri tad-database; huwa aktar diffiċli li tagħmel rakkomandazzjonijiet.

Sors: www.habr.com

Żid kumment