Inasanidi Chaguzi za Kernel za Linux ili Kuboresha PostgreSQL

Inasanidi Chaguzi za Kernel za Linux ili Kuboresha PostgreSQL Utendaji bora wa PostgreSQL unategemea vigezo vya mfumo wa uendeshaji vilivyofafanuliwa kwa usahihi. Mipangilio ya kernel ya OS iliyosanidiwa vibaya inaweza kusababisha utendakazi duni wa seva ya hifadhidata. Kwa hivyo, ni muhimu kwamba mipangilio hii imeundwa kulingana na seva ya hifadhidata na mzigo wake wa kazi. Katika chapisho hili, tutajadili baadhi ya vigezo muhimu vya Linux kernel ambavyo vinaweza kuathiri utendaji wa seva ya hifadhidata na jinsi ya kuvisanidi.

SHMMAX / SHMALL

SHMMAX ni kigezo cha kernel kinachotumiwa kubainisha ukubwa wa juu zaidi wa sehemu moja ya kumbukumbu iliyoshirikiwa ambayo mchakato wa Linux unaweza kutenga. Kabla ya toleo la 9.2, PostgreSQL ilitumia Mfumo wa V (SysV), ambao unahitaji mpangilio wa SHMMAX. Baada ya 9.2, PostgreSQL ilibadilisha hadi kumbukumbu ya POSIX iliyoshirikiwa. Kwa hivyo sasa baiti chache za kumbukumbu iliyoshirikiwa ya Mfumo wa V inahitajika.

Kabla ya toleo la 9.3, SHMMAX ilikuwa kigezo muhimu zaidi cha kernel. Thamani ya SHMMAX imebainishwa katika baiti.

Vivyo hivyo SHMALL ni parameta nyingine ya kernel inayotumiwa kuamua
kiasi cha mfumo mzima cha kurasa za kumbukumbu zilizoshirikiwa. Ili kuona thamani za sasa za SHMMAX, SHMALL, au SHMMIN, tumia amri ipcs.

SHM* Maelezo - 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* Maelezo - 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 hutumia Mfumo V IPC kutenga kumbukumbu iliyoshirikiwa. Kigezo hiki ni mojawapo ya vigezo muhimu vya kernel. Wakati wowote unapopokea ujumbe wa makosa yafuatayo, inamaanisha kuwa una toleo la zamani la PostgreSQL na thamani yako ya SHMMAX iko chini sana. Watumiaji wanatarajiwa kurekebisha na kuongeza thamani kulingana na kumbukumbu iliyoshirikiwa wanayokusudia kutumia.

Hitilafu zinazowezekana za usanidi

Ikiwa SHMMAX haijasanidiwa ipasavyo, unaweza kupokea hitilafu unapojaribu kuanzisha nguzo ya PostgreSQL kwa kutumia amri. intdb.

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

Vivyo hivyo, unaweza kupokea hitilafu wakati wa kuanzisha seva ya PostgreSQL kwa kutumia amri pg_ctl.

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

Kuelewa tofauti za ufafanuzi

Kufafanua vigezo vya SHMMAX/SHMALL ni tofauti kidogo kwenye Linux na MacOS X:

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

Timu sysctl inaweza kutumika kubadilisha thamani kwa muda. Ili kuweka thamani zisizobadilika, ongeza ingizo kwa /etc/sysctl.conf. Maelezo ni hapa chini.

Kubadilisha Mipangilio ya Kernel kwenye 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

Kubadilisha Vigezo vya Kernel kwenye 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

Usisahau: Ili kufanya mabadiliko kuwa ya kudumu, ongeza thamani hizi kwenye /etc/sysctl.conf

Kurasa Kubwa

Linux hutumia kurasa za kumbukumbu za KB 4 kwa chaguo-msingi, BSD hutumia kurasa za kumbukumbu za KB XNUMX. Kurasa Super, na kwenye Windows - Kurasa Kubwa. Ukurasa ni kipande cha RAM kilichotengwa kwa mchakato. Mchakato unaweza kuwa na kurasa nyingi kulingana na mahitaji ya kumbukumbu. Kadiri mchakato unavyohitaji kumbukumbu zaidi, ndivyo kurasa nyingi zinavyotolewa. Mfumo wa Uendeshaji hudumisha jedwali la ugawaji wa ukurasa kwa michakato. Kadiri ukubwa wa ukurasa unavyopungua, jedwali likiwa kubwa, ndivyo inavyochukua muda mrefu kupata ukurasa katika jedwali hilo la ukurasa. Kurasa kubwa kwa hiyo huruhusu kiasi kikubwa cha kumbukumbu kutumika kwa kupunguzwa kwa kichwa; mara ambazo kurasa zimetazamwa, hitilafu chache za ukurasa, shughuli za kusoma/kuandika kwa haraka zaidi ya vihifadhi vikubwa zaidi. Matokeo yake ni kuboresha utendaji.

