Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Shqyrtimi i raportit të vitit 2015 të Alexey Lesovskyy "Deep dive into PostgreSQL internal statistics"

Kufizimi nga autori i raportit: Dua tĂ« theksoj se ky raport daton nga nĂ«ntori 2015 — kanĂ« kaluar mĂ« shumĂ« se 4 vjet dhe ka kaluar shumĂ« kohĂ«. Versioni i diskutuar nĂ« raportin 9.4 tashmĂ« nuk mbĂ«shtetet. GjatĂ« kĂ«tyre 4 viteve kanĂ« dalĂ« 5 lĂ«shime tĂ« reja nĂ« tĂ« cilat janĂ« shfaqur shumĂ« novita, pĂ«rmirĂ«sime dhe ndryshime nĂ« lidhje me statistikĂ«n dhe njĂ« pjesĂ« e materialit Ă«shtĂ« bĂ«rĂ« e tejkaluar dhe e papĂ«rshtatshme. GjatĂ« rishikimit kam pĂ«rpiqur tĂ« shĂ«noj kĂ«to pika pĂ«r tĂ« mos tĂ« futur ty, lexues i dashur, nĂ« keqkuptim. Nuk kam bĂ«rĂ« rishkrim tĂ« kĂ«tyre vendeve sepse janĂ« shumĂ« dhe do tĂ« rezultonte nĂ« njĂ« raport krejt tjetĂ«r.

Sistemi i Menaxhimit të Novacioneve PostgreSQL është një mekanizëm i madh, i cili përbëhet nga shumë njesi të sistemit, nga puna e mirë e të cilave varet direkt performanca e sistemit. Gjatë operimit, mbledhja e statistikave dhe informacionit mbi funksionimin e komponentëve sigurohet, e cila lejon të vlerësohet efektiviteti i PostgreSQL dhe të merren masa për rritjen e performancës. Megjithatë, ka shumë informacion dhe ai është i paraqitur në një formë mjaft të thjeshtë. Trajtimi i këtij informacioni dhe interpretimi i tij shpesh është një detyrë e paparashikueshme, dhe "zoo" e mjeteve dhe utilitarëve lehtësisht mund të konfuzojë edhe një DBA të avancuar.
Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski


Luaj videon

Mirë dita! Më quaj Alexey. Siç tha Ilya, unë do të flas për statistikat e PostgreSQL.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Statistikat e aktivitetit të PostgreSQL. PostgreSQL ka dy statistika. Statistika e aktivitetit, për të cilën do të flas. Dhe statistika e planifikuesit për shpërndarjen e të dhënave. Unë do të flas pikërisht për statistikat e aktivitetit të PostgreSQL, të cilat na lejojnë të gjykojmë mbi performancën dhe si ta përmirësojmë atë.

Do të flas se si të përdorim me efikasitet statistikat për të zgjidhur probleme të ndryshme që keni ose mund të keni.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

ÇfarĂ« nuk do tĂ« jetĂ« nĂ« raport? NĂ« raport nuk do tĂ« flas pĂ«r statistikat e planifikuesit, pasi kjo Ă«shtĂ« njĂ« temĂ« e veçantĂ« pĂ«r njĂ« raport tjetĂ«r mbi atĂ« se si tĂ« dhĂ«nat ruhen nĂ« bazĂ« dhe si planifikuesi i kĂ«rkesave merr njĂ« ide mbi karakteristikat cilĂ«sore dhe sasiore tĂ« kĂ«tyre tĂ« dhĂ«nave.

Dhe nuk do të ketë pasqyrash të mjeteve, nuk do të krahasoj një produkt me tjetrin. Nuk do të ketë as reklama. Ta lëmë këtë pas.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Dua t'ju tregoj se pĂ«rdorimi i statistikave Ă«shtĂ« i dobishĂ«m. ËshtĂ« e nevojshme. PĂ«rdorimi i saj nuk Ă«shtĂ« frikshĂ«m. Na nevojiten vetĂ«m SQL standard dhe njohuri themelore mbi SQL.

Dhe do të flasim se çfarë statistikash të zgjidhni për probleme.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Nëse e shohim PostgreSQL dhe në sistemin operativ ekzekutojmë një komandë për të parë proceset, do të shohim një "kutinë e zezë". Do të shohim disa procese që bëjnë diçka dhe nga emri mund të imagjinojmë se çfarë po bëjnë. Por, në thelb, kjo është një kutisë e zezë, nuk mund të shohim brenda.

Mund të shohim ngarkesën e procesorit në top, mund të shohim përdorimin e memories me disa utilitete sistemike, por nuk do të arrijmë të shohim brenda PostgreSQL. Për këtë na nevojiten mjete të tjera.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Dhe duke vazhduar, do të flas për ku shpenzohet koha. Nëse e imagjinojmë PostgreSQL si një të tillë skemë, do të mund të përgjigjemi ku shpenzohet koha. Këto janë dy gjëra: përpunimi i kërkesave të klientëve nga aplikacionet dhe detyrat pas skenës që PostgreSQL kryen për të ruajtur funksionalitetin e tij.

Nëse fillojmë të shqyrtojmë nga gjëja e majtë e sipërme, mund të ndjekim se si përpunohen kërkesat e klientëve. Kërkesa vjen nga aplikacioni dhe për të vazhduar hapet një sesion klienti. Kërkesa i kalon planifikuesit. Planifikuesi ndan një plan për kërkesën. E dërgon më pas për përmbushje. Ndodhin disa hyrje-dalje bllokesh të dhënash të lidhura me tabelat dhe indekset. Të dhënat e nevojshme lexohen nga disku në memorie në një zonë të veçantë "shared buffers". Rezultatet e kërkesës, nëse janë për azhurnime, fshirje, regjistrohen në logfile-n e transaksioneve në WAL. Informacioni statistik qëndron në log ose te kolektori i statistikave. Dhe rezultati i kërkesës i kthehet tashmë klientit. Pas kësaj, klienti mund ta përsërisë të gjithë procesin nga fillimi me një kërkesë të re.

