Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Транскрипсияи гузориши соли 2015 аз ҷониби Алексей Лесовский "Ба омори дохилии PostgreSQL ғарқ шавед"

Радди муаллифи гузориш: Ман қайд мекунам, ки ин гузориш моҳи ноябри соли 2015 аст - аз байн беш аз 4 сол гузашт ва вақти зиёде ҳам гузашт. Версияи 9.4, ки дар гузориш баррасӣ шудааст, дигар дастгирӣ намешавад. Дар давоми 4 соли охир, 5 нашрияи нав бароварда шуд, ки дар онҳо навоварӣ, такмил ва тағйироти зиёде дар бораи омор ба вуҷуд омадаанд ва баъзе маводҳо кӯҳна ва мувофиқ нестанд. Вақте ки ман аз назар гузаронидам, кӯшиш кардам, ки ин ҷойҳоро қайд кунам, то хонандаро гумроҳ накунам. Ман ин ҷойҳоро аз нав нанавиштам, онҳо зиёданд ва дар натиҷа гузориши тамоман дигар пайдо мешавад.

МБМ PostgreSQL як механизми азим буда, ин механизм аз зерсистемаҳои зиёд иборат аст, ки кори ҳамоҳангшудаи онҳо бевосита ба кори DBMS таъсир мерасонад. Ҳангоми кор омор ва маълумот дар бораи кори ҷузъҳо ҷамъоварӣ карда мешавад, ки ба шумо имкон медиҳад, ки самаранокии PostgreSQL-ро арзёбӣ кунед ва барои беҳтар кардани кор чораҳо андешад. Бо вуҷуди ин, ин маълумот хеле зиёд аст ва он дар шакли хеле содда оварда шудааст. Коркарди ин маълумот ва тафсири он баъзан кори комилан ночиз аст ва "боғи ҳайвонот"-и асбобҳо ва хидматрасониҳои коммуналӣ метавонад ҳатто як DBA-и пешрафтаро ба осонӣ иштибоҳ кунад.
Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский


Нимирӯзи ба хайр Номи ман Алексей аст. Тавре ки Иля гуфт, ман дар бораи омори PostgreSQL сӯҳбат мекунам.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Омори фаъолияти PostgreSQL. PostgreSQL ду омор дорад. Омори фаъолият, ки мавриди баррасӣ қарор дода мешавад. Ва омори барномарезӣ дар бораи тақсимоти маълумот. Ман махсусан дар бораи омори фаъолияти PostgreSQL сӯҳбат хоҳам кард, ки ба мо имкон медиҳад, ки корҳоро доварӣ кунем ва бо кадом роҳ онро беҳтар кунем.

Ман ба шумо мегӯям, ки чӣ гуна оморро барои ҳалли мушкилоти гуногуне, ки шумо доред ё доред, самаранок истифода баред.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Дар гузориш чӣ гуна нахоҳад буд? Дар маъруза ман ба статистикии планкаш дахл намекунам, зеро. ин як мавзӯи алоҳида барои гузориши алоҳида дар бораи чӣ гуна нигоҳ доштани маълумот дар пойгоҳи додаҳо ва чӣ гуна банақшагирии дархост дар бораи хусусиятҳои сифатӣ ва миқдорӣ тасаввурот пайдо мекунад.

Ва ҳеҷ гуна баррасиҳои асбобҳо нахоҳад буд, ман як маҳсулотро бо дигараш муқоиса намекунам. Реклама нахоҳад буд. Биёед инро тарк кунем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Ман мехоҳам ба шумо нишон диҳам, ки истифодаи омор муфид аст. Зарур аст. Онро нотарсона истифода баред. Ба мо танҳо SQL-и оддӣ ва дониши асосии SQL лозим аст.

Ва мо дар бораи он сӯҳбат хоҳем кард, ки кадом оморро барои ҳалли мушкилот интихоб кардан лозим аст.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Агар мо ба PostgreSQL нигарем ва фармонро дар системаи оператсионӣ барои дидани равандҳо иҷро кунем, мо "қуттии сиёҳ" -ро мебинем. Мо баъзе процессхоеро мебинем, ки кореро анчом медиханд ва бо номашон тахминан тасаввур кардан мумкин аст, ки онхо дар он чо чй кор мекунанд, чй кор мекунанд. Аммо, дар асл, ин як қуттии сиёҳ аст, мо наметавонем ба дохили он нигоҳ кунем.

Мо метавонем ба сарбории CPU назар кунем top, мо метавонем истифодаи хотираро аз ҷониби баъзе утилитаҳои система бубинем, аммо мо наметавонем дохили PostgreSQL-ро бубинем. Барои ин ба мо асбобҳои дигар лозиманд.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Ва минбаъд идома дода, ман ба шумо мегӯям, ки вақт дар куҷо сарф мешавад. Агар мо PostgreSQL-ро дар шакли чунин схема муаррифӣ кунем, пас ҷавоб додан мумкин аст, ки вақт дар куҷо сарф мешавад. Ин ду чиз аст: ин коркарди дархостҳои муштарӣ аз барномаҳо ва вазифаҳои заминаест, ки PostgreSQL барои нигоҳ доштани он иҷро мекунад.

Агар мо ба кунҷи чапи боло нигоҳ кунем, мо мебинем, ки дархостҳои муштарӣ чӣ гуна коркард мешаванд. Дархост аз ариза меояд ва сессияи муштарӣ барои кори минбаъда кушода мешавад. Дархост ба нақшакаш интиқол дода мешавад. Банақшагир нақшаи дархостро месозад. Онро минбаъд барои иҷроиш мефиристад. Як навъ маълумотҳои блоки I/O мавҷуд аст, ки бо ҷадвалҳо ва индексҳо алоқаманданд. Маълумоти зарурӣ аз дискҳо ба хотира дар майдони махсус бо номи "буферҳои муштарак" хонда мешавад. Натиҷаҳои дархост, агар онҳо навсозӣ ё нест карда шаванд, дар гузориши муомилот дар WAL сабт карда мешаванд. Баъзе маълумоти оморӣ ба журнал ё коллектори омор дохил мешаванд. Ва натиҷаи дархост ба муштарӣ баргардонида мешавад. Пас аз он, муштарӣ метавонад ҳама чизро бо дархости нав такрор кунад.

