Optimāla PostgreSQL veiktspēja ir atkarīga no pareizi konfigurētiem operētājsistēmas parametriem. Slikti konfigurēti kodola parametri var izraisīt datubāzes servera veiktspējas pasliktināšanos. Tāpēc ir svarīgi šos parametrus konfigurēt atbilstoši datubāzes serverim un tā darba slodzei. Šajā ierakstā mēs apspriedīsim dažus svarīgus kodola parametrus. Linux, kas var ietekmēt datubāzes servera veiktspēju un to konfigurēšanu.
SHMMAX / SHMALL
SHMMAX — ir kodola parametrs, ko izmanto, lai noteiktu viena koplietojamās atmiņas segmenta maksimālo izmēru, ko process var piešķirt. LinuxPirms 9.2 versijas PostgreSQL izmantoja System V (SysV), kam nepieciešams SHMMAX iestatījums. Pēc 9.2 versijas PostgreSQL pārgāja uz POSIX koplietojamo atmiņu. Tas nozīmē, ka tagad ir nepieciešams mazāk System V koplietojamā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* detaļas — 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) = 1SHM* 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).
PADOMS. Šī kļūda parasti nozīmē, ka PostgreSQL pieprasījums koplietotās atmiņas segmentam pārsniedza jūsu kodola SHMMAX parametru.
Varat samazināt pieprasījuma lielumu vai pārkonfigurēt kodolu ar lielāku SHMMAX. Lai samazinātu pieprasījuma lielumu (pašlaik 2072576 baiti),
samazināt PostgreSQL koplietotās atmiņas izmantošanu, iespējams, samazinot shared_buffers vai max_connections.
Ja pieprasījuma lielums jau ir mazs, iespējams, ka tas ir mazāks par jūsu kodola SHMMIN parametru,
tādā gadījumā ir nepieciešams palielināt pieprasījuma lielumu vai pārkonfigurēt SHMMIN.
PostgreSQL dokumentācijā ir sniegta plašāka informācija par koplietotās atmiņas konfigurāciju. Bērnprocess beidzās ar izejas kodu 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).
PADOMS. Šī kļūda parasti nozīmē, ka PostgreSQL pieprasījums koplietotās atmiņas segmentam pārsniedza jūsu kodola SHMMAX parametru.
Varat samazināt pieprasījuma lielumu vai pārkonfigurēt kodolu ar lielāku SHMMAX.; Lai samazinātu pieprasījuma lielumu (pašlaik 14385152 baiti), samaziniet PostgreSQL koplietotās atmiņas izmantošanu, iespējams, samazinot shared_buffers vai max_connections.
Ja pieprasījuma lielums jau ir mazs, iespējams, ka tas ir mazāks par jūsu kodola SHMMIN parametru,
tādā gadījumā ir nepieciešams palielināt pieprasījuma lielumu vai pārkonfigurēt SHMMIN.
PostgreSQL dokumentācijā ir sniegta plašāka informācija par koplietotās atmiņas konfigurāciju.
Izpratne par definīciju atšķirībām
SHMMAX/SHMALL parametru definīcija nedaudz atšķiras. Linux un MacOS X:
- 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 -> 16777216Kodola parametru maiņa ieslēgta 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 -> 16777216Neaizmirsti: 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 BSD tiek izmantotas 4 KB atmiņas lapas - Super lapasun Windows Sākot no 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 Linux... Noklusējuma Linux izmanto 4 KB atmiņas lapas, tāpēc gadījumos, kad ir 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 līdz 1 GB. Lielo lapas izmēru var iestatīt sāknēšanas laikā. Jūs varat viegli pārbaudīt lielo lapu iestatījumus un to izmantošanu savā ierīcē. Linux-dators, izmantojot komandu kaķis /proc/meminfo | grep -i milzīgs.
Informācijas iegūšana par lielām lapām (tikai vietnē 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 kBLai 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 lielo lapu skaitu. Palaidiet skriptu savā serverī. Linuxkamēr darbojas PostgreSQL. Pārliecinieties, vai vides mainīgais $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: $hpSkripta izvade izskatās šādi:
Skripta izvade
Pid: 12737
VmPeak: 180932 kB
Hugepagesize: 2048 kB
Set Huge Pages: 88Ieteicamā 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=88Pārbaudiet lielas lapas tūlīt, jūs redzēsiet, ka lielas lapas netiek izmantotas (HugePages_Free = HugePages_Total).
Plašāka informācija par lielām lapām (tikai vietnē 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 kBTagad failā $PGDATA/postgresql.conf iestatiet parametru huge_pages uz "on" un restartējiet serveri.
Un atkal informācija par lielām lapām (tikai vietnē 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 kBTagad 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 10000000Paskatīsimies, vai šobrīd izmantojam vairāk lielu lapu nekā iepriekš.
Vēlreiz informācija par lielām lapām (tikai vietnē 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 kBTagad 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 datubāzes veiktspēju. Šis parametrs tiek izmantots, lai kontrolētu mijmaiņas darbību (lapu maiņu atmiņā un ārpus tās) LinuxVērtība ir no 0 līdz 100. Tā nosaka, cik daudz atmiņas tiks apmainīta vai apmainīta. Nulle nozīmē, ka apmaiņa nenotiek, bet 100 nozīmē agresīvu apmaiņu.
Jūs varat iegūt labu veiktspēju, iestatot zemākas vērtības.
Jaunākos kodolos vērtības iestatīšana uz 0 var izraisīt OOM Killer (atmiņas tīrīšanas procesu) Linux) pārtrauks procesu. Tāpēc droši var iestatīt vērtību 1, ja vēlaties samazināt apmaiņu. Noklusējuma vērtība ir Linux - 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 zemāka vērtība saglabā atmiņā vairāk datu/koda.
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 atmiņas procentuālā daļa, kas piepildīta ar netīrām lapām, kuras ir jāiztīra diskā. Šī tīrīšana notiek fonā. Šī parametra vērtība ir no 0 līdz 100; tomēr vērtība, kas ir zemāka par 5, var būt neefektīva, un daži kodoli to neatbalsta. 10 ir noklusējuma vērtība lielākajā daļā sistēmu. LinuxRakstīšanas ziņā intensīvu darbību veiktspēju var uzlabot ar mazāku attiecību, kas nozīmēs, ka Linux fonā izskalos netīras 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