ÇfarĂ« ndodh me detyrat dhe proceset pas skenĂ«s? Ne kemi disa procese qĂ« sigurojnĂ« funksionalitetin dhe mbajnĂ« bazĂ«n e tĂ« dhĂ«nave nĂ« njĂ« gjendje normale tĂ« punĂ«s. KĂ«to procese gjithashtu do tĂ« preken nĂ« raport: autovacuum, checkpointer, proceset e lidhura me replikimin, background writer. Secilin nga ata do ta diskutoj gjatĂ« raportit.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Cilat janë problemet me statistikat?

  • Ka shumĂ« informacione. PostgreSQL 9.4 ofron 109 metrika pĂ«r tĂ« parĂ« tĂ« dhĂ«nat statistikore. SidoqoftĂ«, nĂ«se nĂ« bazĂ«n e tĂ« dhĂ«nave ruhet shumĂ« tabela, skema, baza, tĂ« gjitha kĂ«to metrika do tĂ« duhet tĂ« shumĂ«zohen me numrin pĂ«rkatĂ«s tĂ« tabelave, bazave. Kjo do tĂ« thotĂ« qĂ« informacioni bĂ«het edhe mĂ« i madh. Dhe Ă«shtĂ« shumĂ« e lehtĂ« tĂ« humbasĂ«sh nĂ« tĂ«.
  • Problemi tjetĂ«r Ă«shtĂ« se statistikat janĂ« tĂ« paraqitura si numĂ«rues. NĂ«se shohim kĂ«to statistika, do tĂ« shohim numĂ«rues qĂ« rriten vazhdimisht. Dhe nĂ«se ka kaluar shumĂ« kohĂ« qĂ« nga rivarrosja e statistikave, do tĂ« shohim vlera nĂ« miliarda. Dhe ato nuk na thonĂ« asgjĂ«.
  • Nuk ka histori. NĂ«se keni pasur ndonjĂ« gabim, diçka ka rĂ«nĂ« 15-30 minuta mĂ« parĂ«, nuk do tĂ« jeni nĂ« gjendje tĂ« pĂ«rdorni statistikat dhe tĂ« shihni se çfarĂ« ndodhi 15-30 minuta mĂ« parĂ«. Kjo Ă«shtĂ« njĂ« problem.
  • Mungesa e njĂ« mjeti tĂ« integruar nĂ« PostgreSQL Ă«shtĂ« njĂ« problem. Zhvilluesit e thelbit nuk ofrojnĂ« asnjĂ« utilitar. Nuk kanĂ« asgjĂ« tĂ« tillĂ«. Ata thjesht japin statistikĂ«n nĂ« bazĂ«. PĂ«rdorni, bĂ«ni kĂ«rkesa, bĂ«ni çfarĂ« tĂ« doni.
  • Duke qenĂ« se nuk ka njĂ« mjet tĂ« integruar nĂ« PostgreSQL, kjo Ă«shtĂ« njĂ« arsye pĂ«r njĂ« problem tjetĂ«r. ShumĂ« mjete tĂ« jashtme. Çdo kompani qĂ« ka pak pĂ«rvojĂ« pĂ«rpiqet tĂ« shkruajĂ« programin e saj. Dhe nĂ« fund nĂ« komunitet ka shumĂ« mjete qĂ« mund tĂ« pĂ«rdoren pĂ«r tĂ« punuar me statistikat. Disa mjete kanĂ« disa mundĂ«si, tĂ« tjera nuk kanĂ« disa mundĂ«si apo kanĂ« disa mundĂ«si tĂ« reja. Dhe ndodh qĂ« duhet tĂ« pĂ«rdorni dy-tre-katĂ«r mjete qĂ« mbivendosen me njĂ«ra-tjetrĂ«n dhe kanĂ« funksione tĂ« ndryshme. Kjo Ă«shtĂ« shumĂ« e pakĂ«ndshme.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

ÇfarĂ« duhet tĂ« nxjerrim nga kjo? ËshtĂ« e rĂ«ndĂ«sishme tĂ« dish tĂ« marrĂ«sh statistikat drejtpĂ«rdrejt, pĂ«r tĂ« mos vare nga programet, ose ndryshe tĂ« pĂ«rmirĂ«sosh kĂ«to programe: tĂ« shtosh disa funksione, pĂ«r tĂ« fituar pĂ«rfitime.

Dhe nevojiten njohuri bazike SQL. Për të marrë disa të dhëna nga statistikat, është e nevojshme të formulohet pyetje SQL, pra duhet të dinë si të përgatiten SELECT, JOIN.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Statistika na ofron disa gjëra. Ato mund të ndahen në kategori.

  • Kategoria e parĂ« Ă«shtĂ« ngjarjet qĂ« ndodhin nĂ« bazĂ«. Kjo Ă«shtĂ« kur ndodhin disa ngjarje nĂ« bazĂ«: kĂ«rkesa, qasje nĂ« tabelĂ«, autovakuum, komitĂ«t, ato janĂ« tĂ« gjitha ngjarje. Numrat pĂ«rkatĂ«s pĂ«r kĂ«to ngjarje rriten. Dhe ne mund tĂ« ndjekim kĂ«to ngjarje.
  • Kategoria e dytĂ« Ă«shtĂ« pronat e objekteve siç janĂ« tabelat, bazat. Ato kanĂ« pronat e tyre. Kjo Ă«shtĂ« madhĂ«sia e tabelave. Mund tĂ« ndjekim rritjen e tabelave, rritjen e indekseve. Mund tĂ« shohim ndryshimet nĂ« dinamikĂ«.
  • Dhe kategoria e tretĂ« Ă«shtĂ« koha e shpenzuar pĂ«r njĂ« ngjarje. KĂ«rkesa Ă«shtĂ« njĂ« ngjarje. Ajo ka njĂ« masĂ« tĂ« veçantĂ« tĂ« kohĂ«zgjatjes. KĂ«tu ka filluar, kĂ«tu ka pĂ«rfunduar. Ne mund ta ndjekim kĂ«tĂ«. Ose koha e leximit tĂ« bllokut nga disku ose e shkruarjes. TĂ« tilla gjĂ«ra gjithashtu ndoqen.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Burimet e statistikave paraqiten si më poshtë:

  • NĂ« memorien e ndarĂ« (shared buffers) ka njĂ« segment pĂ«r vendosjen e tĂ« dhĂ«nave statistikore, aty janĂ« edhe ato numra qĂ« vazhdimisht rriten kur ndodhin disa ngjarje, ose ndodhin disa momente nĂ« punĂ«n e bazĂ«s.
  • TĂ« gjitha kĂ«to numĂ«rues janĂ« tĂ« papĂ«rshtatshĂ«m pĂ«r pĂ«rdoruesit dhe madje edhe pĂ«r administratorĂ«t. KĂ«to janĂ« gjĂ«ra nĂ« nivel tĂ« ulĂ«t. PĂ«r t'u adresuar, PostgreSQL ofron njĂ« ndĂ«rfaqe nĂ« formĂ«n e funksioneve SQL. Ne mund tĂ« bĂ«jmĂ« zgjedhje pĂ«rmes kĂ«tyre funksioneve dhe tĂ« marrim ndonjĂ« metrikĂ« (ose njĂ« grup metrikash).
  • MegjithatĂ«, pĂ«rdorimi i kĂ«tyre funksioneve nuk Ă«shtĂ« gjithmonĂ« i pĂ«rshtatshĂ«m, prandaj funksionet janĂ« baza pĂ«r pamjet (VIEWs). KĂ«to janĂ« tabela virtuale qĂ« ofrojnĂ« statistika pĂ«r njĂ« nĂ«n-sistem tĂ« caktuar ose pĂ«r njĂ« grup ngjarjesh nĂ« bazĂ«n e tĂ« dhĂ«nave.
  • KĂ«to pamje tĂ« ndĂ«rtuara (VIEWs) janĂ« ndĂ«rfaqja kryesore e pĂ«rdoruesit pĂ«r tĂ« punuar me statistikĂ«n. Ato janĂ« tĂ« disponueshme siç janĂ«, pa ndonjĂ« konfigurim shtesĂ«, mund t'i pĂ«rdorni menjĂ«herĂ«, tĂ« shihni, tĂ« merrni informacion nga ato. Po ashtu ka dhe contrib. Contrib janĂ« zyrtare. Ju mund tĂ« instaloni pakon postgresql-contrib (p.sh., postgresql94-contrib), tĂ« ngarkoni modulin e nevojshĂ«m nĂ« konfigurim, tĂ« pĂ«rcaktoni parametrat pĂ«r tĂ«, tĂ« ribotoni PostgreSQL dhe mund ta pĂ«rdorni. (ShĂ«nim. NĂ« varĂ«si tĂ« distribucionit, nĂ« versionet mĂ« tĂ« reja paketa contrib Ă«shtĂ« pjesĂ« e paketĂ«s kryesore.).
  • Dhe ka contrib jozyrtare. Ato nuk ofrohen nĂ« instalimin standard tĂ« PostgreSQL. Duhet tĂ« kompilohen ose tĂ« instalohen si bibliotekĂ«. Mund tĂ« ketĂ« variacione tĂ« ndryshme, nĂ« varĂ«si tĂ« asaj qĂ« ka shpikur zhvilluesi i kĂ«saj contrib-je jozyrtare.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Në këtë slide paraqiten të gjitha ato pamje (VIEWs) dhe disa nga ato funksione që janë të disponueshme në PostgreSQL 9.4. Siç shohim, ka shumë prej tyre. Dhe është mjaft e lehtë të ngatërrohemi, nëse përballeni për herë të parë me këtë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