Мо бо вазифаҳои замина ва равандҳои замина чӣ дорем? Мо якчанд равандҳое дорем, ки пойгоҳи додаҳоро дар ҳолати муқаррарии корӣ нигоҳ медоранд. Ин равандҳо инчунин дар гузориш фаро гирифта мешаванд: инҳо автовакуум, назораткунанда, равандҳои марбут ба такрорӣ, нависандаи замина мебошанд. Ба хар яки онхо хангоми хисобот дахл мекунам.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Мушкилоти омор чист?

  • Бисёр маълумот. PostgreSQL 9.4 109 метрикаро барои дидани маълумоти омор таъмин мекунад. Аммо, агар дар базаи маълумотҳо ҷадвалҳо, схемаҳо, пойгоҳи додаҳо нигоҳ дошта шаванд, пас ҳамаи ин нишондиҳандаҳо бояд ба шумораи мувофиқи ҷадвалҳо, пойгоҳи додаҳо зарб карда шаванд. Яъне, маълумоти бештаре вуҷуд дорад. Ва дар он ғарқ шудан хеле осон аст.
  • Мушкилоти навбатӣ ин аст, ки оморро ҳисобкунакҳо нишон медиҳанд. Агар мо ба ин омор назар кунем, мо мебинем, ки ҳисобкунакҳо мунтазам афзоиш меёбанд. Ва агар аз барқарор шудани омор вақти зиёд гузашта бошад, мо миллиардҳо арзишҳоро мебинем. Ва онҳо ба мо чизе намегӯянд.
  • Таърих нест. Агар шумо ягон навъ нокомӣ дошта бошед, чизе 15-30 дақиқа пеш афтод, шумо наметавонед оморро истифода баред ва бубинед, ки 15-30 дақиқа пеш чӣ шудааст. Ин мушкилот аст.
  • Набудани асбобе, ки дар PostgreSQL сохта шудааст, мушкилот аст. Таҳиякунандагони ядро ​​ягон утилитаро таъмин намекунанд. Онҳо чунин чизе надоранд. Онҳо танҳо дар базаи маълумот омор медиҳанд. Онро истифода баред, ба он муроҷиат кунед, ҳар чӣ мехоҳед, онро иҷро кунед.
  • Азбаски дар PostgreSQL ягон асбобе мавҷуд нест, ин боиси мушкилоти дигар мегардад. Бисёр асбобҳои тарафи сеюм. Ҳар ширкате, ки каму беш дасти мустақим дорад, кӯшиш мекунад, ки барномаи худро нависад. Ва дар натиҷа, ҷомеа асбобҳои зиёде дорад, ки шумо метавонед барои кор бо омор истифода баред. Ва дар баъзе асбобҳо баъзе хусусиятҳо мавҷуданд, дар дигар асбобҳо дигар хусусиятҳо нестанд ё баъзе хусусиятҳои нав мавҷуданд. Ва вазъияте ба миён меояд, ки шумо бояд ду, се ё чор асбоберо истифода баред, ки ба ҳам мепайванданд ва вазифаҳои гуногун доранд. Ин хеле ногувор аст.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Аз ин чй бармеояд? Муҳим аст, ки оморро мустақиман гирифта тавонед, то аз барномаҳо вобаста набошед ё худатон ин барномаҳоро такмил диҳед: барои ба даст овардани фоидаи худ баъзе функсияҳоро илова кунед.

Ва ба шумо дониши асосии SQL лозим аст. Барои ба даст овардани баъзе маълумот аз омор, шумо бояд дархостҳои SQL-ро анҷом диҳед, яъне шумо бояд бидонед, ки чӣ гуна интихоб, ҳамроҳкунӣ анҷом дода мешавад.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Статистика ба мо якчанд чиз медихад. Онҳоро ба категорияҳо тақсим кардан мумкин аст.

  • Категорияи якум воқеаҳое мебошанд, ки дар базаи маълумот ба амал меоянд. Ин аст, вақте ки ягон ҳодиса дар базаи маълумот рух медиҳад: дархост, дастрасии ҷадвал, автовакуум, содирот, пас ин ҳама рӯйдодҳо мебошанд. Ҳисобкунакҳои мувофиқ ба ин рӯйдодҳо афзоиш меёбанд. Ва мо метавонем ин рӯйдодҳоро пайгирӣ кунем.
  • Категорияи дуюм хосиятҳои объектҳо ба монанди ҷадвалҳо, пойгоҳи додаҳо мебошад. Онҳо дорои хосиятҳо мебошанд. Ин андозаи ҷадвалҳост. Мо метавонем афзоиши ҷадвалҳо, афзоиши индексҳоро пайгирӣ кунем. Мо метавонем тағиротро дар динамика мебинем.
  • Ва категорияи сеюм вақти сарфшуда барои чорабинӣ мебошад. Дархост як ҳодиса аст. Он ченаки махсуси давомнокии худро дорад. Дар ин ҷо оғоз шуд, дар ин ҷо тамом шуд. Мо метавонем онро пайгирӣ кунем. Ё вақти хондани блок аз диск ё навиштан. Ин чизҳо низ пайгирӣ карда мешаванд.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Сарчашмаҳои омор ба таври зерин пешниҳод карда мешаванд:

  • Дар хотираи муштарак (буферҳои муштарак) як сегмент барои ҷойгиркунии додаҳои статикӣ вуҷуд дорад, инчунин он ҳисобкунакҳо мавҷуданд, ки ҳангоми рух додани ҳодисаҳои муайян ё баъзе лаҳзаҳо дар кори пойгоҳи додаҳо мунтазам афзоиш меёбанд.
  • Ҳамаи ин ҳисобкунакҳо барои корбар дастрас нестанд ва ҳатто ба маъмур дастрас нестанд. Ин чизҳои сатҳи паст мебошанд. Барои дастрасӣ ба онҳо, PostgreSQL интерфейсро дар шакли функсияҳои SQL таъмин мекунад. Мо метавонем бо истифода аз ин функсияҳо интихоби интихоб кунем ва як навъ метрика (ё маҷмӯи ченакҳо) ба даст орем.
  • Бо вуҷуди ин, истифодаи ин функсияҳо на ҳамеша қулай аст, бинобар ин, функсияҳо барои диданҳо (VIEWs) асос мебошанд. Ин ҷадвалҳои маҷозӣ мебошанд, ки оморро дар зерсистемаи мушаххас ё баъзе маҷмӯи рӯйдодҳои пойгоҳи додаҳо таъмин мекунанд.
  • Ин намуди дарунсохт (VIEWs) интерфейси асосии корбар барои кор бо омор мебошанд. Онҳо ба таври нобаёнӣ бидуни танзимоти иловагӣ дастрасанд, шумо метавонед онҳоро фавран истифода баред, тамошо кунед ва аз он ҷо маълумот гиред. Ва саҳмҳо низ ҳастанд. Ҳиссагузориҳо расмӣ мебошанд. Шумо метавонед бастаи postgresql-contrib-ро насб кунед (масалан, postgresql94-contrib), модули заруриро дар конфигуратсия бор кунед, параметрҳоро барои он муайян кунед, PostgreSQL-ро бозоғоз намоед ва шумо метавонед онро истифода баред. (Шарҳ. Вобаста аз тақсимот, дар версияҳои охирини саҳм бастабандӣ қисми бастаи асосӣ мебошад).
  • Ва саҳми ғайрирасмӣ вуҷуд дорад. Онҳо бо тақсимоти стандартии PostgreSQL таъмин карда намешаванд. Онҳо бояд ҳамчун китобхона тартиб дода шаванд ё насб карда шаванд. Вариантҳо метавонанд хеле гуногун бошанд, вобаста аз он ки таҳиягари ин саҳми ғайрирасмӣ чӣ кор кардааст.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Ин слайд ҳамаи он намудҳо (назаришҳо) ва баъзе аз он функсияҳоеро, ки дар PostgreSQL 9.4 дастрасанд, нишон медиҳад. Чунон ки мебинем, онхо бисьёранд. Ва ошуфта шудан хеле осон аст, агар шумо онро бори аввал аз сар гузаронед.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Аммо, агар мо расми пештараро гирем Как тратится время на PostgreSQL ва мувофиқ бо ин рӯйхат, мо ин тасвирро ба даст меорем. Ҳар як намуди (VIEWs) ё ҳар як функсия, мо метавонем бо ин ё он мақсад истифода барем, то омори мувофиқро ҳангоми кор дар PostgreSQL ба даст орем. Ва мо аллакай дар бораи кори зерсистема маълумот гирифта метавонем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Аввалин чизе, ки мо дида мебароем, ин аст pg_stat_database. Тавре ки мо мебинем, ин намояндагӣ аст. Он маълумоти зиёдеро дар бар мегирад. Маълумоти аз ҳама гуногун. Ва он дониши хеле муфидро дар бораи он чизе ки мо дар пойгоҳи додаҳо рӯй дода истодаем, медиҳад.

