Танзими имконоти ядрои Linux барои оптимизатсияи PostgreSQL

Танзими имконоти ядрои Linux барои оптимизатсияи PostgreSQL Фаъолияти оптималии PostgreSQL аз параметрҳои дурусти системаи оператсионӣ вобаста аст. Танзимоти ядрои ОС-и суст танзимшуда метавонад ба кори сусти сервери пойгоҳи додаҳо оварда расонад. Аз ин рӯ, зарур аст, ки ин танзимот мувофиқи сервери пойгоҳи додаҳо ва сарбории кори он танзим карда шаванд. Дар ин паём, мо баъзе параметрҳои муҳими ядрои Linux-ро муҳокима хоҳем кард, ки метавонанд ба кори сервери пойгоҳи додаҳо таъсир расонанд ва чӣ гуна онҳоро танзим кунем.

SHMMAX / SHMALL

SHMMAX параметри ядроест, ки барои муайян кардани андозаи максималии як сегменти хотираи муштарак, ки раванди Linux метавонад ҷудо кунад, истифода мешавад. Пеш аз версияи 9.2, PostgreSQL System V (SysV) -ро истифода мебурд, ки танзимоти SHMMAX-ро талаб мекунад. Пас аз 9.2, PostgreSQL ба хотираи муштараки POSIX гузашт. Ҳамин тавр, ҳоло байтҳои камтари хотираи муштараки System V лозим аст.

Пеш аз версияи 9.3, SHMMAX муҳимтарин параметри ядро ​​​​буд. Қимати SHMMAX бо байт муайян карда мешавад.

Ба ҳамин монанд, ШМАЛ як параметри дигари ядроест, ки барои муайян кардан истифода мешавад
ҳаҷми умумии саҳифаҳои хотираи муштарак. Барои дидани арзишҳои ҷории 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

гурӯҳ система метавонад барои муваққатан тағир додани арзиш истифода шавад. Барои муқаррар кардани арзишҳои доимӣ, ба /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 КБ -ро истифода мебарад. Саҳифаҳои Super, ва дар Windows - Саҳифаҳои калон. Саҳифа як пораи хотираи RAM мебошад, ки барои раванд ҷудо карда шудааст. Вобаста ба талаботи хотира раванд метавонад якчанд саҳифа дошта бошад. Чӣ қадаре ки раванд хотираи бештарро талаб кунад, ҳамон қадар саҳифаҳои он бештар ҷудо карда мешаванд. OS ҷадвали тақсимоти саҳифаҳоро барои равандҳо нигоҳ медорад. Чӣ қадаре ки андозаи саҳифа хурд бошад, ҷадвал ҳамон қадар калонтар бошад, барои ёфтани саҳифа дар он ҷадвали саҳифа ҳамон қадар вақт лозим мешавад. Аз ин рӯ, саҳифаҳои калон имкон медиҳанд, ки миқдори зиёди хотира бо хароҷоти кам истифода шаванд; камтар дидани саҳифаҳо, камтар хатоҳои саҳифа, тезтар хондан/навиштан амалиёти дар буферҳои калонтар. Дар натиҷа, беҳтар шудани кор аст.

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

Акнун параметри huge_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 (шӯъбаи идоракунии хотира) фазои свопро нисбат ба RAM бештар истифода барад, дар ҳоле ки арзиши пасттар маълумот/рамзро дар хотира нигоҳ медорад.

Арзиши пасттар гарави хубест барои беҳтар шудани иҷрои 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 - фоизи RAM барои изофабори дастрас. Арзиши 50% дар системаи дорои 2 ГБ RAM метавонад то 3 ГБ RAM ҷудо кунад.

Қимати 2 барои vm.overcommit_memory иҷрои беҳтари PostgreSQL-ро таъмин мекунад. Ин арзиш истифодаи RAM-и раванди серверро бе ягон хатари назарраси кушта шудани раванди қотилони OOM ба ҳадди аксар мерасонад. Барнома метавонад дубора бор кунад, аммо танҳо дар доираи аз ҳад зиёд, ки хатари куштори қотили 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 ҳангоми танзимро ба назар гиред. Танзими параметрҳои ядро ​​​​ба монанди танзими параметрҳои пойгоҳи додаҳо осон нест; додани тавсияҳо душвортар аст.

Манбаъ: will.com

Илова Эзоҳ