MegjithatĂ«, nĂ«se marrim imazhin e mĂ«parshĂ«m Si harxhohet koha nĂ« PostgreSQL dhe e krahasojmĂ« me kĂ«tĂ« listĂ«, do tĂ« marrim njĂ« pamje tĂ« tillĂ«. Çdo pamje (VIEWs) ose çdo funksion mund ta pĂ«rdorim pĂ«r qĂ«llime tĂ« ndryshme pĂ«r tĂ« marrĂ« statistikĂ« pĂ«rkatĂ«se, kur PostgreSQL Ă«shtĂ« duke punuar. Dhe mund tĂ« marrim tashmĂ« disa informacione mbi funksionimin e nĂ«n-sistemit.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

E para që do të shqyrtojmë është pg_stat_database. Siç shohim, kjo është një pamje. Ka shumë informacion. Një informacion shumë i larmishëm. Dhe ai ofron njohuri shumë të dobishme për atë që po ndodh në bazën e të dhënave.

ÇfarĂ« mund tĂ« pĂ«rdorim nga aty? Le tĂ« fillojmĂ« me gjĂ«rat mĂ« tĂ« thjeshta.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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

E para qĂ« mund tĂ« shohim – Ă«shtĂ« pĂ«rqindja e goditjeve nĂ« memorie. PĂ«rqindja e goditjeve nĂ« memorie Ă«shtĂ« njĂ« metrikĂ« e dobishme. Ajo lejon tĂ« vlerĂ«sojmĂ« se sa pĂ«rqind e tĂ« dhĂ«nave merret nga memoria e ndarĂ« dhe sa shkarkohet nga disku.

Natyrisht, sa më shumë goditje që kemi në memorie, aq më mirë. Ne e vlerësojmë këtë metrikë si përqindje. Dhe, për shembull, nëse kemi një përqindje të këtyre goditjeve në memorie më të madhe se 90%, atëherë kjo është mirë. Nëse ai bie nën 90%, atëherë kemi mungesë memorjeje për të mbajtur "kokën" e nxehtë të të dhënave në memorje. Dhe për të përdorur këto të dhëna, PostgreSQL është i detyruar të bëjë thirrje në disk dhe kjo është më e ngadalshme se sa të dhënat që lexohen nga memoria. Duhet tashmë të mendojmë për rritjen e memorjes: ose të rrisim buffer-at e ndarjes, ose të zgjerim kujtesën (RAM).

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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;

ÇfarĂ« mund tĂ« marrim gjithashtu nga kjo paraqitje? Mund tĂ« shohim anomali qĂ« ndodhin nĂ« bazĂ«. ÇfarĂ« shikohet kĂ«tu? KĂ«tu ka commits, rollbacks, krijimin e skedarĂ«ve temporarĂ«, volumin e tyre, deadlocks dhe konflikte.

Mund të përfitojmë nga ky kërkesë. Ky SQL është mjaft i thjeshtë. Dhe mund të shohim këto të dhëna për veten tonë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Dhe kĂ«tu menjĂ«herĂ« janĂ« vlerat pĂ«rcaktuese. Ne shohim raportin midis commits dhe rollbacks. Commits – Ă«shtĂ« miratimi i suksesshĂ«m tĂ« transaksionit. Rollbacks – Ă«shtĂ« kthimi prapa, dmth. transaksioni bĂ«nte ndonjĂ« punĂ«, ngarkonte bazĂ«n, ndonjĂ«herĂ« llogariste, dhe pastaj ndodhi njĂ« dĂ«shtim, dhe rezultatet e transaksionit hidhen poshtĂ«. Dmth. numri i rollbacks, qĂ« rritet vazhdimisht, Ă«shtĂ« e keqe. Dhe duhet ndonjĂ«herĂ« tĂ« shmangen dhe tĂ« rregullohen kodet qĂ« tĂ« mos ndodhin kĂ«shtu.

Konfliktet (conflicts) janë të lidhura me replikimin. Dhe ato gjithashtu duhet të shmangen. Nëse keni ndonjë kërkesë që ekzekutohet në replikë dhe ndodhin konflikte, atëherë duhet të shqyrtoni këto konflikte, të shihni çfarë ndodh. Detajet mund të gjenden në log-et. Dhe të eliminohet situatat konfliktuale, që kërkesat e aplikacionit të punojnë pa gabime.

Deadlocks – kjo Ă«shtĂ« gjithashtu njĂ« situatĂ« e keqe. Kur kĂ«rkesat luftojnĂ« pĂ«r burimet, njĂ« kĂ«rkesĂ« i Ă«shtĂ« drejtuar njĂ« burimi dhe ka marrĂ« bllokim, kĂ«rkesa e dytĂ« i Ă«shtĂ« drejtuar njĂ« burimi tĂ« dytĂ« dhe gjithashtu ka marrĂ« bllokim, dhe pastaj tĂ« dyja kĂ«rkesat i janĂ« drejtuar burimeve tĂ« njĂ«ra-tjetrĂ«s dhe janĂ« bllokuar nĂ« pritje qĂ« fqinja tĂ« lirojĂ« bllokimin. Kjo Ă«shtĂ« gjithashtu njĂ« situatĂ« problematike. Ato duhet tĂ« zgjidhen nĂ« nivelin e rishkrimit tĂ« aplikacioneve dhe serializimit tĂ« aksesit nĂ« burime. Dhe nĂ«se shihni qĂ« deadlocks rriten vazhdimisht, duhet tĂ« shihni detajet nĂ« log-e, tĂ« shqyrtoni situatat nĂ« ngritje dhe tĂ« shihni nĂ« çfarĂ« problemi Ă«shtĂ«.

SkedarĂ«t temporarĂ« (temp_files) – kjo Ă«shtĂ« gjithashtu e keqe. Kur kĂ«rkesĂ«s sĂ« pĂ«rdoruesit i mungon memoria pĂ«r tĂ« ruajtur tĂ« dhĂ«nat operativĂ«, ajo krijon njĂ« skedar nĂ« disk. Dhe tĂ« gjitha operacionet qĂ« do tĂ« kishte mundur tĂ« kryente nĂ« buffer-in temporar nĂ« memoria, fillon t'i kryejĂ« tashmĂ« nĂ« disk. Kjo Ă«shtĂ« e ngadaltĂ«. Kjo rrit kohĂ«n e ekzekutimit tĂ« kĂ«rkesĂ«s. Dhe klienti, qĂ« ka dĂ«rguar kĂ«rkesĂ«n nĂ« PostgreSQL do tĂ« marrĂ« pĂ«rgjigje pak mĂ« vonĂ«. NĂ«se kĂ«to operacione tĂ« gjitha do tĂ« kryheshin nĂ« memoria, Postgres do tĂ« pĂ«rgjigjej shumĂ« mĂ« shpejt dhe klienti do tĂ« priste mĂ« pak.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Pg_stat_bgwriter – kjo paraqitje pĂ«rshkruan punĂ«n e dy sistemeve tĂ« prapambetjes nĂ« PostgreSQL: kĂ«to janĂ« checkpointer dhe background writer.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Le tĂ« fillojmĂ« me pikĂ«t e kontrollit, tĂ« njohura si checkpoint. ÇfarĂ« janĂ« pikĂ«t e kontrollit? NjĂ« pikĂ« kontrolli Ă«shtĂ« njĂ« pozicion nĂ« ditarin e transaksioneve qĂ« informon se tĂ« gjitha ndryshimet e dhĂ«nave qĂ« janĂ« regjistruar nĂ« ditar janĂ« sinkronizuar me sukses me tĂ« dhĂ«nat nĂ« disk. Procesi, nĂ« varĂ«si tĂ« ngarkesĂ«s dhe konfigurimeve, mund tĂ« jetĂ« i gjatĂ« dhe pĂ«rfshin kryesisht sinkronizimin e faqeve tĂ« pista nĂ« memorien e ndarĂ« me datat e skedarĂ«ve nĂ« disk. Pse Ă«shtĂ« e nevojshme? NĂ«se PostgreSQL do tĂ« ishte gjithmonĂ« duke iu drejtuar diskut pĂ«r tĂ« marrĂ« tĂ« dhĂ«na dhe pĂ«r tĂ« regjistruar tĂ« dhĂ«na me çdo kĂ«rkesĂ«, do tĂ« ishte ngadalĂ«. Prandaj, PostgreSQL ka njĂ« segment memorije, madhĂ«sia e tĂ« cilit varet nga parametrat nĂ« konfigurim. Postgres vendos nĂ« kĂ«tĂ« memorie tĂ« dhĂ«nat operative pĂ«r pĂ«rpunim tĂ« mĂ«vonshĂ«m ose pĂ«r t'u dhĂ«nĂ« pĂ«rgjigje kĂ«rkesave. NĂ« rast tĂ« kĂ«rkesave pĂ«r ndryshimin e tĂ« dhĂ«nave, ndodhin ndryshime. Dhe ne marrim dy versione tĂ« tĂ« dhĂ«nave. NjĂ«ra Ă«shtĂ« nĂ« memorie, tjetra nĂ« disk. Dhe herĂ« pas here na nevojitet tĂ« sinkronizojmĂ« kĂ«to tĂ« dhĂ«na. Na duhet ajo qĂ« Ă«shtĂ« ndryshuar nĂ« memorie, tĂ« sinkronizohet nĂ« disk. PĂ«r kĂ«tĂ« janĂ« tĂ« nevojshme pikĂ«t e kontrollit.