Мо аз он ҷо чӣ гирифта метавонем? Биёед бо соддатарин чизҳо оғоз кунем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select
sum(blks_hit)*100/sum(blks_hit+blks_read) as hit_ratio
from pg_stat_database;

Аввалин чизе, ки мо метавонем бубинем, ин фоизи хити кэш аст. Фоизи зарбаи кэш як ченаки муфид аст. Он ба шумо имкон медиҳад тахмин кунед, ки чӣ қадар маълумот аз кэши буферҳои муштарак гирифта мешавад ва чӣ қадар аз диск хонда мешавад.

Маълум аст, ки Чӣ қадаре ки кэш бештар задааст, ҳамон қадар беҳтар аст. Мо ин нишондиҳандаро ҳамчун фоиз арзёбӣ мекунем. Ва, масалан, агар мо фоизи ин хитҳои кэшро бештар аз 90% дошта бошем, ин хуб аст. Агар он аз 90% поён афтад, пас мо барои нигоҳ доштани сари гарми маълумот дар хотира хотираи кофӣ надорем. Ва барои истифодаи ин маълумот, PostgreSQL маҷбур аст, ки ба диск дастрасӣ пайдо кунад ва ин назар ба он ки маълумот аз хотира хонда шуда бошад, сусттар аст. Ва шумо бояд дар бораи зиёд кардани хотира фикр кунед: ё буферҳои муштаракро зиёд кунед ё хотираи оҳанин (RAM) зиёд кунед.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select
datname,
(xact_commit*100)/(xact_commit+xact_rollback) as c_ratio,
deadlocks, conflicts,
temp_file, pg_size_pretty(temp_bytes) as temp_size
from pg_stat_database;

Аз ин спектакль боз чй гирифтан мумкин аст? Шумо метавонед аномалияҳоеро, ки дар пойгоҳи додаҳо рух медиҳанд, дидан кунед. Дар ин ҷо чӣ нишон дода шудааст? Уҳдадориҳо, бозгаштҳо, эҷоди файлҳои муваққатӣ, андозаи онҳо, бунбастҳо ва низоъҳо мавҷуданд.

Мо метавонем ин дархостро истифода барем. Ин SQL хеле содда аст. Ва мо ин маълумотро худамон дида метавонем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Ва дар ин ҷо арзишҳои ҳадди аксар ҳастанд. Мо ба таносуби ӯҳдадориҳо ва бозгаштҳо назар мекунем. Commits тасдиқи бомуваффақияти транзаксия мебошад. Бозгаштҳо бозгашт аст, яъне транзаксия коре анҷом дод, пойгоҳи додаҳоро пуршиддат кард, чизеро баррасӣ кард ва он гоҳ нокомӣ рух дод ва натиҷаҳои транзаксия партофта мешаванд. яъне. микдори акибмондахо мунтазам меафзояд, бад аст. Ва шумо бояд аз онҳо канорагирӣ кунед ва кодро таҳрир кунед, то ин рӯй надиҳад.

Ихтилофҳо бо такрорӣ алоқаманданд. Ва онҳо низ бояд пешгирӣ карда шаванд. Агар шумо якчанд дархостҳое дошта бошед, ки дар реплика иҷро карда мешаванд ва ихтилофҳо ба миён меоянд, пас шумо бояд ин ихтилофҳоро таҳлил кунед ва бубинед, ки чӣ рӯй медиҳад. Тафсилотро дар гузоришҳо пайдо кардан мумкин аст. Ва ихтилофҳоро ҳал кунед, то дархостҳои барнома бе хато кор кунанд.

Кафомонй низ вазъияти бад аст. Вақте ки дархостҳо барои захираҳо рақобат мекунанд, як дархост ба як манбаъ дастрасӣ пайдо кард ва қулфро гирифт, дархости дуввум ба манбаи дуюм дастрасӣ пайдо кард ва қулфро низ гирифт ва сипас ҳарду дархост ба манобеи ҳамдигар дастрасӣ пайдо карданд ва мунтазири он ки ҳамсоя қуфлро озод кунад. Ин ҳам як вазъияти мушкил аст. Онҳо бояд дар сатҳи дубора навиштани барномаҳо ва силсилаи дастрасӣ ба захираҳо ҳал карда шаванд. Ва агар шумо бинед, ки бунбасти шумо пайваста афзоиш меёбад, шумо бояд ба тафсилоти гузоришҳо назар андозед, вазъиятҳои ба миён омадаро таҳлил кунед ва бубинед, ки мушкилот чӣ гуна аст.

Файлҳои муваққатӣ (temp_files) низ бад мебошанд. Вақте ки дархости корбар барои ҷойгир кардани маълумоти оперативӣ ва муваққатӣ хотираи кофӣ надорад, он дар диск файл эҷод мекунад. Ва ҳамаи амалиётҳое, ки ӯ метавонист дар буфери муваққатӣ дар хотира иҷро кунад, ӯ аллакай дар диск иҷро карданро оғоз мекунад. Ин суст аст. Ин вақти иҷрои дархостро зиёд мекунад. Ва муштарие, ки ба PostgreSQL дархост фиристодааст, каме дертар посух хоҳад гирифт. Агар ҳамаи ин амалиётҳо дар хотира иҷро карда шаванд, Postgres зудтар посух медиҳад ва муштарӣ камтар интизор мешавад.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

pg_stat_bgwriter - Ин намоиш кори ду зерсистемаи пасзаминаи PostgreSQL-ро тавсиф мекунад: checkpointer и background writer.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Барои оғози кор, биёед нуқтаҳои назоратро таҳлил кунем, ки ба ном. checkpoints. Нуқтаҳои назоратӣ чист? Нуқтаи назорат мавқеъ дар гузориши транзаксия мебошад, ки нишон медиҳад, ки ҳама тағироти додаҳо дар гузориш бо маълумоти диск бомуваффақият ҳамоҳанг карда мешаванд. Раванд вобаста ба сарбории кор ва танзимот метавонад тӯлонӣ бошад ва асосан аз ҳамоҳангсозии саҳифаҳои ифлос дар буферҳои муштарак бо файлҳои додаҳои диск иборат аст. Он барои чӣ? Агар PostgreSQL ҳама вақт ба диск дастрасӣ дошта бошад ва аз он ҷо маълумот мегирифт ва дар ҳар як дастрасӣ маълумот навишт, он суст мешуд. Аз ин рӯ, PostgreSQL як сегменти хотира дорад, ки андозаи он аз параметрҳои конфигуратсия вобаста аст. Postgres маълумоти амалиётиро дар ин хотира барои коркард ё дархости минбаъда ҷудо мекунад. Дар сурати дархостҳои тағир додани маълумот, онҳо тағир дода мешаванд. Ва мо ду версияи маълумотро мегирем. Яке дар хотира, дигаре дар диск аст. Ва давра ба давра ба шумо лозим аст, ки ин маълумотро ҳамоҳанг созед. Ба мо лозим аст, ки он чизе, ки дар хотира тағир ёфтааст, ба диск ҳамоҳанг карда шавад. Ин як нуқтаи назоратро талаб мекунад.

Нуқтаи гузаргоҳ аз буферҳои муштарак мегузарад, саҳифаҳои ифлосро қайд мекунад, ки онҳо барои гузаргоҳ заруранд. Пас аз он гузариш дуюмро тавассути буферҳои муштарак оғоз мекунад. Ва саҳифаҳое, ки барои гузаргоҳ қайд карда шудаанд, ӯ аллакай онҳоро ҳамоҳанг мекунад. Ҳамин тариқ, маълумот аллакай бо диск ҳамоҳанг карда мешавад.

