PostgreSQL оңтайландыру үшін Linux ядросының опцияларын конфигурациялау

PostgreSQL оңтайландыру үшін Linux ядросының опцияларын конфигурациялау Оңтайлы PostgreSQL өнімділігі дұрыс анықталған операциялық жүйе параметрлеріне байланысты. Нашар конфигурацияланған ОЖ ядросының параметрлері дерекқор серверінің нашар өнімділігін тудыруы мүмкін. Сондықтан бұл параметрлер дерекқор серверіне және оның жұмыс жүктемесіне сәйкес конфигурациялануы өте маңызды. Бұл мақалада біз дерекқор серверінің өнімділігіне әсер ететін кейбір маңызды Linux ядросының параметрлерін және оларды қалай конфигурациялау керектігін талқылаймыз.

SHMMAX / SHMALL

SHMMAX Linux процесі бөлетін жалғыз ортақ жад сегментінің максималды өлшемін анықтау үшін пайдаланылатын ядро ​​параметрі. 9.2 нұсқасына дейін PostgreSQL SHMMAX параметрін қажет ететін System V (SysV) пайдаланды. 9.2-ден кейін PostgreSQL POSIX ортақ жадына ауысты. Сонымен, енді System V ортақ жадының аз байттары қажет.

9.3 нұсқасына дейін SHMMAX ядроның ең маңызды параметрі болды. SHMMAX мәні байтпен көрсетілген.

Сол сияқты SHMALL анықтау үшін пайдаланылатын басқа ядро ​​параметрі болып табылады
ортақ жад беттерінің жүйелік көлемі. Ағымдағы SHMMAX, SHMALL немесе SHMMIN мәндерін көру үшін пәрменді пайдаланыңыз ipcs.

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

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 пайдаланады V IPC жүйесі ортақ жадты бөлу үшін. Бұл параметр ядроның маңызды параметрлерінің бірі болып табылады. Келесі қате туралы хабарларды алған сайын, бұл сізде PostgreSQL ескі нұсқасы бар екенін және SHMMAX мәні өте төмен екенін білдіреді. Пайдаланушылар қолданатын ортақ жадқа сәйкес мәнді реттеп, көбейтеді деп күтілуде.

Ықтимал конфигурация қателері

SHMMAX дұрыс конфигурацияланбаған болса, PostgreSQL кластерін пәрмен арқылы инициализациялау әрекеті кезінде қате алуыңыз мүмкін. initdb.

initdb сәтсіздігі
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

Сол сияқты, сіз PostgreSQL серверін пәрмен арқылы іске қосқан кезде қате алуыңыз мүмкін pg_ctl.

pg_ctl Сәтсіздік
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.

Анықтамалардағы айырмашылықтарды түсіну

SHMMAX/SHMALL параметрлерін анықтау Linux және MacOS X жүйелерінде сәл өзгеше:

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

команда sysctl мәнді уақытша өзгерту үшін пайдалануға болады. Тұрақты мәндерді орнату үшін жазбаны қосыңыз /etc/sysctl.conf. Мәліметтер төменде берілген.

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

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

Ұмытпаңыз: Өзгерістерді тұрақты ету үшін осы мәндерді /etc/sysctl.conf ішіне қосыңыз

Үлкен беттер

Linux әдепкі бойынша 4 Кбайт жад беттерін пайдаланады, BSD XNUMX Кбайт жад беттерін пайдаланады. Супер беттер, және Windows жүйесінде - Үлкен беттер. Бет – процесске бөлінген жедел жад бөлігі. Жад талаптарына байланысты процесте бірнеше бет болуы мүмкін. Процесс неғұрлым көп жадты қажет етсе, соғұрлым ол көбірек беттерге бөлінеді. ОЖ процестер үшін беттерді бөлу кестесін жүргізеді. Бет өлшемі неғұрлым кіші болса, кесте соғұрлым үлкен болса, сол бет кестесіндегі бетті табу үшін соғұрлым ұзақ уақыт қажет. Сондықтан үлкен беттер үлкен көлемдегі жадты азайтылған үстеме шығындармен пайдалануға мүмкіндік береді; азырақ бет көріністері, аз бет ақаулары, үлкенірек буферлерде жылдам оқу/жазу әрекеттері. Нәтиже - өнімділікті жақсарту.