Pika e kontrollit kalon nëpër memorien e ndarë, shënon faqet e pista se ato janë të nevojshme për pikën e kontrollit. Më pas fillon një kalim të dytë nëpër memorien e ndarë. Dhe faqet, që janë shënuar për pikën e kontrollit, ai tashmë i sinkronizon. Kështu realizohet sinkronizimi i të dhënave me diskun.

EkzistojnĂ« dy tipa pikash kontrolli. NjĂ« pikĂ« kontrolli ekzekutohet sipas njĂ« kohĂ«zgjatjeje. Kjo Ă«shtĂ« njĂ« pikĂ« kontrolli e dobishme dhe e mirĂ« – checkpoint_timed. Dhe ka pika kontrolli sipas kĂ«rkesĂ«s – checkpoint required. NjĂ« pikĂ« kontrolli e tillĂ« ndodh kur kemi njĂ« shkarkim tĂ« madh tĂ« tĂ« dhĂ«nave. Ne kemi regjistruar shumĂ« ditarĂ« transaksionesh. Dhe PostgreSQL mendon se duhet t'i sinkronizojĂ« sa mĂ« shpejt tĂ« jetĂ« e mundur, tĂ« bĂ«jĂ« njĂ« pikĂ« kontrolli dhe tĂ« vazhdojĂ« pĂ«rpara.

Dhe nëse shikoni statistikat pg_stat_bgwriter dhe shihni se keni checkpoint_req është shumë më i lartë se checkpoint_timed, atëherë kjo është e keqe. Pse është e keqe? Kjo do të thotë se PostgreSQL është në një situatë të vazhdueshme stresi, kur duhet të regjistrojë të dhëna në disk. Pika e kontrollit sipas kohës është më pak stresuese dhe kryhet sipas një orari të brendshëm dhe siç duket është e shtrirë në kohë. PostgreSQL ka mundësinë të bëjë pushime në punë dhe të mos ngarkojë sistemin e diskut. Kjo është e dobishme për PostgreSQL. Dhe kërkesat që ekzekutohen gjatë pikës së kontrollit nuk do të përjetojnë stresin nga ngarkesa e sistemit të diskut.

Dhe për të rregulluar pikën e kontrollit ka tre parametra:

  • checkpoint_segments.

  • checkpoint_timeout.

  • checkpoint_competion_target.

KĂ«ta lejojnĂ« rregullimin e funksionimit tĂ« pikave tĂ« kontrollit. Por nuk do tĂ« ndalem shumĂ« te kĂ«ta. Ndikimi i tyre – Ă«shtĂ« njĂ« temĂ« e veçantĂ«.

Kujdes: Versioni i shqyrtuar në raport, 9.4, tashmë është i papërdorur. Në versionet moderne të PostgreSQL, parametri checkpoint_segments është zëvendësuar me parametrat min_wal_size dhe max_wal_size.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

NĂ«n-sistemi i ardhshĂ«m Ă«shtĂ« shkruesi i sfondit — background writer. ÇfarĂ« bĂ«n ai? Ai punon vazhdimisht nĂ« njĂ« cikĂ«l tĂ« pafund. Skanon faqet nĂ« buffers tĂ« pĂ«rbashkĂ«t dhe faqet e ndotura qĂ« ka gjetur i shkarkon nĂ« disk. NĂ« kĂ«tĂ« mĂ«nyrĂ« ai ndihmon checkpointer-in tĂ« bĂ«jĂ« mĂ« pak punĂ« gjatĂ« procesit tĂ« ekzekutimit tĂ« pikave tĂ« kontrollit.

Për çfarë tjetër është i nevojshëm? Ai siguron nevojën për faqe të pastra në buffers të përbashkët nëse ato papritur nevojiten (në numër të madh dhe menjëherë) për vendosjen e të dhënave. Supozoni se ndodh një situatë kur për të ekzekutuar një kërkesë janë të nevojshme faqe të pastra dhe ato janë tashmë në buffers të përbashkët. PostgreSQL backend thjesht i merr ato dhe i përdor, nuk ka nevojë të pastrojë asgjë vetë. Por nëse ndodhin që të mos ketë faqe të tilla, backend ndalon punën dhe fillon kërkimin e faqeve për t'i shkarkuar në disk dhe t'i marrë për nevojat e tij - kjo ndikon negativisht në kohën e ekzekutimit aktual të kërkesës. Nëse shihni se parametri juaj maxwritten_clean është i madh, kjo do të thotë se background writer nuk po përballon punën e tij dhe duhet të rriten parametrat bgwriter_lru_maxpages, që ai të mund të bëjë më shumë punë në një cikël dhe të pastrojë më shumë faqe.

Dhe një tregues tjetër shumë të dobishëm është buffers_backend_fsync. Backend-et nuk bëjnë fsync, sepse kjo është e ngadalshme. Ata e transferojnë fsync lart në stack-un IO tek checkpointer-i. Checkpointer-i ka radhën e tij, ai përherë fsync e përpunon dhe sinkronizon faqet në memorie me skedarët në disk. Nëse radhë e checkpointer-it është e madhe dhe e mbushur, atëherë backend-i është i detyruar të bëjë vetë fsync dhe kjo ngadalëson punën e backend-it,dmth. klienti do të marrë përgjigje më vonë se sa mund të kishte. Nëse shihni se kjo vlerë është më e madhe se zero, atëherë kjo është tashmë një problem dhe duhet të kushtoni vëmendje parametrave të background writer-it dhe gjithashtu të vlerësoni performancën e sistemit disk.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Kujdes: _Teksti vijues përshkruan pamjet statistikore të lidhura me replikimin. Pjesa e madhe e emrave të pamjeve dhe funksioneve u rinovua në Postgres 10. Thelbi i rinovimeve ishte zëvendësimi xlog në wal dhe lokacionin në lsn në emrat e funksioneve/pamjeve etj. Një shembull specifik, funksioni pg_xlog_location_diff() u rinovua në pg_wal_lsn_diff()._

Këtu kemi gjithashtu shumë gjëra. Por do na nevojiten vetëm pikat që lidhen me pozitat.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Nëse shohim se të gjitha vlerat janë të barabarta, atëherë kjo është varianti ideal dhe replikimi nuk po nëndërprehet nga poçka.

