PostgreSQLди оптималдаштыруу үчүн Linux ядросунун параметрлерин тууралоо

PostgreSQLди оптималдаштыруу үчүн Linux ядросунун параметрлерин тууралоо Оптималдуу PostgreSQL иштеши туура аныкталган операциялык системанын параметрлеринен көз каранды. Начар конфигурацияланган OS ядросунун жөндөөлөрү маалымат базасынын серверинин начар иштешине алып келиши мүмкүн. Ошондуктан, бул орнотуулар маалымат базасы серверине жана анын иш жүгүнө ылайык конфигурацияланышы керек. Бул постто биз 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 колдонот Система IPC жалпы эстутумду бөлүштүрүү. Бул параметр ядронун эң маанилүү параметрлеринин бири. Төмөнкү ката билдирүүлөрүн алган сайын, бул сизде PostgreSQLдин эски версиясы бар экенин жана сиздин SHMMAX мааниси өтө төмөн экенин билдирет. Колдонуучулар колдонууга ниеттенген жалпы эстутумга жараша бааны тууралап, көбөйтүүсү күтүлүүдө.

Мүмкүн туура эмес конфигурация каталары

Эгерде SHMMAX туура конфигурацияланбаса, сиз PostgreSQL кластерин инициализациялоого аракет кылып жатканда катаны кабыл алышыңыз мүмкүн. initdb.

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

команда syctl маанисин убактылуу өзгөртүү үчүн колдонулушу мүмкүн. Туруктуу маанилерди коюу үчүн, жазууну кошуңуз /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

Эми $PGDATA/postgresql.conf ичинде large_pages параметрин "күйгүзүү" абалына коюп, серверди өчүрүп күйгүзүңүз.

Дагы бир жолу, чоң барактар ​​жөнүндө маалымат (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 өлтүргүч процесси тарабынан өлтүрүлүп калуу коркунучу жок сервер процессинин RAM колдонуусун максималдуу кылат. Тиркеме кайра жүктөй алат, бирок ашыкча чектерде гана, бул процессти өлтүргөн OOM өлтүргүч коркунучун азайтат. Демек, 2 мааниси демейки 0 маанисине караганда жакшыраак аткарууну берет. Бирок, диапазондон тышкаркы эстутум ашыкча жүктөлбөшүн камсыздоо менен ишенимдүүлүктү жогорулатууга болот. Бул процесстин OOM өлтүргүч тарабынан өлтүрүлүү коркунучун жок кылат.

Алмашуусу жок системаларда vm.overcommit_memory 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 дискке жазуу керек болгон кир барактар ​​менен толтурулган эстутумдун пайызы. Дискке флеш фонунда пайда болот. Бул параметрдин мааниси 0дөн 100гө чейин; бирок, 5тен төмөн маани натыйжасыз болушу мүмкүн жана кээ бир ядролор аны колдобойт. 10 көпчүлүк Linux системаларында демейки болуп саналат. Жазууну интенсивдүү кылган операциялардын майнаптуулугун бир азыраак фактор менен жакшыртсаңыз болот, бул 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. Бул колдонмону мүмкүн болушунча бөгөттөөнү болтурбоо үчүн фон процесстеринин эрте башталышын камсыздайт. Бул эки катыштын ортосундагы айырманы дисктин I/O жүгүнө жараша тууралай аласыз.

жыйынтык

Майнаптуулукту жакшыртуу үчүн башка жөндөөлөрдү чыңдай аласыз, бирок жакшыртуулар минималдуу болуп, көп пайда көрбөйсүз. Биз бардык параметрлер тиркемелердин бардык түрлөрүнө тиешелүү эмес экенин унутпашыбыз керек. Кээ бир колдонмолор кээ бир жөндөөлөрдү тууралаганда жакшыраак иштейт, ал эми кээ бирлери жок. Сиз күтүлүп жаткан жумуш жүгү жана колдонмо түрү үчүн бул орнотууларды конфигурациялоонун ортосунда туура балансты табышыңыз керек, ошондой эле тюнинг учурунда OS жүрүм-турумун эске алышыңыз керек. Ядро параметрлерин конфигурациялоо маалымат базасынын параметрлерин конфигурациялоо сыяктуу оңой эмес, сунуштарды берүү кыйыныраак.

Source: www.habr.com

Комментарий кошуу