PostgreSQL Linux жүйесіндегі үлкен беттерді ғана қолдайды. Әдепкі бойынша, Linux 4 Кбайт жад беттерін пайдаланады, сондықтан жад операциялары тым көп болған жағдайда үлкенірек беттерді орнату қажет. 2 МБ және 1 ГБ дейінгі үлкен беттерді пайдаланған кезде өнімділіктің жоғарылауы байқалады. Үлкен бет өлшемін жүктеу кезінде орнатуға болады. Пәрменді пайдаланып, үлкен бет параметрлерін және олардың Linux құрылғыңызда қолданылуын оңай тексеруге болады cat /proc/meminfo | grep - мен үлкен.

Үлкен беттер туралы ақпарат алу (тек 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

Бұл мысалда үлкен бет өлшемі 2048 (2 МБ) мәніне орнатылғанымен, үлкен беттердің жалпы саны 0 мәніне орнатылған. Бұл үлкен беттердің өшірілгенін білдіреді.

Үлкен беттер санын анықтауға арналған сценарий

Бұл қарапайым сценарий үлкен беттердің қажетті санын қайтарады. PostgreSQL жұмыс істеп тұрған кезде сценарийді Linux серверінде іске қосыңыз. Айнымалы орта үшін екеніне көз жеткізіңіз $PGDATA PostgreSQL деректер каталогы көрсетілген.

Қажетті үлкен беттердің санын алу

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

Сценарий шығысы келесідей көрінеді:

Сценарий шығысы

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

Үлкен беттер үшін ұсынылатын мән - 88, сондықтан оны 88-ге орнату керек.

Үлкен беттерді орнату

sysctl -w vm.nr_hugepages=88

Қазір үлкен беттерді тексеріңіз, үлкен беттер пайдаланылмайтынын көресіз (HugePages_Free = HugePages_Total).

Үлкен беттер қайта қаралды (тек 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

Енді big_pages параметрін $PGDATA/postgresql.conf ішінде "қосулы" күйіне орнатып, серверді қайта іске қосыңыз.

Тағы да үлкен беттер туралы ақпарат (тек 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

Енді сіз өте аз үлкен беттер пайдаланылып жатқанын көре аласыз. Енді дерекқорға кейбір деректерді қосуға тырысайық.

Үлкен беттерді қайта өңдеуге арналған кейбір дерекқор операциялары

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

Енді біз бұрынғыға қарағанда үлкенірек беттерді пайдаланып жатқанымызды көрейік.

Үлкен беттер туралы қосымша ақпарат (тек 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

Енді сіз үлкен беттердің көпшілігі пайдаланылып жатқанын көре аласыз.

Ескертпе: Мұнда пайдаланылған HugePages үшін болжалды мән өте төмен, бұл өнім ортасын басқаратын құрылғы үшін қалыпты мән емес. Жүйеңізге қажетті беттер санын бағалаңыз және оларды жүктеме мен ресурстар негізінде сәйкесінше орнатыңыз.

vm.swappiness

vm.swappiness дерекқор жұмысына әсер етуі мүмкін басқа ядро ​​параметрі болып табылады. Бұл опция Linux жүйесінде айырбастау әрекетін (жадтағы және жадтағы беттерді ауыстыру) басқару үшін пайдаланылады. Мән 0-ден 100-ге дейін ауытқиды. Ол қанша жадтың беттелетінін немесе беттелетінін анықтайды. Нөл алмасу жоқ дегенді білдіреді, ал 100 агрессивті алмасуды білдіреді.

Төменгі мәндерді орнату арқылы жақсы өнімділікке қол жеткізуге болады.

Мұны жаңа ядроларда 0 мәніне орнату OOM Killer (Linux жадты тазалау процесі) процесті тоқтатуы мүмкін. Сондықтан ауыстыруды азайтқыңыз келсе, оны 1-ге орнату қауіпсіз. Linux жүйесіндегі әдепкі мән 60 болып табылады. Жоғары мән MMU (жадты басқару блогы) жедел жадқа қарағанда көбірек своп кеңістігін пайдаланады, ал төменгі мән жадта көбірек деректерді/кодты сақтайды.

Төменгі мән PostgreSQL өнімділігін жақсарту үшін жақсы ставка болып табылады.

vm.overcommit_memory / vm.overcommit_ratio

Қолданбалар жадты алады және қажет болмаған кезде оны босатады. Бірақ кейбір жағдайларда қолданба тым көп жад алады және оны босатпайды. Бұл OOM өлтірушісін тудыруы мүмкін. Мұнда ықтимал параметр мәндері берілген vm.overcommit_memory әрқайсысының сипаттамасымен:

  1. Эвристикалық асыра орындау (әдепкі); ядроға негізделген эвристикалық
  2. Қалай болғанда да артық міндеттеме беруге рұқсат етіңіз
  3. Оны асыра алмаңыз, артық міндеттеме коэффициентін асырмаңыз.

Анықтама: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — шамадан тыс жүктелу үшін қолжетімді ЖЖҚ пайызы. 50 ГБ оперативті жады бар жүйеде 2% мәні 3 ГБ жедел жадқа дейін бөлуі мүмкін.

vm.overcommit_memory үшін 2 мәні PostgreSQL үшін жақсырақ өнімділікті қамтамасыз етеді. Бұл мән сервер процесінің жедел жадын пайдалануды OOM өлтіру процесі арқылы өлтіру қаупінсіз барынша арттырады. Қолданба қайта жүктеле алады, бірақ тек асып кету шегінде, бұл OOM өлтірушінің процесті өлтіру қаупін азайтады. Сондықтан, 2 мәні әдепкі 0 мәнінен жақсы өнімділікті береді. Дегенмен, сенімділікті ауқымнан тыс жадтың шамадан тыс жүктелмеуін қамтамасыз ету арқылы жақсартуға болады. Бұл процестің OOM өлтірушісі өлтіру қаупін жояды.

Ауыстырусыз жүйелерде 2-ге тең vm.overcommit_memory ақаулығы орын алуы мүмкін.

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 дискіге жазу қажет лас беттермен толтырылған жадтың пайызы. Дискіге тазалау фондық режимде орын алады. Бұл параметрдің мәні 0-ден 100-ге дейін; дегенмен, 5-тен төмен мән тиімсіз болуы мүмкін және кейбір ядролар оны қолдамайды. Linux жүйелерінің көпшілігінде 10 әдепкі болып табылады. Жазуды қажет ететін операциялардың өнімділігін кішірек фактор арқылы жақсартуға болады, бұл Linux лас беттерді фондық режимде тазартады дегенді білдіреді.

Мәнді орнату керек vm.dirty_background_bytes дискіңіздің жылдамдығына байланысты.

Бұл екі параметр үшін «жақсы» мәндер жоқ, өйткені екеуі де аппараттық құралға тәуелді. Дегенмен, vm.dirty_background_ratio параметрін 5 мәніне және vm.dirty_background_bytes параметрін диск жылдамдығының 25%-ына орнату көп жағдайда өнімділікті ~25%-ға дейін жақсартады.

vm.dirty_ratio/dirty_bytes

Бұл сияқты vm.dirty_background_ratio/dirty_background_bytes, қайта орнату қолданбаны блоктайтын жұмысшы сеансында орындалатынын қоспағанда. Сондықтан vm.dirty_ratio мәнінен жоғары болуы керек vm.dirty_background_ratio. Бұл қолданбаны мүмкіндігінше бұғаттауға жол бермеу үшін фондық процестердің ертерек басталуын қамтамасыз етеді. Дискінің енгізу/шығару жүктемесіне байланысты осы екі қатынас арасындағы айырмашылықты реттеуге болады.

Нәтиже

Жұмысты жақсарту үшін басқа параметрлерді өзгертуге болады, бірақ жақсартулар аз болады және сіз көп пайда көрмейсіз. Барлық опциялар қолданбалардың барлық түрлеріне қатысты емес екенін есте ұстауымыз керек. Кейбір қолданбалар кейбір параметрлерді реттегенде жақсы жұмыс істейді, ал кейбіреулері реттелмейді. Күтілетін жұмыс жүктемесі мен қолданба түріне арналған осы параметрлерді теңшеу арасындағы дұрыс теңгерімді табу керек, сонымен қатар баптау кезінде ОЖ әрекетін ескеру қажет. Ядро параметрлерін конфигурациялау дерекқор параметрлерін конфигурациялау сияқты оңай емес, ұсыныстар жасау қиынырақ.

Ақпарат көзі: www.habr.com

пікір қалдыру