Kjo pozitë hexadecimale është pozita në regjistrin e transaksioneve. Ajo rritet vazhdimisht, nëse në bazë ka ndonjë aktivitet: shtesa, fshirje etj.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

sa është regjistruar xlog në byte
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
vonesa e replikimit në byte
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
vonesa e replikimit në sekonda
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());

Nëse këto gjëra ndryshojnë, atëherë ka një vonesë. Vonesa është diferenca mes replikës dhe serverit kryesor, që do të thotë se të dhënat ndryshojnë midis serverëve.

Ka tre arsye për vonesën:

  • Sistemi disk po e ketĂ« tĂ« vĂ«shtirĂ« tĂ« regjistrojĂ« sinkronizimin e skedarĂ«ve.
  • KĂ«to mund tĂ« jenĂ« gabime nĂ« rrjet, ose ngarkesĂ« e tepĂ«rt nĂ« rrjet, kur tĂ« dhĂ«nat nuk arrijnĂ« nĂ« replikĂ« dhe ai nuk mund t'i riprodhojĂ« ato.
  • Dhe procesori. Procesori Ă«shtĂ« njĂ« rast shumĂ« i rrallĂ«. Kam parĂ« diçka tĂ« tillĂ« dy ose tre herĂ«, por gjithashtu mund tĂ« ndodhĂ«.

Dhe këtu janë tre pyetje, që na lejojnë të përdorim statistikat. Mund të vlerësojmë se sa është regjistruar në regjistrin tonë të transaksioneve. Ka një funksion të tillë pg_xlog_location_diff dhe mund të vlerësojmë vonesën e replikimit në byte dhe sekonda. Po ashtu e përdorim vlerën nga kjo pamje (VIEWs).

ShĂ«nim: _PĂ«rveç pg_xlog_locationfunksionit diff() mund tĂ« pĂ«rdorim operatorin e zbritjes dhe tĂ« zbritim njĂ« lokacion nga tjetri. ËshtĂ« e pĂ«rshtatshme.

Me vonesën, që shprehet në sekonda, ka një moment. Nëse në serverin kryesor nuk ndodh asnjë aktivitet, transaksioni ka ndodhur rreth 15 minuta më parë dhe nuk ka aktivitet, dhe nëse ne e shohim këtë vonesë në replikë, do të shohim një vonesë prej 15 minutash. Kjo duhet mbajtur mend. Dhe kjo mund të japi konfuzion, kur e shikoni këtë vonesë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Pg_stat_all_tables – Ă«shtĂ« njĂ« pamje tjetĂ«r e dobishme. Ajo tregon statistikat pĂ«r tabelat. Kur kemi tabela nĂ« bazĂ«n tonĂ« dhe ato kanĂ« ndonjĂ« aktivitet, ndonjĂ« veprim, mund ta marrim kĂ«tĂ« informacion nga kjo pamje.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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;

E para që mund të shohim, është skanimi i vazhdueshëm i tabelës. Numri vetë pas këtyre kalimeve nuk është domosdoshmërisht i keq dhe nuk është tregues se duhet të veprojmë.

MegjithatĂ«, ekziston njĂ« metrikĂ« tjetĂ«r – seq_tup_read. Kjo Ă«shtĂ« numri i rreshtave qĂ« kthehen si rezultat i skanimit tĂ« vazhdueshĂ«m. NĂ«se numri mesatar tejkalon 1,000, 10,000, 50,000, 100,000, atĂ«herĂ« kjo Ă«shtĂ« njĂ« tregues se ndoshta duhet tĂ« ndĂ«rtojmĂ« ndonjĂ« indeks, pĂ«r tĂ« realizuar kĂ«rkesat pĂ«rmes indekseve, ose ndoshta tĂ« optimizojmĂ« kĂ«rkesat qĂ« pĂ«rdorin kĂ«to skanimet e vazhdueshme, pĂ«r tĂ« mos pasur tĂ« tilla.

NjĂ« shembull i thjeshtĂ« – le tĂ« themi se njĂ« kĂ«rkesĂ« me OFFSET dhe LIMIT tĂ« madh Ă«shtĂ« nĂ« kĂ«mbim. PĂ«r shembull, skanohet 100,000 rreshta nĂ« tabelĂ« dhe pas kĂ«saj merren 50,000 rreshta tĂ« nevojshĂ«m, ndĂ«rsa rreshtat e skanuar mĂ« parĂ« hidhen poshtĂ«. Kjo Ă«shtĂ« gjithashtu njĂ« rast i keq. Dhe kĂ«to kĂ«rkesa duhet tĂ« optimizohen. Dhe kĂ«tu Ă«shtĂ« njĂ« pyetje SQL e thjeshtĂ«, nĂ« tĂ« cilĂ«n mund ta shikoni dhe tĂ« vlerĂ«soni numrat e marrĂ«.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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;

Mënyrat për të marrë dimensionet e tabelave mund të merrni gjithashtu me këtë tabelë dhe me funksione shtesë. pg_total_relation_size(), pg_relation_size().

Në të vërtetë, ekzistojnë komandat meta dt dhe di, të cilat mund të përdoren në PSQL dhe gjithashtu të shohin dimensionet e tabelave dhe indekseve.

Megjithatë, përdorimi i funksioneve na ndihmon të shohim dimensionet e tabelave me llogaritjen e indekseve, ose pa llogaritjen e indekseve dhe tashmë të bëjmë ndonjë vlerësim mbi rritjen e bazës së të dhënave, dmth. si po rritet, me sa intensitet dhe të bëjmë disa përfundime mbi optimizimin e dimensioneve.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Aktiviteti i shkrimit. ÇfarĂ« Ă«shtĂ« shkrimi? Le tĂ« shqyrtojmĂ« operacionin UPDATE – operacionin e pĂ«rditĂ«simit tĂ« rreshtave nĂ« tabelĂ«. NĂ« thelb, update Ă«shtĂ« dy operacione (ose ndoshta edhe mĂ« shumĂ«). Kjo Ă«shtĂ« njĂ« pĂ«rfshirje e versionit tĂ« ri tĂ« rreshtit dhe shenimi i versionit tĂ« vjetĂ«r tĂ« rreshtit si tĂ« vjetruar. MĂ« vonĂ« do tĂ« vijĂ« avakuumi dhe kĂ«to versione tĂ« vjetra do tĂ« spastrohen, duke e shĂ«nuar kĂ«tĂ« vend si tĂ« disponueshĂ«m pĂ«r ripĂ«rdorim.

PĂ«r mĂ« tepĂ«r, update nuk Ă«shtĂ« vetĂ«m pĂ«rditĂ«simi i tabelĂ«s. ËshtĂ« gjithashtu pĂ«rditĂ«simi i indekseve. NĂ«se keni shumĂ« indekse nĂ« tabelĂ«, atĂ«herĂ« gjatĂ« update tĂ« gjitha indekset qĂ« pĂ«rfshijnĂ« fushat e pĂ«rditĂ«suara nĂ« kĂ«rkesĂ« do tĂ« duhet gjithashtu tĂ« pĂ«rditĂ«sohen. NĂ« kĂ«to indekse do tĂ« ketĂ« gjithashtu versione tĂ« vjetra tĂ« rreshtave qĂ« duhet tĂ« spastrohen.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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;

Dhe për shkak të dizajnit të saj, UPDATE është operacione të rënda. Por ato mund të lehtësohen. Ekzistojnë update të nxehta. Ato u shfaqën në versionin 8.3 të PostgreSQL. Dhe çfarë janë ato? Këto janë përditësime të lehta, që nuk shkaktojnë rindërtimin e indekseve. Kjo do të thotë se ne e përditësuam një shkrim, por gjithsesi u përditësua vetëm shkrimi në faqe (e cila i përket tabelës), ndërsa indekset vazhdojnë të tregojnë për të njëjtin shkrim në faqe. Aty ka një logjikë interesante të funksionimit, kur vjen avakuumi, ai rinovon këto lidhje të nxehta dhe gjithçka vazhdon të funksionojë pa përditësimin e indekseve, dhe gjithçka ndodh me një shpenzim më të vogël të burimeve.