PostgreSQL inasaidia kurasa kubwa kwenye Linux pekee. Kwa default, Linux hutumia kurasa za kumbukumbu za 4 KB, hivyo katika hali ambapo kuna shughuli nyingi za kumbukumbu, ni muhimu kuweka kurasa kubwa. Mafanikio ya utendaji yanazingatiwa wakati wa kutumia kurasa kubwa za 2 MB na hadi GB 1. Saizi kubwa ya ukurasa inaweza kuwekwa wakati wa kuwasha. Unaweza kuangalia kwa urahisi vigezo vya ukurasa mkubwa na matumizi yao kwenye mashine yako ya Linux kwa kutumia amri paka /proc/meminfo | grep -i kubwa.

Kupata habari kuhusu kurasa kubwa (Linux pekee)

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

Katika mfano huu, ingawa saizi kubwa ya ukurasa imewekwa 2048 (MB 2), jumla ya kurasa kubwa imewekwa 0. Hii inamaanisha kuwa kurasa kubwa zimezimwa.

Hati ya kuamua idadi ya kurasa kubwa

Hati hii rahisi inarudisha idadi inayohitajika ya kurasa kubwa. Endesha hati kwenye seva yako ya Linux wakati PostgreSQL inaendesha. Hakikisha kuwa kwa utofauti wa mazingira $PGDATA Saraka ya data ya PostgreSQL imebainishwa.

Kupata idadi ya kurasa kubwa zinazohitajika

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

Pato la maandishi linaonekana kama hii:

Toleo la hati

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

Thamani inayopendekezwa kwa kurasa kubwa ni 88, kwa hivyo unapaswa kuiweka 88.

Inasakinisha Kurasa Kubwa

sysctl -w vm.nr_hugepages=88

Angalia kurasa kubwa sasa, utaona kwamba kurasa kubwa hazitumiki (HugePages_Free = HugePages_Total).

Kurasa Kubwa Zilizoangaliwa upya (Linux Pekee)

$ 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

Sasa weka parameta ya huge_pages kuwa "imewashwa" katika $PGDATA/postgresql.conf na uanze upya seva.

Kwa mara nyingine tena, habari kuhusu kurasa kubwa (Linux pekee)

$ 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

Sasa unaweza kuona kwamba kurasa kubwa chache sana zinatumiwa. Hebu sasa tujaribu kuongeza data fulani kwenye hifadhidata.

Baadhi ya shughuli za hifadhidata kuchakata kurasa kubwa

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

Wacha tuone ikiwa tunatumia kurasa kubwa zaidi sasa kuliko hapo awali.

Maelezo zaidi kwenye kurasa kubwa (Linux pekee)

$ 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

Sasa unaweza kuona kwamba kurasa nyingi kubwa zinatumiwa.

Kumbuka: Thamani iliyokadiriwa ya HugePages inayotumika hapa ni ya chini sana, ambayo si thamani ya kawaida kwa mashine inayoendesha mazingira ya bidhaa. Tafadhali kadiria idadi inayohitajika ya kurasa za mfumo wako na uziweke ipasavyo kulingana na mzigo na rasilimali.

vm.swappiness

vm.swappiness ni kigezo kingine cha kernel ambacho kinaweza kuathiri utendaji wa hifadhidata. Chaguo hili linatumika kudhibiti tabia ya kubadilishana (kubadilishana kurasa ndani na nje ya kumbukumbu) katika Linux. Thamani ni kati ya 0 hadi 100. Huamua ni kumbukumbu ngapi itawekwa ukurasa au kutengwa. Sifuri inamaanisha hakuna kubadilishana na 100 inamaanisha kubadilishana kwa fujo.

Unaweza kupata utendaji mzuri kwa kuweka maadili ya chini.

Kuweka hii hadi 0 kwenye kokwa mpya kunaweza kusababisha OOM Killer (mchakato wa kusafisha kumbukumbu wa Linux) kuua mchakato huo. Kwa hivyo ni salama kuiweka 1 ikiwa unataka kupunguza ubadilishaji. Thamani chaguo-msingi katika Linux ni 60. Thamani ya juu husababisha MMU (kitengo cha usimamizi wa kumbukumbu) kutumia nafasi nyingi za kubadilishana kuliko RAM, huku thamani ya chini huweka data/misimbo zaidi kwenye kumbukumbu.

