Иҷрои оптималии 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) = 1SHM* Тафсилот - 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).
Маслиҳат: Ин хато одатан маънои онро дорад, ки дархости PostgreSQL барои сегменти хотираи муштарак аз параметри SHMMAX ядрои шумо зиёдтар аст.
Шумо метавонед андозаи дархостро кам кунед ё ядроро бо SHMMAX калонтар аз нав танзим кунед. Барои кам кардани андозаи дархост (ҳоло 2072576 байт),
кам кардани истифодаи хотираи муштараки PostgreSQL, шояд тавассути кам кардани shared_buffers ё max_connections.
Агар андозаи дархост аллакай хурд бошад, эҳтимол дорад, ки он аз параметри SHMMIN ядрои шумо камтар бошад,
дар он сурат баланд бардоштани андозаи дархост ё аз нав танзимкунии SHMMIN талаб карда мешавад.
Ҳуҷҷатҳои PostgreSQL дорои маълумоти бештар дар бораи конфигуратсияи хотираи муштарак мебошанд. раванди кӯдак бо рамзи баромади 1 баромад
Ба ҳамин монанд, шумо метавонед ҳангоми оғоз кардани сервери PostgreSQL бо истифода аз фармон хатогӣ гиред pg_ctl.
pg_ctl Нокомӣ
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).
Маслиҳат: Ин хато одатан маънои онро дорад, ки дархости PostgreSQL барои сегменти хотираи муштарак аз параметри SHMMAX ядрои шумо зиёдтар аст.
Шумо метавонед андозаи дархостро кам кунед ё ядроро бо SHMMAX калонтар аз нав танзим кунед.; Барои кам кардани андозаи дархост (ҳоло 14385152 байт), истифодаи хотираи муштараки PostgreSQL-ро, эҳтимолан тавассути кам кардани share_buffers ё max_connections кам кунед.
Агар андозаи дархост аллакай хурд бошад, эҳтимол дорад, ки он аз параметри SHMMIN ядрои шумо камтар бошад,
дар он сурат баланд бардоштани андозаи дархост ё аз нав танзимкунии SHMMIN талаб карда мешавад.
Ҳуҷҷатҳои PostgreSQL дорои маълумоти бештар дар бораи конфигуратсияи хотираи муштарак мебошанд.
Фаҳмидани фарқиятҳо дар таърифҳо
Таърифи параметрҳои SHMMAX/SHMALL каме фарқ мекунад Linux ва MacOS X:
- Linux: kernel.shmmax, kernel.shmall
- 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 - Саҳифаҳои 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 гузошта шудааст. Ин маънои онро дорад, ки саҳифаҳои калон ғайрифаъол шудаанд.
Скрипт барои муайян кардани шумораи саҳифаҳои калон
Ин скрипти оддӣ шумораи зарурии саҳифаҳои калонро бармегардонад. Скриптро дар сервери худ иҷро кунед. Linuxҳангоми кор кардани PostgreSQL. Боварӣ ҳосил кунед, ки тағйирёбандаи муҳити зист $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 бо тавсифи ҳар як:
- Зиёд кардани эвристикӣ (пешфарз); эвристикаи ба ядро асосёфта
- Ба ҳар ҳол иҷозат диҳед
- Аз хад зиёд ичро накунед, нормаи ухдадориро барзиёд ичро накунед.
Маълумот:
vm.overcommit_ratio - фоизи RAM барои изофабори дастрас. Арзиши 50% дар системаи дорои 2 ГБ RAM метавонад то 3 ГБ RAM ҷудо кунад.
Қимати 2 барои vm.overcommit_memory иҷрои беҳтари PostgreSQL-ро таъмин мекунад. Ин арзиш истифодаи RAM-и раванди серверро бе ягон хатари назарраси кушта шудани раванди қотилони OOM ба ҳадди аксар мерасонад. Барнома метавонад дубора бор кунад, аммо танҳо дар доираи аз ҳад зиёд, ки хатари куштори қотили OOM-ро коҳиш медиҳад. Аз ин рӯ, арзиши 2 нисбат ба арзиши пешфарзии 0 иҷрои беҳтарро медиҳад. Бо вуҷуди ин, эътимоднокӣ метавонад тавассути таъмини он, ки хотираи берун аз диапазон изофабор нашавад, беҳтар карда шавад. Ин хатари аз ҷониби қотили OOM кушта шудани равандро аз байн мебарад.
Дар системаҳои бидуни иваз, мушкилот бо vm.overcommit_memory ба 2 баробар шуда метавонад.
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