Ду намуди нуқтаҳои назорат мавҷуданд. Як нуқтаи гузаргоҳ дар вақти тамомшавии вақт иҷро карда мешавад. Ин гузаргоҳ муфид ва хуб аст - checkpoint_timed. Ва нуқтаҳои гузаргоҳҳо мувофиқи талабот мавҷуданд - checkpoint required. Чунин гузаргоҳ вақте рух медиҳад, ки мо сабти маълумоти хеле калон дорем. Мо бисёр гузоришҳои муомилотро сабт кардем. Ва PostgreSQL боварӣ дорад, ки ба он лозим аст, ки ҳама инро ҳарчи зудтар ҳамоҳанг созад, гузаргоҳ созад ва идома диҳад.

Ва агар шумо ба омор назар андозед pg_stat_bgwriter ва бубинед, ки шумо чӣ доред checkpoint_req аз checkpoint_timed хеле калонтар аст, пас ин бад аст. Чаро бад? Ин маънои онро дорад, ки PostgreSQL дар ҳолати фишори доимӣ қарор дорад, вақте ки ба он маълумот ба диск навиштан лозим аст. Нуқтаи гузаргоҳ аз рӯи танаут камтар стресс аст ва мувофиқи ҷадвали дохилӣ иҷро карда мешавад ва гӯё бо мурури замон дароз карда мешавад. PostgreSQL дорои қобилияти таваққуф дар кор ва фишори зерсистемаи диск нест. Ин барои PostgreSQL муфид аст. Ва дархостҳое, ки ҳангоми гузаргоҳ иҷро мешаванд, аз банд будани зерсистемаи диск фишор намеоранд.

Ва се параметр барои танзими гузаргоҳ вуҷуд дорад:

  • сheckpoint_segments.

  • сheckpoint_timeout.

  • сheckpoint_competion_target.

Онхо ба шумо имкон медиханд, ки кори пунктхои идоракуниро назорат кунед. Аммо ман дар бораи онҳо таваққуф намекунам. Таъсири онҳо як масъалаи алоҳида аст.

Огоҳӣ: Версияи 9.4, ки дар гузориш баррасӣ шудааст, дигар аҳамият надорад. Дар версияҳои муосири PostgreSQL, параметр checkpoint_segments бо параметрҳо иваз карда мешаванд min_wal_size и max_wal_size.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Зерсистемаи навбатӣ нависандаи замина аст - background writer. Ӯ чӣ кор мекунад? Он доимо дар як ҳалқаи беохир кор мекунад. Он саҳифаҳоро ба буферҳои муштарак скан мекунад ва саҳифаҳои ифлосеро, ки дар диск пайдо мекунад, тоза мекунад. Ба хамин тарик, вай ба назоратчй ёрй мерасонад, ки дар вакти гузариш камтар кор кунад.

Ӯ боз барои чӣ лозим аст? Он зарурати саҳифаҳои тозаро дар буферҳои муштарак таъмин мекунад, агар онҳо ногаҳон (ба миқдори зиёд ва фавран) барои ҷойгир кардани маълумот талаб карда шаванд. Фарз мекунем, ки вазъияте ба миён омад, ки дархост саҳифаҳои тозаро талаб мекард ва онҳо аллакай дар буферҳои муштарак ҳастанд. Postgres backend факат онхоро гирифта истифода мебарад, худаш чизеро тоза кардан лозим нест. Аммо агар ногаҳон чунин саҳифаҳо пайдо нашаванд, пуштибон таваққуф мекунад ва ба ҷустуҷӯи саҳифаҳо шурӯъ мекунад, то онҳоро ба диск тоза кунад ва онҳоро барои эҳтиёҷоти худ бигирад - ин ба вақти дархости иҷрошаванда таъсири манфӣ мерасонад. Агар шумо мебинед, ки шумо параметр доред maxwritten_clean калон, ин маънои онро дорад, ки нависандаи замина кори худро иҷро намекунад ва шумо бояд параметрҳоро зиёд кунед bgwriter_lru_maxpagesто ки вай дар як давра бисьёртар корхоро ба чо оварад, бештар сахифахоро тоза кунад.

Ва боз як нишондиҳандаи хеле муфид аст buffers_backend_fsync. Пуштиҳо fsync-ро иҷро намекунанд, зеро он суст аст. Онҳо fsync-ро то нуқтаи санҷиши стеки IO мегузаронанд. Санҷиш навбатдории худро дорад, он давра ба давра fsync коркард мекунад ва саҳифаҳои дар хотира бударо бо файлҳои диск синхронизатсия мекунад. Агар навбати гузаргоҳ калон ва пур бошад, пас пуштибон маҷбур мешавад, ки худаш fsync -ро иҷро кунад ва ин ақибро суст мекунад, яъне муштарӣ дертар аз имконаш посух хоҳад гирифт. Агар шумо мебинед, ки шумо ин арзиш аз сифр калонтар доред, пас ин аллакай мушкилот аст ва ба шумо лозим аст, ки ба танзимоти нависандаи замина диққат диҳед ва инчунин кори зерсистемаи дискро арзёбӣ кунед.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Огоҳӣ: _Дар матни зерин назари оморӣ, ки бо такрорӣ алоқаманданд, тасвир шудааст. Аксари номҳои намуди зоҳирӣ ва функсияҳо дар Postgres 10 иваз карда шуданд. Моҳияти номҳои ивазкунӣ иваз кардани онҳо буд. xlog ба wal и location ба lsn дар номҳои функсия/намоиш ва ғайра. Мисоли махсус, функсия pg_xlog_location_diff() номида шуд pg_wal_lsn_diff()._

Мо дар ин ҷо ҳам бисёр дорем. Аммо ба мо танҳо чизҳои марбут ба ҷойгиршавӣ лозим аст.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Агар мо бубинем, ки ҳама арзишҳо баробаранд, пас ин идеал аст ва реплика аз устод қафо намемонад.

Ин мавқеи шонздаҳӣ дар ин ҷо мавқеъ дар гузориши муомилот аст. Он мунтазам меафзояд, агар дар базаи маълумот ягон фаъолият вуҷуд дошта бошад: ворид мекунад, нест мекунад ва ғайра.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

сколько записано xlog в байтах
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
лаг репликации в байтах
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
лаг репликации в секундах
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());

Агар ин чизҳо гуногун бошанд, пас як навъ ақибмонӣ вуҷуд дорад. Қафомонӣ ақибмонии реплика аз устод аст, яъне маълумот байни серверҳо фарқ мекунад.

Се сабаби таъхир вуҷуд дорад:

  • Ин зерсистемаи дискест, ки навиштани синхронизатсияи файлҳоро идора карда наметавонад.
  • Инҳо хатогиҳои эҳтимолии шабака ё изофабори шабака мебошанд, вақте ки маълумот барои расидан ба реплика вақт надорад ва онро дубора тавлид карда наметавонад.
  • Ва протсессор. Протсессор як ҳолати хеле нодир аст. Ва ман инро ду ё се маротиба дидаам, аммо ин ҳам метавонад рӯй диҳад.

Ва дар ин ҷо се дархосте ҳастанд, ки ба мо имкон медиҳанд оморро истифода барем. Мо метавонем ҳисоб кунем, ки дар сабти муомилоти мо чӣ қадар маблағ сабт шудааст. Чунин функсия вуҷуд дорад pg_xlog_location_diff ва мо метавонем қафомонии такрориро дар байтҳо ва сонияҳо ҳисоб кунем. Мо инчунин арзиши ин намудро (VIEWs) барои ин истифода мебарем.

