OptimÄla PostgreSQL veiktspÄja ir atkarÄ«ga no pareizi definÄtiem operÄtÄjsistÄmas parametriem. Slikti konfigurÄti OS kodola iestatÄ«jumi var izraisÄ«t sliktu datu bÄzes servera veiktspÄju. TÄpÄc Å”ie iestatÄ«jumi ir obligÄti jÄkonfigurÄ atbilstoÅ”i datu bÄzes serverim un tÄ darba slodzei. Å ajÄ ziÅojumÄ mÄs apspriedÄ«sim dažus svarÄ«gus Linux kodola parametrus, kas var ietekmÄt datu bÄzes servera veiktspÄju, un to konfigurÄÅ”anu.
SHMMAX / SHMALL
SHMMAX ir kodola parametrs, ko izmanto, lai noteiktu maksimÄlo viena koplietotÄs atmiÅas segmenta lielumu, ko var pieŔķirt Linux process. Pirms versijas 9.2 PostgreSQL izmantoja System V (SysV), kam nepiecieÅ”ams SHMMAX iestatÄ«jums. PÄc versijas 9.2 PostgreSQL pÄrgÄja uz POSIX koplietoto atmiÅu. TÄtad tagad ir nepiecieÅ”ams mazÄk System V koplietotÄs atmiÅas baitu.
Pirms versijas 9.3 SHMMAX bija vissvarÄ«gÄkais kodola parametrs. SHMMAX vÄrtÄ«ba ir norÄdÄ«ta baitos.
LÄ«dzÄ«gi SHMALL ir vÄl viens kodola parametrs, ko izmanto, lai noteiktu
sistÄmas mÄroga koplietojamÄs atmiÅas lapu apjoms. Lai skatÄ«tu paÅ”reizÄjÄs SHMMAX, SHMALL vai SHMMIN vÄrtÄ«bas, izmantojiet komandu ipcs.
SHM* informÄcija ā 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* informÄcija ā 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 lietojumi SistÄmas V IPC lai pieŔķirtu koplietojamo atmiÅu. Å is parametrs ir viens no svarÄ«gÄkajiem kodola parametriem. Ikreiz, kad saÅemat tÄlÄk norÄdÄ«tos kļūdu ziÅojumus, tas nozÄ«mÄ, ka jums ir vecÄka PostgreSQL versija un jÅ«su SHMMAX vÄrtÄ«ba ir ļoti zema. LietotÄjiem ir jÄpielÄgo un jÄpalielina vÄrtÄ«ba atbilstoÅ”i koplietotajai atmiÅai, ko viÅi plÄno izmantot.
IespÄjamas nepareizas konfigurÄcijas kļūdas
Ja SHMMAX nav pareizi konfigurÄts, var tikt parÄdÄ«ts kļūdas ziÅojums, mÄÄ£inot inicializÄt PostgreSQL klasteru, izmantojot komandu initdb.
initdb kļūme
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
TÄpat var tikt parÄdÄ«ta kļūda, startÄjot PostgreSQL serveri, izmantojot komandu pg_ctl.
pg_ctl Kļūme
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.
Izpratne par definÄ«ciju atŔķirÄ«bÄm
SHMMAX/SHMALL parametru definÄÅ”ana operÄtÄjsistÄmÄs Linux un MacOS X nedaudz atŔķiras:
- Linux: kernel.shmmax, kernel.shmall
- MacOS X: kern.sysv.shmmax, kern.sysv.shmall
Komanda sysctl var izmantot, lai Ä«slaicÄ«gi mainÄ«tu vÄrtÄ«bu. Lai iestatÄ«tu nemainÄ«gas vÄrtÄ«bas, pievienojiet ierakstu /etc/sysctl.conf. SÄ«kÄka informÄcija ir sniegta zemÄk.
Kodola iestatÄ«jumu maiÅa operÄtÄjsistÄmÄ 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
Kodola parametru maiÅa operÄtÄjsistÄmÄ 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
Neaizmirsti: lai izmaiÅas bÅ«tu pastÄvÄ«gas, pievienojiet Ŕīs vÄrtÄ«bas failam /etc/sysctl.conf
Milzīgas lapas
Linux pÄc noklusÄjuma izmanto 4 KB atmiÅas lapas, BSD izmanto XNUMX KB atmiÅas lapas. Super lapas, un operÄtÄjsistÄmÄ Windows - Lielas lapas. Lapa ir RAM daļa, kas pieŔķirta procesam. Procesam var bÅ«t vairÄkas lapas atkarÄ«bÄ no atmiÅas prasÄ«bÄm. Jo vairÄk atmiÅas process prasa, jo vairÄk lapu tam tiek pieŔķirts. OS uztur lapu pieŔķirÅ”anas tabulu procesiem. Jo mazÄks ir lapas izmÄrs, jo lielÄka ir tabula, jo ilgÄks laiks nepiecieÅ”ams, lai atrastu lapu Å”ajÄ lapu tabulÄ. TÄpÄc lielas lapas ļauj izmantot lielus atmiÅas apjomus, samazinot pieskaitÄmÄs izmaksas; mazÄk lapu skatÄ«jumu, mazÄk lappuÅ”u kļūdu, ÄtrÄkas lasÄ«Å”anas/rakstÄ«Å”anas darbÄ«bas, izmantojot lielÄkus buferus. RezultÄts ir uzlabota veiktspÄja.
PostgreSQL atbalsta tikai lielas lapas operÄtÄjsistÄmÄ Linux. PÄc noklusÄjuma Linux izmanto 4 KB atmiÅas lapas, tÄpÄc gadÄ«jumos, kad ir pÄrÄk daudz atmiÅas operÄciju, ir nepiecieÅ”ams iestatÄ«t lielÄkas lapas. VeiktspÄjas uzlabojumi tiek novÄroti, izmantojot lielas lapas no 2 MB un lÄ«dz 1 GB. Lielo lapas izmÄru var iestatÄ«t sÄknÄÅ”anas laikÄ. Izmantojot komandu, varat viegli pÄrbaudÄ«t lielos lapas parametrus un to lietojumu savÄ Linux maŔīnÄ kaÄ·is /proc/meminfo | grep -i milzÄ«gs.
InformÄcijas iegÅ«Å”ana par lielÄm lapÄm (tikai Linux)
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
Lai gan Å”ajÄ piemÄrÄ lielais lapas izmÄrs ir iestatÄ«ts uz 2048 (2 MB), kopÄjais lielo lapu skaits ir iestatÄ«ts uz 0. Tas nozÄ«mÄ, ka lielas lapas ir atspÄjotas.
Skripts lielu lapu skaita noteikŔanai
Å is vienkÄrÅ”ais skripts atgriež nepiecieÅ”amo lielu lapu skaitu. Palaidiet skriptu savÄ Linux serverÄ«, kamÄr darbojas PostgreSQL. PÄrliecinieties, ka tas attiecas uz vides mainÄ«go $PGDATA Ir norÄdÄ«ts PostgreSQL datu direktorijs.
NepiecieŔamo lielo lapu skaita iegūŔana
#!/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
Skripta izvade izskatÄs Å”Ädi:
Skripta izvade
Pid: 12737
VmPeak: 180932 kB
Hugepagesize: 2048 kB
Set Huge Pages: 88
IeteicamÄ vÄrtÄ«ba lielÄm lapÄm ir 88, tÄpÄc iestatiet to uz 88.
Lielu lapu instalÄÅ”ana
sysctl -w vm.nr_hugepages=88
PÄrbaudiet lielas lapas tÅ«lÄ«t, jÅ«s redzÄsiet, ka lielas lapas netiek izmantotas (HugePages_Free = HugePages_Total).
AtkÄrtoti apmeklÄtas lielas lapas (tikai Linux)
$ 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
Tagad failÄ $PGDATA/postgresql.conf iestatiet parametru huge_pages uz "on" un restartÄjiet serveri.
VÄlreiz informÄcija par lielajÄm lapÄm (tikai Linux)
$ 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
Tagad jÅ«s varat redzÄt, ka tiek izmantots ļoti maz lielu lapu. Tagad mÄÄ£inÄsim datubÄzei pievienot dažus datus.
Dažas datu bÄzes darbÄ«bas, lai pÄrstrÄdÄtu lielas lapas
postgres=# CREATE TABLE foo(a INTEGER);
CREATE TABLE
postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));
INSERT 0 10000000
PaskatÄ«simies, vai Å”obrÄ«d izmantojam vairÄk lielu lapu nekÄ iepriekÅ”.
VairÄk informÄcijas lielÄs lapÄs (tikai Linux)
$ 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
Tagad jÅ«s varat redzÄt, ka tiek izmantota lielÄkÄ daļa lielo lapu.
PiezÄ«me. Å eit izmantotÄ HugePages aptuvenÄ vÄrtÄ«ba ir ļoti zema, kas nav normÄla vÄrtÄ«ba iekÄrtai, kurÄ darbojas produkta vide. LÅ«dzu, novÄrtÄjiet savai sistÄmai nepiecieÅ”amo lapu skaitu un atbilstoÅ”i iestatiet tÄs, pamatojoties uz slodzi un resursiem.
vm.swapiness
vm.swapiness ir vÄl viens kodola parametrs, kas var ietekmÄt datu bÄzes veiktspÄju. Å Ä« opcija tiek izmantota, lai kontrolÄtu mijmaiÅas darbÄ«bu (lapu apmaiÅu atmiÅÄ un no tÄs) operÄtÄjsistÄmÄ Linux. VÄrtÄ«ba svÄrstÄs no 0 lÄ«dz 100. Tas nosaka, cik daudz atmiÅas tiks lappuÅ”u vai izÅemtas. Nulle nozÄ«mÄ bez maiÅas un 100 nozÄ«mÄ agresÄ«vu apmaiÅu.
JÅ«s varat iegÅ«t labu veiktspÄju, iestatot zemÄkas vÄrtÄ«bas.
Iestatot Å”o vÄrtÄ«bu uz 0 jaunÄkos kodolos, OOM Killer (Linux atmiÅas tÄ«rÄ«Å”anas process) var pÄrtraukt procesu. TÄpÄc ir droÅ”i iestatÄ«t to uz 1, ja vÄlaties samazinÄt apmaiÅu. Linux noklusÄjuma vÄrtÄ«ba ir 60. AugstÄka vÄrtÄ«ba liek MMU (atmiÅas pÄrvaldÄ«bas vienÄ«bai) izmantot vairÄk mijmaiÅas vietas nekÄ RAM, savukÄrt mazÄka vÄrtÄ«ba saglabÄ vairÄk datu/koda atmiÅÄ.
ZemÄka vÄrtÄ«ba ir laba likme uzlabotai veiktspÄjai programmÄ PostgreSQL.
vm.overcommit_memory / vm.overcommit_ratio
Lietojumprogrammas iegÅ«st atmiÅu un atbrÄ«vo to, kad tÄ vairs nav nepiecieÅ”ama. Bet dažos gadÄ«jumos lietojumprogramma iegÅ«st pÄrÄk daudz atmiÅas un to neatbrÄ«vo. Tas var izraisÄ«t OOM killer. Å eit ir norÄdÄ«tas iespÄjamÄs parametru vÄrtÄ«bas vm.overcommit_memory ar aprakstu katram:
- HeiristiskÄ pÄrsniegÅ”ana (noklusÄjums); uz kodolu balstÄ«ta heiristika
- JebkurÄ gadÄ«jumÄ Ä¼aujiet pÄrspÄ«lÄt
- NepÄrspÄ«lÄjiet to, nepÄrsniedziet pÄrspÄ«lÄto saistÄ«bu attiecÄ«bu.
Saite:
vm.overcommit_ratio ā pÄrslodzes gadÄ«jumÄ pieejamÄs RAM procentuÄlÄ daļa. VÄrtÄ«ba 50% sistÄmÄ ar 2 GB RAM var pieŔķirt lÄ«dz 3 GB RAM.
VÄrtÄ«ba 2 vm.overcommit_memory nodroÅ”ina labÄku PostgreSQL veiktspÄju. Å Ä« vÄrtÄ«ba maksimÄli palielina servera procesa RAM izmantoÅ”anu, neradot bÅ«tisku risku, ka OOM slepkavas process varÄtu tikt nogalinÄts. Lietojumprogrammu varÄs atkÄrtoti ielÄdÄt, taÄu tikai pÄrtÄ«Å”anas robežÄs, kas samazina risku, ka OOM slepkava iznÄ«cinÄs procesu. TÄpÄc vÄrtÄ«ba 2 nodroÅ”ina labÄku veiktspÄju nekÄ noklusÄjuma vÄrtÄ«ba 0. TomÄr uzticamÄ«bu var uzlabot, nodroÅ”inot, ka Ärpus diapazona esoÅ”Ä atmiÅa netiek pÄrslogota. Tas novÄrÅ” risku, ka procesu var nogalinÄt OOM slepkava.
SistÄmÄs bez mijmaiÅas var rasties problÄma ar vm.overcommit_memory, kas vienÄda ar 2.
vm.dirty_background_ratio / vm.dirty_background_bytes
vm.dirty_background_ratio ir ar netÄ«rÄm lapÄm piepildÄ«tÄs atmiÅas procentuÄlais daudzums, kas jÄieraksta diskÄ. IzskaloÅ”ana diskÄ notiek fonÄ. Å Ä« parametra vÄrtÄ«ba ir robežÄs no 0 lÄ«dz 100; tomÄr vÄrtÄ«ba, kas ir mazÄka par 5, var bÅ«t neefektÄ«va, un daži kodoli to neatbalsta. 10 ir noklusÄjuma vÄrtÄ«ba lielÄkajÄ daÄ¼Ä Linux sistÄmu. Varat uzlabot veiktspÄju intensÄ«vÄm rakstÄ«Å”anas darbÄ«bÄm ar mazÄku faktoru, kas nozÄ«mÄ, ka Linux fonÄ izskalos netÄ«rÄs lapas.
Jums ir jÄiestata vÄrtÄ«ba vm.dirty_background_bytes atkarÄ«bÄ no jÅ«su braukÅ”anas Ätruma.
Å iem diviem parametriem nav "labu" vÄrtÄ«bu, jo abi ir atkarÄ«gi no aparatÅ«ras. TomÄr, iestatot vm.dirty_background_ratio uz 5 un vm.dirty_background_bytes lÄ«dz 25% no diska Ätruma, vairumÄ gadÄ«jumu veiktspÄja uzlabojas lÄ«dz ~25%.
vm.dirty_ratio/dirty_bytes
Tas ir tas pats, kas vm.dirty_background_ratio/dirty_background_bytes, izÅemot to, ka atiestatÄ«Å”ana tiek veikta darbinieka sesijÄ, bloÄ·Äjot lietojumprogrammu. TÄpÄc vm.dirty_ratio jÄbÅ«t lielÄkam par vm.dirty_background_ratio. Tas nodroÅ”ina, ka fona procesi sÄkas agrÄk, lai pÄc iespÄjas izvairÄ«tos no lietojumprogrammas bloÄ·ÄÅ”anas. Varat pielÄgot atŔķirÄ«bu starp Ŕīm divÄm attiecÄ«bÄm atkarÄ«bÄ no diska I/O slodzes.
Kopsavilkums
Varat pielÄgot citus iestatÄ«jumus, lai uzlabotu veiktspÄju, taÄu uzlabojumi bÅ«s minimÄli, un jÅ«s neredzÄsit lielu labumu. JÄatceras, ka ne visas iespÄjas attiecas uz visu veidu lietojumprogrammÄm. Dažas lietotnes darbojas labÄk, ja pielÄgojam dažus iestatÄ«jumus, bet dažas ne. Jums ir jÄatrod pareizais lÄ«dzsvars starp Å”o iestatÄ«jumu konfigurÄÅ”anu paredzÄtajai darba slodzei un lietojumprogrammas veidam, kÄ arÄ«, veicot regulÄÅ”anu, jÄÅem vÄrÄ OS darbÄ«ba. Kodola parametru konfigurÄÅ”ana nav tik vienkÄrÅ”a kÄ datu bÄzes parametru konfigurÄÅ”ana; ir grÅ«tÄk sniegt ieteikumus.
Avots: www.habr.com