Dhe kur keni n_tup_hot_upd të mëdha, kjo është shumë mirë. Kjo do të thotë se përditësimet e lehta dominojnë dhe kjo na del më lirë në burime dhe gjithçka është në rregull.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

ALTER TABLE table_name SET (fillfactor = 70);

Si të rrisim sasinë e përditësimeve të nxehta?Mund të përdorim fillfactor. Ai definon madhësinë e hapësirës rezervuese kur plotësohet faqja në tabelë me insert-e. Kur në tabelë shkojnë insert-et, ato mbushin plotësisht faqen, pa lënë hapësirë të zbrazët. Pastaj një faqe e re caktohet. Të dhënat mbushen përsëri. Dhe ky është sjellja e paracaktuar, fill faktor = 100 %.

Ne mund të bëjmë fill faktor në 70 %. Pra, kur bëhen insert-e, caktohet një faqe e re, por mbushet vetëm 70 % e faqes. Dhe 30 % na mbetet për rezervë. Kur nevojitet të bëhet një përditësim, ka shumë gjasa që ai të ndodhi në të njëjtën faqe, dhe versioni i ri i rreshtit do të vendoset në të njëjtën faqe. Dhe do të bëhet një hot_update. Kështu lehtësohet shkrimi në tabela.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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));

Radhit e avtokombinimit. Avtokombinimi – Ă«shtĂ« njĂ« nĂ«nsiatĂ«, mbi tĂ« cilĂ«n statistika nĂ« PostgreSQL Ă«shtĂ« shumĂ« e dobĂ«t. Ne mund tĂ« shohim nĂ« tabela vetĂ«m nĂ« pg_stat_activity sa vakume po ndodhin nĂ« momentin aktual. MegjithatĂ«, tĂ« kuptojmĂ« se sa tabela janĂ« nĂ« radhĂ« Ă«shtĂ« shumĂ« e vĂ«shtirĂ«.

ShĂ«nim: _QĂ« nga versioni Postgres 10, situata me ndjekjen e avtokombinimit Ă«shtĂ« pĂ«rmirĂ«suar ndjeshĂ«m — Ă«shtĂ« shfaqur pamja pg_stat_progressvakum, e cila e thjeshton ndjeshĂ«m çështjen e monitorimit tĂ« avtokombinimit.

Ne mund të përdorim një kërkesë të tillë të thjeshtuar. Dhe mund të shohim kur do të bëhet vakumi. Por, si dhe kur duhet të fillojë vakumi? Këto versione të tejkaluara të rreshtave, për të cilat flas më parë. Ndodhi një përditësim, një version i ri i rreshtit u ngjit. U shfaq një version i tejkaluar i rreshtit. Në tabelë pg_stat_user_tables ka një parametër të tillë n_dead_tup. Ai tregon numrin e rreshtave "të vdekur". Dhe sapo numri i rreshtave të vdekur bëhet më i madh se një prag i caktuar, avtokombinimi do të vijë te tabela.

Dhe si llogaritet ky prag? Ky është një raport konkret përqindjeje nga numri total i rreshtave në tabelë. Ka një parametër autovacuum_vacuum_scale_factor. Ai përcakton raportin përqindor. Le të themi, 10 % + një prag të bazës me 50 rreshta. Dhe çfarë rezulton? Kur kemi rreshta të vdekur më shumë se "10 % + 50" nga të gjitha rreshtat në tabelë, ne e vendosim tabelën në avtokombinimin.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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));

Megjithatë, këtu ka një moment. Pragjet bazë për parametrat av_base_thresh dhe av_scale_factor mund të caktohen individualisht. Dhe, për rrjedhojë, pragjet do të jenë jo globale, por individuale për tabelën. Pra, për të llogaritur, duhet të përdoren mashtrime dhe truqe. Dhe nëse ju intereson, ju mund të shihni përvojën e kolegëve tanë nga Avito (linku në sliden është i pavlefshëm dhe është përditësuar në tekst).

Ata shkruan për pluginin munin, i cili merr parasysh këto gjëra. Atje ka një dokument në dy faqe. Por ai llogarit saktë dhe në mënyrë të efektshme na lejon të vlerësojmë ku na nevojitet më shumë vakuum për tabelat, ku më pak.

ÇfarĂ« mund tĂ« bĂ«jmĂ« me kĂ«tĂ«? NĂ«se kemi njĂ« radhĂ« tĂ« madhe dhe avakovaku nuk po pĂ«rballon, atĂ«herĂ« mund tĂ« rrisim numrin e punĂ«torĂ«ve tĂ« vakuumit, ose thjesht ta bĂ«jmĂ« vakuumin mĂ« agresiv, qĂ« ai tĂ« aktivizohet mĂ« herĂ«t dhe tĂ« pĂ«rpunojĂ« tabelĂ«n nĂ« copĂ«za tĂ« vogla. Dhe kĂ«shtu, radha do tĂ« zvogĂ«lohet. — E rĂ«ndĂ«sishme kĂ«tu Ă«shtĂ« tĂ« monitorojmĂ« ngarkesĂ«n nĂ« diske, sepse vakuumi Ă«shtĂ« diçka qĂ« nuk Ă«shtĂ« falas, megjithatĂ« me shfaqjen e pajisjeve SSD/NVMe problemi Ă«shtĂ« bĂ«rĂ« mĂ« pak i dukshĂ«m.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Pg_stat_all_indexes – Ă«shtĂ« statistika pĂ«r indekset. Ajo Ă«shtĂ« e vogĂ«l. Dhe ne mund tĂ« marrim informacion pĂ«r pĂ«rdorimin e indekseve nga ajo. Dhe pĂ«r shembull, mund tĂ« pĂ«rcaktojmĂ« se cilat indekse janĂ« tĂ« tepĂ«rta.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Siç e thashĂ« mĂ« parĂ«, update – nuk Ă«shtĂ« vetĂ«m pĂ«rditĂ«simi i tabelave, Ă«shtĂ« gjithashtu pĂ«rditĂ«simi i indekseve. Prandaj, nĂ«se kemi shumĂ« indekse mbi njĂ« tabelĂ«, atĂ«herĂ« gjatĂ« pĂ«rditĂ«simit tĂ« rreshtave nĂ« tabelĂ«, indekset e fushave tĂ« indeksuara gjithashtu duhet tĂ« pĂ«rditĂ«sohen, dhe nĂ«se kemi indekse tĂ« papĂ«rdorura, pĂ«r tĂ« cilat nuk ka skanime indeksesh, ato janĂ« si njĂ« barrĂ« e panevojshme. Dhe duhet tĂ« heqim dorĂ« nga to. PĂ«r kĂ«tĂ« na nevojitet fusha idx_scan. Ne thjesht shikojmĂ« numrin e skanimeve indeskĂ«. NĂ«se indekset nuk kanĂ« skanime pĂ«r njĂ« periudhĂ« mjaft tĂ« gjatĂ« ruajtjeje tĂ« statistikave (jo mĂ« pak se 2-3 javĂ«), atĂ«herĂ« nĂ« shumicĂ«n e rasteve janĂ« indekse tĂ« kĂ«qija, duhet t'i heqim ato.

Shënim: Kur kërkojmë indekse të papërdorura në rastin e klasterëve të replikimit në rrjedhë, duhet të kontrollojmë të gjitha nyjat e klasterit, sepse statistikat nuk janë globale, dhe nëse një indeks nuk përdoret në master, ai mund të përdoret në replika (nëse atje ka ngarkesë).

Dy lidhje:

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

Këto janë shembuj më të avancuar të pyetjeve për të kërkuar indekse të papërdorura.