Эзоҳ: _Ба ҷои pg_xlog_locationФунксияи diff()-ро истифода баред, шумо метавонед оператори тарҳро истифода баред ва як маконро аз макони дигар тарҳ кунед. Бароҳат.

Бо таъхир, ки дар сонияҳо аст, як лаҳза вуҷуд дорад. Агар дар усто ягон фаъолият набошад, транзаксия тақрибан 15 дақиқа пеш вуҷуд дошт ва фаъолияте вуҷуд надорад ва агар мо ба ин ақибмонӣ дар реплика назар андозем, мо 15 дақиқа ақибмондаро мебинем. Инро ба хотир овардан лозим аст. Ва вақте ки шумо ин ақибнишиниро тамошо мекунед, он метавонад ба бесарусомонӣ оварда расонад.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

pg_stat_all_tables боз як намуди муфид аст. Он оморро дар ҷадвалҳо нишон медиҳад. Вақте ки мо дар базаи маълумот ҷадвалҳо дорем, бо он ягон фаъолият вуҷуд дорад, баъзе амалҳо, мо метавонем ин маълумотро аз ин нигоҳ ба даст орем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select
relname,
pg_size_pretty(pg_relation_size(relname::regclass)) as size,
seq_scan, seq_tup_read,
seq_scan / seq_tup_read as seq_tup_avg
from pg_stat_user_tables
where seq_tup_read > 0 order by 3,4 desc limit 5;

Аввалин чизе, ки мо метавонем онро бубинем, ин сканҳои пайдарпайи ҷадвал аст. Худи шумора пас аз ин порчаҳо ҳатман бад нест ва нишон намедиҳад, ки мо бояд аллакай коре кунем.

Бо вуҷуди ин, як метрикаи дуюм вуҷуд дорад - seq_tup_read. Ин шумораи сатрҳоест, ки аз сканкунии пайдарпай баргардонида шудаанд. Агар шумораи миёна аз 1, 000, 10, 000 зиёд бошад, пас ин аллакай нишондиҳандаест, ки ба шумо лозим меояд, ки дар ҷое индекс созед, то дастрасӣ аз рӯи индекс бошад ё имкон дорад, ки дархостҳоеро, ки чунин сканҳои пайдарпайро истифода мебаранд, оптимизатсия кунед. ин тавр намешавад. буд.

Мисоли оддӣ - биёед бигӯем, ки дархост бо OFSET ва LIMIT калон ба маблағи он аст. Масалан, 100 000 сатри ҷадвал скан карда мешавад ва баъд аз он 50 000 сатри зарурӣ гирифта мешавад ва сатрҳои қаблии сканшуда партофта мешаванд. Ин ҳам як ҳолати бад аст. Ва чунин дархостҳо бояд оптимизатсия карда шаванд. Ва дар ин ҷо чунин як дархости оддии SQL мавҷуд аст, ки шумо метавонед онро бубинед ва рақамҳои гирифташударо арзёбӣ кунед.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select
relname,
pg_size_pretty(pg_total_relation_size(relname::regclass)) as
full_size,
pg_size_pretty(pg_relation_size(relname::regclass)) as
table_size,
pg_size_pretty(pg_total_relation_size(relname::regclass) -
pg_relation_size(relname::regclass)) as index_size
from pg_stat_user_tables
order by pg_total_relation_size(relname::regclass) desc limit 10;

Андозаи ҷадвалро инчунин бо истифода аз ин ҷадвал ва бо истифода аз функсияҳои иловагӣ ба даст овардан мумкин аст pg_total_relation_size(), pg_relation_size().

Умуман, метакомандҳо мавҷуданд dt и di, ки шумо метавонед дар PSQL истифода баред ва инчунин андозаи ҷадвал ва индексро бубинед.

Бо вуҷуди ин, истифодаи функсияҳо ба мо кӯмак мекунад, ки ба андозаи ҷадвалҳо ҳатто бо назардошти индексҳо ё бе назардошти индексҳо назар андозем ва аллакай дар асоси афзоиши базаи маълумот, яъне чӣ гуна он бо мо афзоиш меёбад, баъзе ҳисобҳоро анҷом диҳем. шиддат чӣ гуна аст ва аллакай дар бораи оптимизатсияи андоза баъзе хулосаҳо мебароред.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Навиштани фаъолият. Рекорд чист? Биёед ба амалиёт назар кунем UPDATE – амалиёти навсозии сатрҳо дар ҷадвал. Дар асл, навсозӣ ду амалиёт (ё ҳатто бештар) аст. Ин версияи сатри навро ворид мекунад ва версияи сатри кӯҳнаро ҳамчун кӯҳна қайд мекунад. Баъдтар, автовакуум меояд ва ин версияҳои кӯҳнаи хатҳоро тоза мекунад ва ин ҷойро ҳамчун барои истифодаи дубора дастрас қайд кунед.

Инчунин, навсозӣ танҳо дар бораи навсозии ҷадвал нест. Ин ҳоло ҳам навсозии индекс аст. Агар шумо дар ҷадвал индексҳои зиёд дошта бошед, пас бо навсозӣ, ҳамаи индексҳое, ки дар онҳо майдонҳои дар пурсиш навсозӣшуда иштирок мекунанд, низ бояд нав карда шаванд. Ин индексҳо инчунин версияҳои кӯҳнашудаи сатр доранд, ки бояд тоза карда шаванд.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select
s.relname,
pg_size_pretty(pg_relation_size(relid)),
coalesce(n_tup_ins,0) + 2 * coalesce(n_tup_upd,0) -
coalesce(n_tup_hot_upd,0) + coalesce(n_tup_del,0) AS total_writes,
(coalesce(n_tup_hot_upd,0)::float * 100 / (case when n_tup_upd > 0
then n_tup_upd else 1 end)::float)::numeric(10,2) AS hot_rate,
(select v[1] FROM regexp_matches(reloptions::text,E'fillfactor=(\d+)') as
r(v) limit 1) AS fillfactor
from pg_stat_all_tables s
join pg_class c ON c.oid=relid
order by total_writes desc limit 50;

Ва аз сабаби тарҳрезии он, UPDATE як амалиёти вазнин аст. Аммо онҳоро осонтар кардан мумкин аст. Бихӯред hot updates. Онҳо дар версияи PostgreSQL 8.3 пайдо шуданд. Ва ин чист? Ин навсозии сабукест, ки боиси аз нав сохтани индексҳо намегардад. Яъне мо сабтро нав кардем, аммо танҳо сабти саҳифа (ки ба ҷадвал тааллуқ дорад) нав карда шуд ва индексҳо ҳамоно ба ҳамон сабти саҳифа ишора мекунанд. Як каме чунин мантиқи ҷолиби кор вуҷуд дорад, вақте ки вакуум меояд, пас вай ин занҷирҳоро дорад hot аз нав месозад ва ҳама чиз бе навсозии индексҳо корашро идома медиҳад ва ҳама чиз бо сарфи камтари захираҳо рӯй медиҳад.

Ва вақте ки шумо доред n_tup_hot_upd калон, хеле хуб аст. Ин маънои онро дорад, ки навсозиҳои сабук бартарӣ доранд ва ин барои мо аз ҷиҳати захираҳо арзонтар аст ва ҳама чиз хуб аст.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

ALTER TABLE table_name SET (fillfactor = 70);

Чӣ тавр баланд бардоштани ҳаҷми hot updateов? Мо метавонем истифода барем fillfactor. Он андозаи фазои холии ҳифзшударо ҳангоми пур кардани саҳифа дар ҷадвал бо истифода аз INSERTs муайян мекунад. Ҳангоми ба ҷадвал рафтан, онҳо саҳифаро пурра пур мекунанд, дар он фазои холӣ намегузоранд. Сипас саҳифаи нав равшан карда мешавад. Маълумот аз нав пур карда мешавад. Ва ин рафтори пешфарз аст, fillfactor = 100%.

Мо метавонем омили пуркуниро ба 70% муқаррар кунем. Яъне бо варақаҳо саҳифаи нав ҷудо карда шуд, аммо танҳо 70% саҳифа пур карда шуд. Ва мо 30% захира дорем. Вақте ки ба шумо лозим аст, ки навсозӣ кунед, он эҳтимолан дар ҳамон саҳифа рӯй медиҳад ва версияи нави сатр дар ҳамон саҳифа мувофиқат мекунад. Ва hot_update анҷом дода мешавад. Ин навиштанро дар ҷадвалҳо осон мекунад.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));

Навбати автовакуум. Autovacuum чунин зерсистемаест, ки барои он дар PostgreSQL омор хеле кам аст. Мо танҳо дар ҷадвалҳои pg_stat_activity дида метавонем, ки мо дар айни замон чанд вакуум дорем. Аммо, фаҳмидан хеле душвор аст, ки ӯ дар сафар чанд миз дар навбат аст.

Эзоҳ: _Аз замони Postgres 10, вазъ дар пайгирии вакууми вакуумӣ хеле беҳтар шуд - намуди pg_stat_progress пайдо шудвакуум, ки масъалаи мониторинги автовакуумро хеле осон мекунад.

Мо метавонем ин дархости соддакардашударо истифода барем. Ва мо метавонем бубинем, ки вакуум кай бояд анҷом дода шавад. Аммо, вакуум чӣ гуна ва кай бояд оғоз шавад? Инҳо версияҳои кӯҳнаи сатрҳое мебошанд, ки ман қаблан дар бораи он гуфта будам. Навсозӣ ба амал омад, версияи нави сатр ворид карда шуд. Варианти кӯҳнашудаи сатр пайдо шуд. Ҷадвал pg_stat_user_tables чунин параметр вуҷуд дорад n_dead_tup. Он шумораи сатрҳои "мурда" -ро нишон медиҳад. Ва ҳамин ки шумораи қаторҳои мурда аз ҳадди муайян зиёд шуд, автовакуум ба сари миз меояд.

Ва ин ҳадди ақал чӣ гуна ҳисоб карда мешавад? Ин фоизи хеле мушаххаси шумораи умумии сатрҳои ҷадвал аст. Параметр мавҷуд аст autovacuum_vacuum_scale_factor. Он фоизро муайян мекунад. Фарз мекунем, ки 10% + ҳадди пойгоҳи иловагии 50 сатр мавҷуд аст. Ва чӣ мешавад? Вақте ки мо сатрҳои мурда аз "10% + 50" аз ҳамаи сатрҳои ҷадвал зиёдтар дорем, мо ҷадвалро ба автовакуум мегузорем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));

Бо вуҷуди ин, як нукта вуҷуд дорад. Ҳадди асосӣ барои параметрҳо av_base_thresh и av_scale_factor ба таври индивидуалй таъин кардан мумкин аст. Ва, мувофиқан, остона на глобалӣ, балки барои ҷадвал инфиродӣ хоҳад буд. Аз ин рӯ, барои ҳисоб кардан, дар он ҷо шумо бояд ҳилаҳо ва ҳилаҳоро истифода баред. Ва агар шумо таваҷҷӯҳ дошта бошед, шумо метавонед ба таҷрибаи ҳамкасбони мо аз Avito нигаред (пайванди слайд беэътибор аст ва дар матн нав карда шудааст).

Барои навиштанд плагини мунинки ин чизхоро ба назар мегирад. Дар ду варақ ҷома гузошта шудааст. Аммо вай дуруст ва ба таври муассир ҳисоб мекунад, ки ба мо имкон медиҳад, ки дар куҷо барои ҷадвалҳо вакууми зиёд лозим аст, дар он ҷое ки кам аст, муайян кунем.

Мо дар ин бора чӣ кор карда метавонем? Агар мо навбати тӯлонӣ дошта бошем ва автовакуум аз ӯҳдаи худ набарояд, мо метавонем шумораи коргарони чангкашакро зиёд кунем ё танҳо чангкашакро хашмгинтар созем.то ки он пештар ангеза, коркарди ҷадвал дар қисмҳои хурд. Ва ҳамин тавр, навбат кам мешавад. — Дар ин чо чизи асосй назорат кардани бори дискхо аст, зеро. Чизи вакуумӣ ройгон нест, гарчанде ки бо пайдоиши дастгоҳҳои SSD / NVMe, мушкилот камтар намоён шуд.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

pg_stat_all_indexes омор оид ба шохисҳо мебошад. Вай калон нест. Ва мо метавонем аз он дар бораи истифодаи индексҳо маълумот гирем. Ва масалан, мо метавонем муайян кунем, ки кадом индексҳои иловагӣ дорем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Тавре ки ман аллакай гуфтам, навсозӣ на танҳо навсозии ҷадвалҳо, балки навсозии индексҳо низ мебошад. Мувофиқи он, агар мо дар ҷадвал индексҳои зиёд дошта бошем, пас ҳангоми нав кардани сатрҳои ҷадвал индексҳои майдонҳои индексатсияшуда низ бояд нав карда шаванд ва агар мо индексҳои истифоданашуда дошта бошем, ки барои онҳо сканҳои индекс мавҷуд нестанд, пас онҳо ҳамчун балласт бо мо овезон мешаванд. Ва шумо бояд аз онҳо халос шавед. Барои ин ба мо майдон лозим аст idx_scan. Мо танҳо ба шумораи сканҳои индекс назар мекунем. Агар индексҳо дар муддати нисбатан тӯлонии нигоҳдории омор (на камтар аз 2-3 ҳафта) сканҳои сифр дошта бошанд, пас эҳтимолан инҳо индексҳои бад ҳастанд, мо бояд аз онҳо халос шавем.

Эзоҳ: Ҳангоми ҷустуҷӯи индексҳои истифоданашуда дар ҳолати ҷараёнҳои кластерҳои такрорӣ, шумо бояд ҳамаи гиреҳҳои кластерро тафтиш кунед, зеро омор глобалӣ нест, ва агар индекс аст, ки дар устод истифода бурда нашавад, он гоҳ мумкин аст, дар нусхаҳои истифода бурда мешавад (агар бор вуҷуд дорад).

Ду пайванд:

https://github.com/dataegret/pg-utils/blob/master/sql/low_used_indexes.sql

http://www.databasesoup.com/2014/05/new-finding-unused-indexes-query.html

Инҳо намунаҳои мукаммалтари дархост барои ҷустуҷӯи индексҳои истифоданашуда мебошанд.

Истиноди дуюм як пурсиши хеле ҷолиб аст. Дар он як мантиқи хеле ночиз вуҷуд дорад. Ман онро барои баррасӣ тавсия медиҳам.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Индексҳо боз чиро ҷамъбаст кардан лозим аст?

  • Индексхои истифоданашуда бад мебошанд.

  • Онҳо фазоро ишғол мекунанд.

  • Амалиёти навсозиро суст кунед.

  • Корҳои иловагӣ барои вакуум.

Агар мо индексҳои истифоданашударо нест кунем, пас мо танҳо базаи маълумотро беҳтар мекунем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Намоиши навбатӣ аст pg_stat_activity. Ин як аналоги хидматрасонӣ мебошад ps, танҳо дар PostgreSQL. Агар ps'ohm шумо равандҳоро дар системаи оператсионӣ тамошо мекунед, пас pg_stat_activity ба шумо фаъолиятро дар дохили PostgreSQL нишон медиҳад.

Мо аз он ҷо чӣ гирифта метавонем?

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select
count(*)*100/(select current_setting('max_connections')::int)
from pg_stat_activity;

Мо метавонем фаъолияти умумиеро, ки дар базаи маълумот рӯй дода истодааст, бубинем. Мо метавонем ҷойгиркунии нав созем. Ҳама чиз дар он ҷо таркид, пайвастҳои нав қабул карда намешаванд, хатогиҳо дар барнома мерезанд.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select
client_addr, usename, datname, count(*)
from pg_stat_activity group by 1,2,3 order by 4 desc;

Мо метавонем чунин дархостро иҷро кунем ва фоизи умумии пайвастҳоро нисбат ба маҳдудияти максималии пайвастшавӣ бубинем ва бубинем, ки мо кӣ бештар пайвастҳо дорем. Ва дар ин ҳолат мо он корбарро мебинем cron_role 508 пайваст кушода шуд. Ва чизе ба ӯ рӯй дод. Шумо бояд бо он мубориза баред ва бубинед. Ва комилан имконпазир аст, ки ин як навъ шумораи аномалии пайвастҳо бошад.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Агар мо бори OLTP дошта бошем, дархостҳо бояд зуд, хеле зуд бошанд ва набояд дархостҳои дароз дошта бошанд. Бо вуҷуди ин, агар дархостҳои дароз вуҷуд дошта бошанд, пас дар муддати кӯтоҳ ҳеҷ чиз ташвишовар нест, аммо дар муддати тӯлонӣ, дархостҳои тӯлонӣ ба пойгоҳи додаҳо зарар мерасонанд, вақте ки тақсимоти ҷадвал рух медиҳад, онҳо таъсири варамкунии ҷадвалҳоро зиёд мекунанд. Ҳам пурсишҳо ва ҳам пурсишҳои дароз бояд бартараф карда шаванд.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select
client_addr, usename, datname,
clock_timestamp() - xact_start as xact_age,
clock_timestamp() - query_start as query_age,
query
from pg_stat_activity order by xact_start, query_start;

Лутфан таваҷҷӯҳ намоед: бо чунин дархост, мо метавонем дархостҳо ва муомилоти дарозмуддатро муайян кунем. Мо функсияро истифода мебарем clock_timestamp() ки вакти кор муайян карда шавад. Дархостҳои тӯлоние, ки мо ёфтем, мо метавонем онҳоро дар хотир нигоҳ дорем, иҷро кунем explain, ба нақшаҳо назар андозед ва бо кадом роҳ оптимизатсия кунед. Мо дархостҳои дароз ҷорӣ тир ва зиндагӣ.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';

Муомилоти бад дар транзаксия бефоида ва дар муомилоти транзаксия (қатъ кардашуда) бефоида мебошанд.

Ин чӣ маъно дорад? Муомилот дорои якчанд ҳолат мебошанд. Ва яке аз ин давлатҳо метавонад ҳар вақт бигирад. Майдони муайян кардани давлатҳо вуҷуд дорад state дар ин назар. Ва мо онро барои муайян кардани давлат истифода мебарем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';

Ва чунон ки дар боло гуфтам, ин ду долат бекорӣ дар муомилот ва бекорӣ дар муомилот (қатъ карда шудааст) бад аст. Ин чист? Ин аст, ки барнома транзаксия кушод, баъзе амалҳоро анҷом дод ва ба кори худ рафт. Муомилот кушода боқӣ мемонад. Аз сабаби меъмории муҳаррики транзаксионии Postrges, он овезон аст, дар он ҳеҷ чиз рӯй намедиҳад, пайвастшавиро талаб мекунад, сатрҳои ивазшударо қуфл мекунад ва эҳтимолан то ҳол варами ҷадвалҳои дигарро зиёд мекунад. Ва ин гуна муомилот низ бояд тирандозӣ карда шавад, зеро онҳо умуман, дар ҳар сурат зарароваранд.

Агар шумо бинед, ки шумо дар базаи шумо зиёда аз 5-10-20 адад онҳоро доред, пас шумо бояд хавотир шавед ва бо онҳо кореро оғоз кунед.

Дар ин ҷо мо инчунин барои ҳисобкунии вақт истифода мебарем clock_timestamp(). Мо транзаксияҳоро анҷом медиҳем, барномаро оптимизатсия мекунем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Тавре ки ман дар боло гуфтам, қуфлҳо вақте мебошанд, ки ду ё зиёда транзаксия барои як ё як гурӯҳи захираҳо рақобат мекунанд. Барои ин мо майдон дорем waiting бо арзиши булӣ true ё false.

Дуруст - ин маънои онро дорад, ки раванд интизор аст, коре кардан лозим аст. Вақте ки раванд интизор аст, пас муштарие, ки ин равандро оғоз кардааст, низ интизор аст. Муштарӣ дар браузер нишаста ва инчунин интизор мешавад.

Огоҳӣ: _ Аз Postgres 9.6 сар карда, майдон waiting хориҷ ва бо ду майдони иттилоотии бештар иваз wait_event_type и wait_event._

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Чӣ бояд кард? Агар шумо дар муддати тӯлонӣ ҳақиқатро бинед, пас шумо бояд аз чунин дархостҳо халос шавед. Мо танҳо чунин муомилот тир. Мо ба таҳиягарон менависем, ки чӣ гуна бояд оптимизатсия карда шавад, то барои захираҳо мусобиқа вуҷуд надошта бошад. Ва он гоҳ таҳиягарон барномаро оптимизатсия мекунанд, то ин рӯй надиҳад.

Ва як ҳолати шадид, вале эҳтимолан марговар нест ба амал омадани бунбастхо. Ду транзаксия ду захираро навсозӣ карданд, пас онҳо ба онҳо дубора дастрасӣ доранд, аллакай ба захираҳои муқобил. PostgreSQL дар ин ҳолат худи транзаксияро мегирад ва мепартояд, то дигаре тавонад корро идома диҳад. Ин вазъияти сарбаста аст ва вай худро намефаҳмад. Аз ин рӯ, PostgreSQL маҷбур аст, ки чораҳои шадид андешад.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/c4_06_show_locked_queries.sql

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/show_locked_queries_95.sql

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/show_locked_queries_96.sql

http://big-elephants.com/2013-09/exploring-query-locks-in-postgres/

Ва дар ин ҷо ду дархосте ҳастанд, ки ба шумо имкон медиҳанд қуфлҳоро пайгирӣ кунед. Мо манзараро истифода мебарем pg_locks, ки ба шумо имкон медиҳад, ки қуфлҳои вазнинро пайгирӣ кунед.

Ва пайванди аввал худи матни дархост аст. Ин хеле дароз аст.

Ва истиноди дуюм мақола дар бораи қуфлҳост. Хондан фоиданок аст, хеле ҷолиб аст.