Thamani ya chini ni dau nzuri kwa utendakazi ulioboreshwa katika PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Programu hupata kumbukumbu na kuifungua wakati haihitajiki tena. Lakini katika hali nyingine, programu hupata kumbukumbu nyingi na haitoi. Hii inaweza kusababisha muuaji wa OOM. Hapa kuna maadili yanayowezekana ya parameta vm.overcommit_memory na maelezo kwa kila:

  1. Heuristic overcommit (chaguo-msingi); kernel-msingi heuristic
  2. Ruhusu kupindua hata hivyo
  3. Usiiongezee, usizidi uwiano wa overcommit.

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

vm.overcommit_ratio - asilimia ya RAM inapatikana kwa upakiaji kupita kiasi. Thamani ya 50% kwenye mfumo na 2 GB ya RAM inaweza kutenga hadi 3 GB ya RAM.

Thamani ya 2 kwa vm.overcommit_memory hutoa utendakazi bora kwa PostgreSQL. Thamani hii huongeza matumizi ya RAM ya mchakato wa seva bila hatari yoyote kubwa ya kuuawa na mchakato wa muuaji wa OOM. Programu itaweza kupakia upya, lakini ndani ya mipaka ya kupita kiasi, ambayo inapunguza hatari ya muuaji wa OOM kuua mchakato. Kwa hiyo, thamani ya 2 inatoa utendakazi bora zaidi kuliko thamani chaguo-msingi ya 0. Hata hivyo, kuegemea kunaweza kuboreshwa kwa kuhakikisha kuwa kumbukumbu ya nje ya masafa haijapakiwa. Hii inaondoa hatari ya mchakato kuuawa na muuaji wa OOM.

Kwenye mifumo bila kubadilishana, tatizo la vm.overcommit_memory sawa na 2 linaweza kutokea.

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

vm.dirty_background_ratio / vm.dirty_background_bytes

vm.uwiano_wa_background_chafu ni asilimia ya kumbukumbu iliyojazwa na kurasa chafu zinazohitaji kuandikwa kwenye diski. Kusafisha kwa diski hutokea nyuma. Thamani ya parameter hii inaanzia 0 hadi 100; hata hivyo, thamani iliyo chini ya 5 inaweza isifanye kazi na baadhi ya kokwa haziungi mkono. 10 ndio chaguo msingi kwenye mifumo mingi ya Linux. Unaweza kuboresha utendakazi wa utendakazi unaohitaji uandishi mwingi kwa kipengele kidogo, ambacho kitamaanisha kwamba Linux itaondoa kurasa chafu chinichini.

Unahitaji kuweka thamani vm.dirty_background_baiti kulingana na kasi ya gari lako.

Hakuna maadili "nzuri" kwa vigezo hivi viwili kwani zote zinategemea vifaa. Hata hivyo, kuweka vm.dirty_background_ratio hadi 5 na vm.dirty_background_bytes hadi 25% ya kasi ya diski huboresha utendaji hadi ~25% katika hali nyingi.

vm.dirty_ratio/dirty_bytes

Ni sawa na vm.dirty_background_ratio/dirty_background_baiti, isipokuwa kwamba kuweka upya kunafanywa katika kikao cha mfanyakazi, kuzuia programu. Kwa hivyo vm.dirty_ratio inapaswa kuwa juu kuliko vm.uwiano_wa_background_chafu. Hii inahakikisha kwamba michakato ya usuli huanza mapema ili kuzuia kuzuia programu iwezekanavyo. Unaweza kurekebisha tofauti kati ya uwiano hizi mbili kulingana na mzigo wa disk I / O.

Jumla ya

Unaweza kubadilisha mipangilio mingine ili kuboresha utendakazi, lakini maboresho yatakuwa machache na hutaona manufaa mengi. Lazima tukumbuke kuwa sio chaguzi zote zinazotumika kwa aina zote za programu. Baadhi ya programu hufanya kazi vizuri zaidi tunaporekebisha baadhi ya mipangilio, na baadhi hazifanyi hivyo. Ni lazima upate uwiano sahihi kati ya kusanidi mipangilio hii kwa mzigo wako wa kazi unaotarajiwa na aina ya programu, na lazima pia uzingatie tabia ya Mfumo wa Uendeshaji wakati wa kurekebisha. Kusanidi vigezo vya kernel sio rahisi kama kusanidi vigezo vya hifadhidata; ni ngumu zaidi kutoa mapendekezo.

Chanzo: mapenzi.com

Kuongeza maoni