Lidhja e dytĂ« – Ă«shtĂ« njĂ« pyetje mjaft interesante. Aty ka logjikĂ« shumĂ« jo-triviale. E rekomandoj pĂ«r njohje.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

ÇfarĂ« tjetĂ«r duhet tĂ« pĂ«rmbledhim pĂ«r indekset?

  • Indekset e papĂ«rdorura – janĂ« tĂ« kĂ«qija.

  • Zgjatin hapĂ«sirĂ«n.

  • NgadalĂ«sojnĂ« operacionet e pĂ«rditĂ«simit.

  • PunĂ« e tepĂ«rt pĂ«r vakuumin.

Nëse heqim indekset e papërdorura, do ta bëjmë bazën më të mirë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Prezantimi tjetĂ«r Ă«shtĂ« pg_stat_activity. ËshtĂ« analogu i utilitarit ps, vetĂ«m nĂ« PostgreSQL. NĂ«se ps'e shihni proceset nĂ« sistemin operativ, atĂ«herĂ« pg_stat_activity do t'ju tregojĂ« aktivitetin brenda PostgreSQL.

ÇfarĂ« mund tĂ« marrim nga aty si tĂ« dobishĂ«m?

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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

Ne mund të shohim aktivitetin e përgjithshëm, çfarë po ndodh në bazë. Mund të bëjmë një publikim të ri. Kemi një shpërthim, lidhjet e reja nuk pranohen, ka gabime të shumta në aplikacion.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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

Ne mund të realizojmë një kërkesë të tillë dhe të shohim përqindjen totale të lidhjeve në raport me limitin maksimal të lidhjeve dhe të shohim se kush ka më shumë lidhje. Në këtë rast të paraqitur, ne shohim që përdoruesi cron_role ka hapur 508 lidhje. Diku ka ndodhur diçka. Duhet të merremi me të dhe të shohim. Dhe është plotësisht e mundur që ky të jetë një numër anormal lidhjesh.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Nëse kemi ngarkesë OLTP, kërkesat duhet të kryhen shpejt, shumë shpejt dhe nuk duhet të kenë kërkesa të gjata. Megjithatë, nëse ndodhin kërkesa të gjata, atëherë në perspektivën afatshkurtër nuk është asgjë e keqe, por në perspektivën afatgjatë, kërkesat e gjata dëmtojnë bazën, ato rrisin efektin bloat të tabelave, kur ndodh fragmentimi i tabelave. Duhet të heqim dorë nga bloati dhe kërkesat e gjata.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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;

Kujdes: me një kërkesë të tillë ne mund të përcaktojmë kërkesat dhe transaksionet e gjata. Ne përdorim funksionin clock_timestamp() për të përcaktuar kohën e funksionimit. Kërkesat e gjata që kemi gjetur, mund t'i mbajmë në mend, t'i kryejmë explain, të shohim planet dhe ndonjëherë të optimizojmë. Kërkesat e gjata aktuale i mbyllim dhe vazhdojmë të jetojmë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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

Transaksionet e kĂ«qija – janĂ« transaksionet nĂ« gjendjen idle in transaction dhe idle in transaction (aborted).

ÇfarĂ« do tĂ« thotĂ« kjo? Transaksionet kanĂ« disa gjendje. Dhe njĂ« prej kĂ«tyre gjendjeve mund tĂ« marrin nĂ« çdo moment. PĂ«r tĂ« pĂ«rcaktuar gjendjet, ka njĂ« fushĂ« gjendja nĂ« kĂ«tĂ« pamje. Dhe ne e pĂ«rdorim pĂ«r tĂ« pĂ«rcaktuar gjendjen.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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

Dhe, siç e thashĂ« mĂ« sipĂ«r, kĂ«to dy gjendje idle in transaction dhe idle in transaction (aborted) – janĂ« tĂ« kĂ«qija. ÇfarĂ« janĂ«? Kjo ndodh kur aplikacioni ka hapur njĂ« transaksion, ka bĂ«rĂ« disa veprime dhe Ă«shtĂ« larguar. Transaksioni mbetet i hapur. Ai var, nuk ndodh asgjĂ« nĂ« tĂ«, zĂ« njĂ« lidhje, ndalon rreshtat e ndryshuar dhe potencialisht rrit bloat-in e tabelave tĂ« tjera pĂ«r shkak tĂ« arkitekturĂ«s sĂ« motorit tĂ« transaksioneve PostgreSQL. Dhe kĂ«to transaksione gjithashtu duhen mbyllur, sepse janĂ« tĂ« dĂ«mshme nĂ« çdo rast.

Nëse shihni se ka më shumë se 5-10-20 të tillë në bazën tuaj, duhet të shqetësoheni dhe të filloni të bëni diçka me to.

Këtu ne gjithashtu përdorim për kohën llogaritëse clock_timestamp(). Transaksionet i mbyllim, aplikacionin e optimizojmë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Siç e thashë më sipër, bllokimet janë kur dy ose më shumë transaksione garojnë për një ose grup burimesh. Për këtë, kemi një fushë waiting me vlerë boolean e vërtetë ose false.

True – kjo do tĂ« thotĂ« se procesi Ă«shtĂ« nĂ« pritje, dhe duhet bĂ«rĂ« diçka. Kur procesi Ă«shtĂ« nĂ« pritje, klienti qĂ« e iniciativ njĂ« proces tĂ« tillĂ« po ashtu Ă«shtĂ« nĂ« pritje. Klienti nĂ« shfletues Ă«shtĂ« ulur dhe gjithashtu po pret.

Kujdes: _Duke filluar nga versioni Postgres 9.6, fusha waiting është fshirë dhe në vend të saj janë shtuar dy fushat më informuese wait_event_type dhe wait_event._

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

ÇfarĂ« tĂ« bĂ«jmĂ«? NĂ«se shihni true pĂ«r njĂ« kohĂ« tĂ« gjatĂ«, atĂ«herĂ« ky Ă«shtĂ« njĂ« tregues qĂ« duhet tĂ« shmangen kĂ«rkesa tĂ« tilla. Ne thjesht i eliminojmĂ« kĂ«to transaksione. U shkruajmĂ« zhvilluesve se duhet optimizuar ndryshe pĂ«r tĂ« evituar garĂ«n pĂ«r burime. Pastaj zhvilluesit optimizojnĂ« aplikacionin nĂ« mĂ«nyrĂ« qĂ« mos tĂ« ndodhin tĂ« tilla situata.

Dhe rasti i fundit, por potencialisht jo fatal – Ă«shtĂ« shfaqja e deadlocks. Dy transaksione pĂ«rditĂ«sojnĂ« dy burime, pastaj kĂ«rkojnĂ« sĂ«rish, tashmĂ« pĂ«r burimet e kundĂ«rta. NĂ« kĂ«tĂ« rast, PostgreSQL e eliminon vetĂ« transaksionin, pĂ«r t'i dhĂ«nĂ« mundĂ«sinĂ« tjetrit tĂ« vazhdojĂ« punĂ«n. Kjo Ă«shtĂ« njĂ« situatĂ« e bllokuar dhe nuk zgjidhet vetĂ«. Prandaj PostgreSQL detyrohet tĂ« marrĂ« masa ekstreme.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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/

Dhe këtu janë dy kërkesa që lejojnë ndjekjen e bllokimeve. Ne përdorim pamjen pg_locks, e cila lejon të ndjekim bllokimet e rënda.

Dhe lidhja e parĂ« – Ă«shtĂ« vetĂ« teksti i kĂ«rkesĂ«s. Ai Ă«shtĂ« mjaft i gjatĂ«.

Dhe lidhja e dytĂ« – Ă«shtĂ« njĂ« artikull mbi locks. ËshtĂ« e dobishme ta lexoni, Ă«shtĂ« shumĂ« interesante.