Пас, мо чиро мебинем? Мо ду дархостро мебинем. Муомилот бо ALTER TABLE муомилоти бастакунанда мебошад. Он оғоз шуд, аммо ба охир нарасид ва барномае, ки ин транзаксияро нашр кардааст, дар ҷое корҳои дигарро иҷро мекунад. Ва дархости дуюм навсозӣ аст. Пеш аз идома додани кори худ, он интизор аст, ки ҷадвали тағирёбанда ба итмом расад.

Ин аст, ки мо метавонем фаҳмем, ки кӣ киро маҳкам кардааст, кӣ киро нигоҳ медорад ва мо метавонем минбаъд бо ин кор мубориза барем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Модули навбатӣ аст pg_stat_statements. Тавре ки ман гуфтам, ин як модул аст. Барои истифодаи он, шумо бояд китобхонаи онро дар конфигуратсия бор кунед, PostgreSQL-ро аз нав оғоз кунед, модулро насб кунед (бо як фармон) ва он гоҳ мо намуди нав хоҳем дошт.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Cреднее время запроса в милисекундах
$ select (sum(total_time) / sum(calls))::numeric(6,3)
from pg_stat_statements;

Самые активно пишущие (в shared_buffers) запросы
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;

Мо аз он ҷо чӣ гирифта метавонем? Агар мо дар бораи чизҳои оддӣ гап занем, мо метавонем вақти миёнаи иҷрои дархостро гирем. Вақт меафзояд, ин маънои онро дорад, ки PostgreSQL оҳиста ҷавоб медиҳад ва коре бояд анҷом дода шавад.

Мо метавонем амалиёти хаттии фаъолтаринро дар пойгоҳи додаҳо бубинем, ки маълумотро дар буферҳои муштарак тағир медиҳанд. Бубинед, ки кӣ маълумотро дар он ҷо навсозӣ мекунад ё нест мекунад.

Ва мо метавонем танҳо ба омори мухталиф барои ин дархостҳо назар кунем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

https://github.com/dataegret/pg-utils/blob/master/sql/global_reports/query_stat_total.sql

Мо ҳастем pg_stat_statements барои сохтани гузоришҳо истифода мешавад. Мо дар як рӯз як маротиба оморро барқарор мекунем. Биёед онро ҷамъ кунем. Пеш аз барқарор кардани омор дафъаи оянда, мо гузориш месозем. Дар ин ҷо пайванд ба гузориш аст. Шумо метавонед онро тамошо кунед.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Мо чӣ кор карда истодаем? Мо омори умумии ҳама дархостҳоро ҳисоб мекунем. Сипас, барои ҳар як дархост, мо саҳми инфиродии онро ба ин омори умумӣ ҳисоб мекунем.

Ва мо чиро дида метавонем? Мо метавонем вақти умумии иҷрои ҳама дархостҳои як навъи мушаххасро дар пасманзари ҳама дархостҳои дигар бубинем. Мо метавонем ба CPU ва истифодаи I/O дар робита бо тасвири умумӣ назар кунем. Ва аллакай барои оптимизатсияи ин дархостҳо. Мо дар асоси ин гузориш саволҳои олӣ таҳия карда истодаем ва аллакай дар бораи он чизе, ки бояд оптимизатсия кунем, ғизо мегирем.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Мо дар паси парда чӣ дорем? Ҳанӯз чанд пешниҳоде ҳаст, ки ман онҳоро баррасӣ накардаам, зеро вақт маҳдуд аст.

вуҷуд доранд pgstattuple инчунин як модули иловагӣ аз бастаи саҳми стандартӣ мебошад. Он ба шумо имкон медиҳад, ки баҳо диҳед bloat ҷадвалҳо, ба ном. тақсимоти ҷадвал. Ва агар фрагментатсия калон бошад, шумо бояд онро хориҷ кунед, асбобҳои гуногунро истифода баред. Ва функсия pgstattuple муддати дароз кор мекунад. Ва чӣ қадаре ки ҷадвалҳо зиёд бошанд, ҳамон қадар дигар кор хоҳад кард.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

Саҳми навбатӣ ин аст pg_buffercache. Он ба шумо имкон медиҳад, ки буферҳои муштаракро тафтиш кунед: то чӣ андоза пуршиддат ва барои кадом ҷадвалҳо саҳифаҳои буферӣ истифода мешаванд. Ва он танҳо ба шумо имкон медиҳад, ки буферҳои муштаракро бубинед ва он чизеро, ки дар он ҷо рӯй медиҳад, арзёбӣ кунед.

Модули навбатӣ аст pgfincore. Он ба шумо имкон медиҳад, ки тавассути занги система амалҳои ҷадвали сатҳи пастро иҷро кунед mincore(), яъне он ба шумо имкон медиҳад, ки ҷадвалро ба буферҳои муштарак бор кунед ё онро холӣ кунед. Ва он, аз ҷумла, имкон медиҳад, ки кэши саҳифаи системаи оператсионӣ тафтиш карда шавад, яъне чӣ қадар ҷадвал дар кэши саҳифа, дар буферҳои муштарак ишғол мекунад ва танҳо ба шумо имкон медиҳад, ки сарбории ҷадвалро арзёбӣ кунед.

Модули навбатӣ аст pg_stat_kcache. Он инчунин занги системаро истифода мебарад getrusage(). Ва он пеш аз иҷрои дархост ва баъд аз он иҷро мекунад. Ва дар омори ба даст овардашуда, он ба мо имкон медиҳад, ки чӣ қадар дархости мо дар диски I/O, яъне амалиёт бо системаи файлӣ сарф шудааст ва ба истифодаи протсессор назар мекунад. Аммо, модул ҷавон аст (khe-khe) ва барои кори он PostgreSQL 9.4 ва pg_stat_statements, ки ман қаблан зикр кардам, талаб мекунад.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

  • Қобилияти истифодаи омор муфид аст. Ба шумо нармафзори тарафи сеюм лозим нест. Шумо метавонед назар кунед, бубинед, коре кунед, иҷро кунед.

  • Истифодаи омор осон аст, он оддии SQL аст. Шумо дархостро ҷамъ кардед, тартиб додед, фиристодаед, онро дидаед.

  • Статистика ба саволхо чавоб медихад. Агар шумо саволҳо дошта бошед, шумо ба омор муроҷиат мекунед - нигаред, хулоса кунед, натиҷаҳоро таҳлил кунед.

  • Ва таҷриба. Дархостҳои зиёд, маълумоти зиёд. Шумо ҳамеша метавонед баъзе дархостҳои мавҷударо оптимизатсия кунед. Шумо метавонед версияи шахсии дархостеро, ки ба шумо нисбат ба аслӣ мувофиқ аст, созед ва онро истифода баред.

Ба омори дохилии PostgreSQL ғарқ шавед. Алексей Лесовский

мурожиат

Истинодҳои дурусте, ки дар мақола пайдо шудаанд, дар асоси онҳо дар гузориш буданд.

Муаллиф бештар нависед
https://dataegret.com/news-blog (англ.)

Коллектори омор
https://www.postgresql.org/docs/current/monitoring-stats.html

Функсияҳои идоракунии система
https://www.postgresql.org/docs/current/functions-admin.html

Модулҳои саҳмгузорӣ
https://www.postgresql.org/docs/current/pgstatstatements.html
https://www.postgresql.org/docs/current/pgstattuple.html
https://www.postgresql.org/docs/current/pgbuffercache.html
https://github.com/klando/pgfincore
https://github.com/dalibo/pg_stat_kcache

Утилитҳои SQL ва намунаҳои рамзи sql
https://github.com/dataegret/pg-utils

Ташаккур ба ҳама барои диққататон!

Манбаъ: will.com

Илова Эзоҳ