Pra, çfarĂ« shohim? Ne shohim dy kĂ«rkesa. Transaksioni me ALTER TABLE – Ă«shtĂ« njĂ« transaksion qĂ« bllokon. Ai Ă«shtĂ« nisur, por nuk Ă«shtĂ« pĂ«rfunduar dhe aplikacioni qĂ« e ka nisur kĂ«tĂ« transaksion Ă«shtĂ« duke u marrĂ« me çështje tĂ« tjera. Dhe kĂ«rkesa e dytĂ« – update. Ai po pret qĂ« alter table tĂ« pĂ«rfundojĂ«, qĂ« tĂ« vazhdojĂ« punĂ«n e tij.

Kështu mund të zbulojmë se kush ka bllokuar, e mban dhe mund të merremi me këtë më tutje.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Moduli tjetĂ«r – Ă«shtĂ« pg_stat_statements. Ashtu siç e thashĂ«, Ă«shtĂ« njĂ« modul. PĂ«r ta shfrytĂ«zuar, duhet ngarkuar bibliotekĂ«n e tij nĂ« konfigurim, ri-nisur PostgreSQL, instaluar modulin (me njĂ« komandĂ«) dhe pastaj do tĂ« na shfaqet njĂ« pamje e re.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Koha mesatare e kërkesës në milisekonda
$ select (sum(total_time) / sum(calls))::numeric(6,3)
from pg_stat_statements;

Kërkesat më aktive të shkruhura (në shared_buffers)
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;

ÇfarĂ« mund tĂ« nxjerrim nga aty? NĂ«se flasim pĂ«r gjĂ«ra tĂ« thjeshta, mund tĂ« marrim kohĂ«n mesatare tĂ« ekzekutimit tĂ« kĂ«rkesĂ«s. Koha po rritet, do tĂ« thotĂ« se PostgreSQL po pĂ«rgjigjet ngadalĂ« dhe duhet bĂ«rĂ« diçka.

Mund të shohim transaksionet më aktive të shkruara në bazën e të dhënave, të cilat ndryshojnë të dhënat në shared buffers. Të shohim kush po përditëson ose fshin të dhëna.

Dhe mund të shohim thjesht statistikë të ndryshme për këto kërkesa.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

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

Ne pg_stat_statements përdorim për ndërtimin e raporteve. Cdo ditë ne zbresim statistikën. E akumulojmë atë. Para se të zbresim statistikën herën tjetër, ndërtuam raportin. Këtu është lidhja për raportin. Mund ta shikoni atë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

ÇfarĂ« bĂ«jmĂ« ne? Ne llogarisim statistikĂ«n totale pĂ«r tĂ« gjitha kĂ«rkesat. MĂ« pas pĂ«r çdo kĂ«rkesĂ« llogarisim kontributin e saj individual nĂ« kĂ«tĂ« statistikĂ« totale.

Dhe çfarë mund të shohim? Mund të shohim kohën e përgjithshme të ekzekutimit të të gjitha kërkesave të një lloji të caktuar në sfondin e të gjitha kërkesave të tjera. Mund të shohim përdorimin e burimeve të procesorit dhe hyrje-daljeve në lidhje me pamjen e përgjithshme. Dhe tashmë mund të optimizojmë këto kërkesa. Ne ndërtuam një top të kërkesave sipas këtij raporti dhe tashmë kemi bazë për të menduar se çfarë të optimizojmë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

ÇfarĂ« na ka mbetur jashtĂ«? Ka disa prezantime qĂ« nuk i kam shqyrtuar, pasi koha Ă«shtĂ« e kufizuar.

Ka pgstattuple – Ă«shtĂ« gjithashtu njĂ« modul shtesĂ« nga paketa standarde contribs. Ai lejon tĂ« vlerĂ«sojmĂ« bloat tabelat, pra fragmentimin e tabelĂ«s. Dhe nĂ«se fragmentimi Ă«shtĂ« i madh, duhet ta heqim, tĂ« pĂ«rdorim mjete tĂ« ndryshme. Dhe funksioni pgstattuple punon ngadalĂ«. Dhe sa mĂ« shumĂ« tabela tĂ« ketĂ«, aq mĂ« gjatĂ« do tĂ« punojĂ«.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Moduli tjetër contrib është pg_buffercache. Ai lejon të inspektojë bufferat e ndarë: sa intensivisht dhe për cilat tabela janë shfrytëzuar faqet e buffers. Dhe thjesht lejon të shikoni në bufferat e ndarë dhe të vlerësoni atë që ndodh atje.

Moduli tjetĂ«r – Ă«shtĂ« pgfincore. Ai lejon tĂ« kryeni operacione tĂ« nivelit tĂ« ulĂ«t me tabelat pĂ«rmes thirrjeve sistemore mincore(), dmth, ai lejon ngarkimin e tabelĂ«s nĂ« bufferat e ndarĂ«, ose nxjerrjen e saj. Dhe, pĂ«rveç tĂ« tjerash, lejon tĂ« inspektojĂ« cache-n e faqeve tĂ« sistemit operativ, dmth, nĂ« çfarĂ« sasi tabela jonĂ« merret nĂ« cache-n e faqeve, nĂ« bufferat e ndarĂ« dhe thjesht lejon tĂ« vlerĂ«sojĂ« ngarkesĂ«n e tabelĂ«s.

Moduli tjetër është pg_stat_kcache. Ai gjithashtu përdor thirrjen sistemore getrusage(). Dhe e kryen para dhe pas ekzekutimit të kërkesës. Dhe në statistikën e marrë lejon të vlerësosh, sa ka shpenzuar kërkesa për ekzekutimin e hyrjeve dhe daljeve të diskut, dmth, operacioneve me sistemin e skedarëve dhe shikon përdorimin e procesorit. Megjithatë, moduli është i ri (ehm-ehm) dhe për funksionimin e tij kërkon PostgreSQL 9.4 dhe pg_stat_statements, për të cilin kam folur më parë.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

  • Dija pĂ«r tĂ« pĂ«rdorur statistikat Ă«shtĂ« e dobishme. Nuk ju nevojiten programe tĂ« jashtme. Mund tĂ« shikoni vetĂ«, tĂ« shihni, tĂ« bĂ«ni diçka, tĂ« ekzekutoni.

  • PĂ«rdorimi i statistikave nuk Ă«shtĂ« i vĂ«shtirĂ«, Ă«shtĂ« SQL normal. Keni mbledhur kĂ«rkesĂ«n, e keni formuar, e keni dĂ«rguar, e keni parĂ«.

  • Statistika ndihmon pĂ«r tĂ« pĂ«rgjigjur pyetjeve. NĂ«se keni pyetje, ju drejtoheni statistikave – shikoni, bĂ«ni pĂ«rfundime, analizoni rezultatet.

  • Dhe eksperimento. Ka shumĂ« kĂ«rkesa, shumĂ« tĂ« dhĂ«na. GjithmonĂ« mund tĂ« optimizohet ndonjĂ« kĂ«rkesĂ« ekzistuese. Mund tĂ« krijoni versionin tuaj tĂ« kĂ«rkesĂ«s, qĂ« ju pĂ«rshtatet mĂ« mirĂ« se origjinali dhe ta pĂ«rdorni atĂ«.

Thellim në statistikat e brendshme të PostgreSQL. Aleksej Lesovski

Linke

Lidhjet e vlefshme, të cilat u përmendën në artikullin, mbi të cilin u paraqit raporti.

Autori, shkruaj akoma
https://dataegret.com/news-blog (eng)

Koleksionisti i Statistikave
https://www.postgresql.org/docs/current/monitoring-stats.html

Funksionet e Administratës së Sistemëve
https://www.postgresql.org/docs/current/functions-admin.html

Modulet kontribuuese
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

Mjetet SQL dhe shembujt e kodit SQL
https://github.com/dataegret/pg-utils

Faleminderit të gjithëve për vëmendjen!

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster