Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Ang taho nagpresentar sa pipila ka mga paagi nga nagtugot monitor sa performance sa SQL pangutana kon adunay minilyon kanila kada adlaw, ug adunay gatusan nga gibantayan nga mga server sa PostgreSQL.

Unsang mga teknikal nga solusyon ang nagtugot kanamo nga epektibo nga maproseso ang ingon nga gidaghanon sa kasayuran, ug giunsa kini paghimo nga labi ka dali ang kinabuhi sa usa ka ordinaryo nga developer?


Kinsay interesado? pagtuki sa piho nga mga problema ug lain-laing mga pamaagi sa pag-optimize Mga pangutana sa SQL ug pagsulbad sa kasagarang mga problema sa DBA sa PostgreSQL - mahimo usab nimo pagbasa ug serye sa mga artikulo sa niini nga hilisgutan.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)
Ang akong ngalan mao si Kirill Borovikov, ako nagrepresentar Tensor nga kompanya. Sa partikular, espesyalista ako sa pagtrabaho sa mga database sa among kompanya.

Karon isulti ko kanimo kung giunsa namo pag-optimize ang mga pangutana, kung dili nimo kinahanglan nga "pilion" ang paghimo sa usa ka pangutana, apan sulbaron ang problema sa kadaghanan. Kung adunay milyon-milyon nga mga hangyo, ug kinahanglan nimo pangitaon ang pipila mga pamaagi sa solusyon kining dakong problema.

Sa kinatibuk-an, ang Tensor alang sa usa ka milyon sa among mga kliyente mao Ang VLSI mao ang among aplikasyon: corporate social network, mga solusyon alang sa komunikasyon sa video, alang sa internal ug external nga dagan sa dokumento, mga sistema sa accounting alang sa accounting ug mga bodega,... Kana mao, ang ingon nga "mega-combine" alang sa integrated nga pagdumala sa negosyo, diin adunay labaw pa sa 100 ka lain-laing internal nga mga proyekto.

Aron masiguro nga silang tanan nagtrabaho ug nag-uswag nga normal, kami adunay 10 ka mga sentro sa pag-uswag sa tibuuk nasud, nga adunay daghan pa niini 1000 ka mga developer.

Nagtrabaho kami uban sa PostgreSQL sukad sa 2008 ug nakatigom og daghang kantidad sa among giproseso - datos sa kliyente, istatistika, analitikal, datos gikan sa mga eksternal nga sistema sa impormasyon - labaw pa sa 400TB. Adunay mga 250 nga mga server sa produksiyon lamang, ug sa kinatibuk-an adunay mga 1000 nga database server nga among gibantayan.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Ang SQL usa ka deklaratibo nga pinulongan. Dili nimo gihulagway ang "unsaon" ang usa ka butang molihok, apan "unsa" gusto nimong makab-ot. Ang DBMS mas nahibal-an kung unsaon paghimo usa ka JOIN - kung giunsa ang pagkonektar sa imong mga lamesa, kung unsang mga kondisyon ang ipahamtang, kung unsa ang moagi sa indeks, kung unsa ang dili ...

Ang ubang mga DBMS midawat sa mga pahibalo: "Dili, ikonektar kining duha ka mga lamesa sa ingon ug ingon nga pila," apan ang PostgreSQL dili makahimo niini. Kini ang mahunahunaon nga posisyon sa nanguna nga mga developer: "Mas gusto namon nga tapuson ang pag-optimize sa pangutana kaysa tugotan ang mga developer nga mogamit usa ka matang sa mga pahiwatig."

Apan, bisan pa sa kamatuoran nga ang PostgreSQL wala magtugot sa "gawas" nga makontrol ang kaugalingon, kini hingpit nga nagtugot tan-awa kung unsa ang nahitabo sa sulod niyakung gipadagan nimo ang imong pangutana, ug kung diin kini adunay mga problema.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Sa kinatibuk-an, unsa nga mga klasiko nga mga problema ang kasagaran nga moabut sa usa ka developer [sa usa ka DBA]? β€œDinhi namo gituman ang hangyo, ug hinay ang tanan sa amon, ang tanan nagbitay, adunay nahitabo... Usa ka matang sa kasamok!”

Ang mga hinungdan hapit kanunay parehas:

  • dili maayo nga algorithm sa pangutana
    Developer: "Karon ako naghatag kaniya og 10 ka mga lamesa sa SQL pinaagi sa JOIN ..." - ug nagpaabut nga ang iyang mga kondisyon sa milagrosong paagi epektibo nga "gihigot" ug makuha niya ang tanan sa madali. Apan ang mga milagro dili mahitabo, ug ang bisan unsang sistema nga adunay ingon nga pagkalainlain (10 nga mga lamesa sa usa GIKAN) kanunay naghatag usa ka matang sa sayup. [nga artikulo]
  • walay kalabotan nga estadistika
    Kini nga punto labi ka hinungdanon alang sa PostgreSQL, kung imong "gibubo" ang usa ka dako nga dataset sa server, paghimo usa ka hangyo, ug kini "sexcanits" sa imong tablet. Tungod kay kagahapon adunay 10 nga mga rekord niini, ug karon adunay 10 milyon, apan ang PostgreSQL wala pa nahibal-an bahin niini, ug kinahanglan naton isulti kini bahin niini. [nga artikulo]
  • "plug" sa mga kapanguhaan
    Nag-instalar ka og dako ug daghan kaayong database sa huyang nga server nga walay igong disk, memorya, o performance sa processor. Ug kana lang ... Sa usa ka dapit adunay usa ka performance ceiling sa ibabaw diin dili ka na makalukso.
  • pagbabag
    Kini mao ang usa ka lisud nga punto, apan sila mao ang labing may kalabutan alang sa lain-laing mga pag-usab sa mga pangutana (INSERT, UPDATE, DELETE) - kini mao ang usa ka lain nga dako nga hilisgutan.

Pagkuha ug plano

...Ug alang sa tanan nga uban pa namo nagkinahanglan ug plano! Kinahanglan natong tan-awon kung unsa ang nahitabo sa sulod sa server.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Ang plano sa pagpatuman sa pangutana alang sa PostgreSQL usa ka kahoy sa algorithm sa pagpatuman sa pangutana sa representasyon sa teksto. Kini mao ang tukma nga algorithm nga, ingon sa usa ka resulta sa pagtuki sa planner, nakaplagan nga mao ang labing epektibo.

Ang matag node sa kahoy usa ka operasyon: pagkuha sa datos gikan sa usa ka lamesa o indeks, paghimo og bitmap, pag-apil sa duha ka mga lamesa, pag-apil, pag-intersecting, o dili pag-apil sa mga pinili. Ang pagpatuman sa usa ka pangutana naglakip sa paglakaw sa mga buko niini nga kahoy.

Aron makuha ang plano sa pangutana, ang labing kadali nga paagi mao ang pagpatuman sa pahayag EXPLAIN. Aron makuha ang tanan nga tinuod nga mga hiyas, nga mao, sa aktuwal nga pagpatuman sa usa ka pangutana sa base - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Ang dili maayo nga bahin: kung imong gipadagan kini, kini mahitabo "dinhi ug karon", mao nga kini angay lamang alang sa lokal nga pag-debug. Kung nagkuha ka usa ka puno kaayo nga server nga naa sa ilawom sa kusog nga dagan sa mga pagbag-o sa datos, ug imong makita: "Oh! Dinhi kita adunay usa ka hinay nga pagpataysya hangyo." Tunga sa oras, usa ka oras ang milabay - samtang nagdagan ka ug nagkuha niini nga hangyo gikan sa mga troso, nga nagdala niini balik sa server, ang imong tibuok dataset ug mga estadistika nausab. Imong gipadagan kini aron sa pag-debug - ug kini modagan dayon! Ug dili nimo masabtan kung ngano, ngano kini mao ang hinay.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Aron masabtan kung unsa gyud ang nahitabo sa higayon nga gipatuman ang hangyo sa server, nagsulat ang mga maalamon auto_explain module. Anaa kini sa halos tanan nga kasagaran nga mga distribusyon sa PostgreSQL, ug mahimo ra nga ma-aktibo sa config file.

Kung nahibal-an niini nga ang pipila ka hangyo nagdagan nga mas taas kaysa sa limitasyon nga imong gisulti niini, kini molihok "snapshot" sa plano niini nga hangyo ug isulat kini nga dungan sa log.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Ang tanan ingon og maayo na karon, moadto kami sa troso ug tan-awon didto ... [text footcloth]. Apan dili kami makasulti bisan unsa bahin niini, gawas sa kamatuoran nga kini usa ka maayo kaayo nga plano tungod kay gikuha ang 11ms aron mapatuman.

Maayo ra ang tanan - apan wala’y klaro kung unsa gyud ang nahitabo. Gawas sa kinatibuk-ang panahon, wala gyud kami makakita bisan unsa. Tungod kay ang pagtan-aw sa ingon nga "kordero" sa yano nga teksto sa kasagaran dili makita.

Apan bisan kung kini dili dayag, bisan kung kini dili kombenyente, adunay mas sukaranan nga mga problema:

  • Ang node nagpakita sum sa mga kahinguhaan sa tibuok subtree ubos niya. Sa ato pa, dili nimo mahibal-an kung pila ka oras ang gigugol sa kini nga partikular nga Pag-scan sa Index kung adunay pipila nga kahimtang sa ilawom niini. Kinahanglan nga dinamikong tan-awon naton kung adunay "mga bata" ug mga kondisyon nga variable, mga CTE sa sulod - ug kuhaan kining tanan "sa atong mga hunahuna".
  • Ikaduhang punto: ang oras nga gipakita sa node mao oras sa pagpatuman sa usa ka node. Kung kini nga node gipatuman isip resulta sa, pananglitan, ang usa ka loop pinaagi sa mga talaan sa lamesa sa makadaghang higayon, nan ang gidaghanon sa mga loops-siklo niini nga node-nadugangan sa plano. Apan ang atomic execution time mismo nagpabilin nga pareho sa termino sa plano. Kana mao, aron masabtan kung unsa ka dugay kini nga node gihimo sa kinatibuk-an, kinahanglan nimo nga padaghanon ang usa ka butang sa lain - usab, "sa imong ulo."

Sa ingon nga mga sitwasyon, sabta ang "Kinsa ang labing huyang nga sumpay?" halos imposible. Busa, bisan ang mga developers sa ilang kaugalingon nagsulat sa "manwal" nga "Ang pagsabut sa usa ka plano usa ka arte nga kinahanglan nga makat-unan, masinati ...".

Apan kami adunay 1000 nga mga developer, ug dili nimo mahatag kini nga kasinatian sa matag usa kanila. Ako, ikaw, siya nakaila, apan usa ka tawo didto wala na mahibalo. Tingali makakat-on siya, o tingali dili, apan kinahanglan siyang magtrabaho karon - ug asa niya makuha kini nga kasinatian?

Pagplano sa pagtan-aw

Busa, naamgohan namo nga aron masagubang kini nga mga problema, gikinahanglan nato maayo nga visualization sa plano. [artikulo]

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Nag-una kami "sa merkado" - tan-awon naton sa Internet aron makita kung unsa ang naglungtad.

Apan nahibal-an nga adunay gamay ra nga medyo "buhi" nga mga solusyon nga labi pa o dili kaayo nag-uswag - sa literal, usa ra: explain.depesz.com ni Hubert Lubaczewski. Kung mosulod ka sa field nga "feed" usa ka representasyon sa teksto sa plano, kini nagpakita kanimo og usa ka lamesa nga adunay mga parsed data:

  • kaugalingon nga oras sa pagproseso sa node
  • kinatibuk-ang panahon alang sa tibuok subtree
  • gidaghanon sa mga rekord nga nakuha nga gilauman sa istatistika
  • ang lawas sa node mismo

Kini nga serbisyo usab adunay katakus sa pagpaambit sa usa ka archive sa mga link. Imong gilabay ang imong plano didto ug miingon: "Hoy, Vasya, ania ang usa ka sumpay, adunay usa ka butang nga sayup didto."

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Apan adunay mga gagmay nga problema usab.

Una, usa ka dako nga kantidad sa "copy-paste". Magkuha ka usa ka piraso sa troso, ibutang kini didto, ug usab, ug usab.

Ikaduha, walay pagtuki sa gidaghanon sa datos nga gibasa - ang parehas nga buffer nga output EXPLAIN (ANALYZE, BUFFERS), dili nato kini makita dinhi. Siya yano nga wala mahibalo kon sa unsang paagi sa pag-disassemble kanila, makasabut kanila ug sa pagtrabaho uban kanila. Kung nagbasa ka ug daghang datos ug nahibal-an nimo nga mahimo nimong masaypan ang disk ug cache sa memorya, kini nga kasayuran hinungdanon kaayo.

Ang ikatulo nga negatibo nga punto mao ang huyang kaayo nga pag-uswag niini nga proyekto. Ang mga pasalig gamay ra kaayo, maayo kung kausa matag unom ka bulan, ug ang code naa sa Perl.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Apan kini ang tanan nga "lirik", mahimo naton kini mabuhi, apan adunay usa ka butang nga nakapahilayo kaayo kanamo gikan sa kini nga serbisyo. Kini ang mga sayup sa pagtuki sa Common Table Expression (CTE) ug lainlain nga dinamikong mga node sama sa InitPlan/SubPlan.

Kung motuo ka niini nga hulagway, nan ang kinatibuk-ang oras sa pagpatuman sa matag indibidwal nga node mas dako pa kay sa kinatibuk-ang oras sa pagpatuman sa tibuok nga hangyo. Simple ra - ang panahon sa henerasyon niini nga CTE wala makuha gikan sa CTE Scan node. Busa, wala na mi kahibalo sa saktong tubag kung unsa kadugay ang CTE scan mismo.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Dayon among naamgohan nga panahon na sa pagsulat sa among kaugalingon - hurray! Ang matag developer nag-ingon: "Karon among isulat ang among kaugalingon, dali ra kaayo!"

Nagkuha kami usa ka stack nga kasagaran alang sa mga serbisyo sa web: usa ka kinauyokan nga gibase sa Node.js + Express, gigamit ang Bootstrap ug D3.js alang sa matahum nga mga diagram. Ug ang among mga gilauman hingpit nga gipakamatarung - nadawat namon ang una nga prototype sa 2 ka semana:

  • custom nga plano parser
    Kana mao, karon mahimo na naton ma-parse ang bisan unsang plano gikan sa mga nahimo sa PostgreSQL.
  • husto nga pagtuki sa dinamikong mga node - CTE Scan, InitPlan, SubPlan
  • pagtuki sa buffer distribution - diin ang mga panid sa datos gibasa gikan sa memorya, diin gikan sa lokal nga cache, diin gikan sa disk
  • nakabaton ug katin-awan
    Aron dili "pagkalot" kining tanan sa log, apan aron makita dayon ang "weakest link" sa litrato.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Nakakuha kami usa ka butang nga sama niini, nga gilakip ang pag-highlight sa syntax. Apan sa kasagaran ang among mga developers dili na magtrabaho uban sa usa ka kompleto nga representasyon sa plano, apan uban sa usa ka mas mubo. Human sa tanan, na-parse na namo ang tanan nga mga numero ug gilabay kini sa wala ug tuo, ug sa tunga-tunga gibilin lamang namo ang unang linya, unsa nga matang sa node kini: CTE Scan, CTE generation o Seq Scan sumala sa pipila ka ilhanan.

Kini ang pinamubo nga representasyon nga atong gitawag template sa plano.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Unsa pa kaha ang kombenyente? Mahimong sayon ​​​​nga makita kung unsang bahin sa atong kinatibuk-ang oras ang gigahin kung asa nga node - ug "ipilit" lang sa kilid pie chart.

Gipunting namon ang node ug tan-awa - kini nahimo nga ang Seq Scan wala’y usa ka quarter sa kinatibuk-ang oras, ug ang nahabilin nga 3/4 gikuha sa CTE Scan. Makalilisang! Kini usa ka gamay nga nota bahin sa "rate sa kalayo" sa CTE Scan kung aktibo nimo nga gigamit kini sa imong mga pangutana. Dili kaayo sila paspas - mas ubos sila bisan sa regular nga pag-scan sa lamesa. [artikulo] [artikulo]

Apan kasagaran ang maong mga diagram mas makaiikag, mas komplikado, sa diha nga kita diha-diha dayon motudlo sa usa ka bahin ug tan-awa, alang sa panig-ingnan, nga labaw pa kay sa katunga sa mga panahon sa pipila Seq Scan "nagkaon". Dugang pa, adunay usa ka matang sa Filter sa sulod, daghang mga rekord ang gilabay sumala niini ... Mahimo nimo direkta nga ilabay kini nga hulagway ngadto sa developer ug moingon: "Vasya, ang tanan dili maayo dinhi alang kanimo! Hunahunaa kini, tan-awa - adunay sayup!"

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Siyempre, adunay pipila ka "rakes" nga nalangkit.

Ang una nga butang nga among nakit-an mao ang problema sa paglibot. Ang oras sa matag indibidwal nga node sa plano gipakita nga adunay katukma nga 1 ΞΌs. Ug kung ang gidaghanon sa mga siklo sa node molapas, pananglitan, 1000 - pagkahuman sa pagpatuman, gibahin ang PostgreSQL "sulod sa katukma", unya kung gikalkula pagbalik makuha namon ang tibuuk nga oras "sa usa ka lugar tali sa 0.95ms ug 1.05ms". Kung ang ihap moadto sa microseconds, okay kana, apan kung kini [milli]segundo na, kinahanglan nimo nga tagdon kini nga kasayuran kung ang "pagtangtang" nga mga kapanguhaan sa mga node sa "kinsa ang nagkonsumo kung pila" nga plano.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Ang ikaduha nga punto, mas komplikado, mao ang pag-apod-apod sa mga kahinguhaan (kanang mga buffer) taliwala sa mga dinamikong node. Nagkantidad kini kanamo sa unang 2 ka semana sa prototype ug laing 4 ka semana.

Sayon ra ang pagkuha sa kini nga klase sa problema - naghimo kami usa ka CTE ug nagbasa kuno usa ka butang niini. Sa tinuud, ang PostgreSQL "maalam" ug dili magbasa bisan unsa nga direkta didto. Dayon atong kuhaon ang unang rekord gikan niini, ug ngadto niini ang usa ka gatos ug una gikan sa samang CTE.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Gitan-aw namon ang plano ug nasabtan - kini katingad-an, kami adunay 3 nga buffer (mga panid sa datos) nga "gikonsumo" sa Seq Scan, 1 pa sa CTE Scan, ug 2 pa sa ikaduha nga CTE Scan. Sa ato pa, kung isumaryo lang nato ang tanan, makakuha kita og 6, apan gikan sa tableta 3 ra ang atong mabasa! Ang CTE Scan dili magbasa bisan unsa gikan sa bisan diin, apan direkta nga molihok sa memorya sa proseso. Sa ato pa, adunay klaro nga sayup dinhi!

Sa tinuud, kini nahimo nga ania ang tanan nga 3 nga mga panid sa datos nga gihangyo gikan sa Seq Scan, una ang 1 nangayo alang sa 1st CTE Scan, ug dayon ang 2nd, ug 2 pa ang gibasa kaniya. Sa ato pa, usa ka kinatibuk-an nga 3 ka pahina ang gibasa nga datos, dili 6.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Ug kini nga hulagway nagdala kanato ngadto sa pagsabut nga ang pagpatuman sa usa ka plano dili na usa ka kahoy, apan usa lamang ka matang sa acyclic graph. Ug kami adunay usa ka diagram nga sama niini, aron among masabtan kung unsa ang gikan sa kung diin sa una. Sa ato pa, diri mi nagmugna ug CTE gikan sa pg_class, ug kaduha namo gipangayo, ug halos tanan namong oras nagasto sa branch pagka 2nd time namo nangayo. Klaro nga ang pagbasa sa ika-101 nga entry mas mahal kaysa pagbasa lang sa 1st entry gikan sa tablet.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Nakaginhawa mig kadiyot. Miingon sila: β€œKaron, Neo, kahibalo ka na kung fu! Karon ang among kasinatian naa sa imong screen. Karon mahimo nimong gamiton kini." [artikulo]

Pagkonsolida sa log

Nakaginhawa sa kahupayan ang among 1000 ka developers. Apan nakasabut kami nga kami adunay gatusan ra nga "kombat" nga mga server, ug kining tanan nga "kopya-paste" sa bahin sa mga nag-develop dili gyud kombenyente. Among naamgohan nga kinahanglan namong kolektahon kini sa among kaugalingon.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Sa kinatibuk-an, adunay usa ka sumbanan nga module nga makakolekta sa mga estadistika, bisan pa, kinahanglan usab kini nga ma-aktibo sa config - kini module pg_stat_statements. Apan wala siya moangay kanamo.

Una, nag-assign kini sa parehas nga mga pangutana gamit ang lainlaing mga laraw sulod sa parehas nga database lain-laing mga QueryId. Kana mao, kung una nimong buhaton SET search_path = '01'; SELECT * FROM user LIMIT 1;ug unya SET search_path = '02'; ug ang sama nga hangyo, nan ang mga estadistika niini nga module adunay lain-laing mga rekord, ug ako dili makahimo sa pagkolekta sa kinatibuk-ang estadistika ilabi na sa konteksto niini nga hangyo profile, nga walay pagtagad sa mga laraw.

Ang ikaduhang punto nga nakapugong kanamo sa paggamit niini mao kulang sa mga plano. Sa ato pa, walay plano, anaa ra ang hangyo sa iyang kaugalingon. Nakita namon kung unsa ang naghinay, apan wala kami makasabut kung ngano. Ug dinhi mibalik kita sa problema sa usa ka paspas nga pagbag-o sa dataset.

Ug ang katapusang gutlo- kulang sa "mga kamatuoran". Sa ato pa, dili nimo matubag ang usa ka piho nga pananglitan sa pagpatuman sa pangutana - wala, adunay giipon nga estadistika. Bisan kung posible nga magtrabaho niini, lisud kaayo.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Busa, nakahukom kami nga makig-away sa copy-paste ug nagsugod sa pagsulat tigkolekta.

Ang kolektor nagkonektar pinaagi sa SSH, nagtukod og usa ka luwas nga koneksyon sa server nga adunay database gamit ang usa ka sertipiko, ug tail -F "nagkupot" niini sa log file. Busa sa niini nga sesyon nakakuha kami usa ka kompleto nga "salamin" sa tibuuk nga file sa log, nga gimugna sa server. Ang load sa server mismo gamay ra, tungod kay wala kami nag-parse bisan unsa didto, nagsalamin lang kami sa trapiko.

Tungod kay nagsugod na kami sa pagsulat sa interface sa Node.js, nagpadayon kami sa pagsulat sa kolektor niini. Ug kini nga teknolohiya nagpakamatarung sa iyang kaugalingon, tungod kay kini sayon ​​​​kaayo nga gamiton ang JavaScript aron magtrabaho uban ang huyang nga na-format nga datos sa teksto, nga mao ang log. Ug ang imprastraktura sa Node.js mismo ingon usa ka platform sa backend nagtugot kanimo nga dali ug dali nga magtrabaho sa mga koneksyon sa network, ug sa tinuud sa bisan unsang mga sapa sa datos.

Tungod niini, kami "nag-una" sa duha ka koneksyon: ang una nga "pagpamati" sa log mismo ug gidala kini sa among kaugalingon, ug ang ikaduha nga kanunay nga mangutana sa base. "Apan ang log nagpakita nga ang karatula nga adunay oid 123 gibabagan," apan wala kini gipasabut sa bisan unsa sa developer, ug maayo nga pangutan-on ang database, "Unsa man ang OID = 123?" Ug mao nga matag karon ug unya among gipangutana ang sukaranan kung unsa ang wala pa namon nahibal-an bahin sa among kaugalingon.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

"Adunay usa ra ka butang nga wala nimo tagda, adunay usa ka espisye sa mga putyokan nga sama sa elepante!.." Nagsugod kami sa pag-ugmad niini nga sistema sa dihang gusto namong bantayan ang 10 ka mga server. Ang labing kritikal sa atong pagsabot, diin mitumaw ang pipila ka problema nga lisod sagubangon. Apan sa unang quarter, nakadawat kami og usa ka gatos alang sa pag-monitor - tungod kay ang sistema nagtrabaho, ang tanan gusto niini, ang tanan komportable.

Ang tanan niini kinahanglan nga idugang, ang dagan sa datos dako ug aktibo. Sa tinuud, kung unsa ang among gibantayan, kung unsa ang mahimo namon nga atubangon, mao ang among gigamit. Gigamit usab namo ang PostgreSQL isip pagtipig sa datos. Ug walay mas paspas nga "ibubo" ang datos niini kay sa operator COPY Dili pa.

Apan ang yano nga "pagbubo" sa datos dili gyud ang among teknolohiya. Tungod kay kung ikaw adunay gibana-bana nga 50k nga mga hangyo matag segundo sa usa ka gatos nga mga server, nan kini makamugna og 100-150GB nga mga log kada adlaw. Busa, kinahanglan namon nga maampingon nga "giputol" ang base.

Una, among gibuhat pagbahin sa adlaw, tungod kay, sa kinatibuk-an, walay usa nga interesado sa correlation tali sa mga adlaw. Unsang kalainan ang nahimo niini kung unsa ang naa kanimo kagahapon, kung karong gabhiona imong gilukot ang usa ka bag-ong bersyon sa aplikasyon - ug pipila na ka bag-ong estadistika.

Ikaduha, nahibal-an namon (gipugos) kaayo, paspas kaayo sa pagsulat gamit COPY. Sa ato pa, dili lang COPYkay mas paspas siya kay INSERT, ug mas paspas pa.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Ang ikatulo nga punto - kinahanglan nako biyai ang mga trigger, matag usa, ug langyaw nga mga yawe. Sa ato pa, wala gyud miy referential integrity. Tungod kay kung ikaw adunay usa ka lamesa nga adunay usa ka pares nga mga FK, ug giingon nimo sa istruktura sa database nga "ania ang usa ka talaan sa log nga gi-refer sa FK, pananglitan, sa usa ka grupo sa mga rekord," unya kung imong gisulud kini, PostgreSQL wala nay nahabilin gawas kung giunsa kini pagkuha ug buhaton kini nga matinud-anon SELECT 1 FROM master_fk1_table WHERE ... uban sa identifier nga imong gisulayan sa pagsal-ot - aron lang masusi nga kini nga rekord anaa didto, nga dili nimo "mabungkag" kini nga Langyaw nga Yawe sa imong pagsal-ot.

Imbis nga usa ka rekord sa target nga lamesa ug ang mga indeks niini, makuha namon ang dugang nga kaayohan sa pagbasa gikan sa tanan nga mga lamesa nga gitumong niini. Apan dili gyud namo kinahanglan kini - ang among tahas mao ang pagrekord kutob sa mahimo ug sa labing madali nga mahimo nga adunay labing gamay nga karga. Busa FK - ubos!

Ang sunod nga punto mao ang aggregation ug hashing. Sa sinugdan, gipatuman namo kini sa database - human sa tanan, sayon ​​​​ra dayon, kung moabut ang usa ka rekord, buhaton kini sa usa ka matang sa tablet "dugang usa" diha mismo sa gatilyo. Aw, kini kombenyente, apan ang parehas nga dili maayo nga butang - gisulud nimo ang usa ka rekord, apan napugos sa pagbasa ug pagsulat sa lain nga butang gikan sa laing lamesa. Dugang pa, dili lamang ikaw magbasa ug magsulat, buhaton usab nimo kini matag higayon.

Karon hunahunaa nga ikaw adunay usa ka lamesa diin imong giihap ang gidaghanon sa mga hangyo nga nakaagi sa usa ka piho nga host: +1, +1, +1, ..., +1. Ug ikaw, sa prinsipyo, wala magkinahanglan niini - posible ang tanan sum sa memorya sa kolektor ug ipadala sa database sa usa ka go +10.

Oo, sa kaso sa pipila ka mga problema, ang imong lohikal nga integridad mahimong "mabungkag", apan kini usa ka halos dili realistiko nga kaso - tungod kay ikaw adunay usa ka normal nga server, kini adunay usa ka baterya sa controller, ikaw adunay usa ka transaksyon log, usa ka log sa file system... Sa kinatibuk-an, dili kini takus niini. Ang pagkawala sa produktibidad nga imong makuha gikan sa pagpadagan sa mga gatilyo/FK dili angay sa gasto nga imong naangkon.

Kini mao ang sama sa hashing. Ang usa ka piho nga hangyo molupad kanimo, imong kuwentahon ang usa ka piho nga identifier gikan niini sa database, isulat kini sa database ug dayon isulti kini sa tanan. Maayo ang tanan hangtod, sa oras sa pagrekord, usa ka ikaduha nga tawo ang moabut kanimo nga gusto nga irekord ang parehas nga butang - ug ma-block ka, ug kini daotan na. Busa, kung mahimo nimo ibalhin ang henerasyon sa pipila ka mga ID sa kliyente (relasyon sa database), mas maayo nga buhaton kini.

Hingpit lang alang kanamo ang paggamit sa MD5 gikan sa teksto - hangyo, plano, template,... Among kuwentahon kini sa bahin sa kolektor, ug "ibubo" ang andam nga ID sa database. Ang gitas-on sa MD5 ug adlaw-adlaw nga pagbahin nagtugot kanamo nga dili mabalaka bahin sa posible nga pagbangga.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Apan aron dali nga marekord kining tanan, kinahanglan namon nga usbon ang pamaagi sa pagrekord mismo.

Giunsa nimo pagsulat ang datos? Kami adunay usa ka matang sa dataset, among gibahin kini ngadto sa daghang mga lamesa, ug dayon KOPYA kini - una ngadto sa una, dayon ngadto sa ikaduha, ngadto sa ikatulo ... Kini dili kombenyente, tungod kay kami daw nagsulat sa usa ka data stream sa tulo ka mga lakang sunodsunod. Dili maayong. Mahimo ba kini nga mas paspas? Mahimo!

Aron mahimo kini, igo na nga madugta kini nga mga agos nga managsama sa usag usa. Kini nahimo nga kami adunay mga sayup, mga hangyo, mga template, mga pag-block, ... nga naglupad sa lain nga mga hilo - ug among gisulat ang tanan nga managsama. Igo na alang niini ipadayon ang usa ka COPY channel nga kanunay nga bukas alang sa matag indibidwal nga target nga lamesa.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Sa ato pa, sa kolektor naa gyuy sapa, diin ako makasulat sa datos nga akong gikinahanglan. Apan aron ang database makakita niini nga datos, ug ang usa ka tawo dili makapugong sa paghulat sa kini nga datos nga isulat, Ang COPY kinahanglang mabalda sa pipila ka mga agwat. Alang kanamo, ang labing epektibo nga panahon mga 100ms - gisirhan namon kini ug giablihan dayon kini sa parehas nga lamesa. Ug kung wala kami igo nga usa ka dagan sa panahon sa pipila nga mga taluktok, nan kami nagtipon sa usa ka piho nga limitasyon.

Dugang pa, nahibal-an namon nga alang sa ingon nga profile sa pagkarga, bisan unsang pagtipon, kung ang mga rekord gikolekta sa mga batch, daotan. Ang klasiko nga daotan mao INSERT ... VALUES ug dugang 1000 ka rekord. Tungod kay sa punto nga ikaw adunay usa ka peak sa pagsulat sa media, ug ang tanan nga naningkamot sa pagsulat sa usa ka butang sa disk maghulat.

Aron mawagtang ang ingon nga mga anomaliya, ayaw lang pag-ipon bisan unsa, ayaw gyud buffer. Ug kung mahitabo ang buffering sa disk (maayo na lang, ang Stream API sa Node.js nagtugot kanimo nga mahibal-an) - i-postpone kini nga koneksyon. Kung makadawat ka usa ka panghitabo nga libre na usab, sulati kini gikan sa natipon nga pila. Ug samtang kini busy, kuhaa ang sunod nga libre gikan sa pool ug sulati kini.

Sa wala pa ipaila kini nga pamaagi sa pagrekord sa datos, kami adunay gibana-bana nga 4K write ops, ug niining paagiha among gipakubsan ang load sa 4 ka beses. Karon sila mitubo sa laing 6 ka beses tungod sa bag-ong gibantayan nga mga database - hangtod sa 100MB/s. Ug karon nagtipig kami og mga troso sa miaging 3 ka bulan sa gidaghanon nga mga 10-15TB, naglaum nga sa tulo lang ka bulan ang bisan kinsa nga developer makahimo sa pagsulbad sa bisan unsang problema.

Nakasabot mi sa mga problema

Apan ang pagkolekta lamang sa tanan niini nga datos maayo, mapuslanon, may kalabutan, apan dili igo - kini kinahanglan nga masabtan. Tungod kay kini milyon-milyon nga lainlaing mga plano matag adlaw.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Apan minilyon ang dili madumala, kinahanglan una natong buhaton ang "mas gamay". Ug, una sa tanan, kinahanglan ka magdesisyon kung giunsa nimo pag-organisar kining "gamay" nga butang.

Giila namo ang tulo ka importanteng punto:

  • kinsa nagpadala niini nga hangyo
    Kana mao, gikan sa unsa nga aplikasyon kini "miabot": web interface, backend, sistema sa pagbayad o uban pa.
  • diin nahitabo ni
    Sa unsa nga piho nga server? Tungod kay kung adunay ka daghang mga server sa ilawom sa usa ka aplikasyon, ug sa kalit ang usa nga "mabuang" (tungod kay ang "disk nadunot", "naka-leak ang memorya", uban pang problema), nan kinahanglan nimo nga espesipikong sulbaron ang server.
  • sa unsa nga paagi ang problema nagpakita sa iyang kaugalingon sa usa ka paagi o sa lain

Aron masabtan ang "kinsa" nagpadala kanamo og usa ka hangyo, naggamit kami og usa ka standard nga himan - nagbutang sa usa ka variable sa sesyon: SET application_name = '{bl-host}:{bl-method}'; β€” gipadala namo ang ngalan sa host logic sa negosyo diin gikan ang hangyo, ug ang ngalan sa pamaagi o aplikasyon nga nagsugod niini.

Human namo mapasa ang "tag-iya" sa hangyo, kini kinahanglan nga output sa log - alang niini among gi-configure ang variable log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Alang sa mga interesado, tingali tan-awa sa manwalunsay pasabot ani tanan. Kini nahimo nga atong makita sa log:

  • ang panahon
  • mga identifier sa proseso ug transaksyon
  • ngalan sa database
  • IP sa tawo nga nagpadala niini nga hangyo
  • ug ngalan sa pamaagi

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Unya nahibal-an namon nga dili kaayo makapaikag ang pagtan-aw sa correlation alang sa usa ka hangyo tali sa lainlaing mga server. Dili kasagaran nga ikaw adunay usa ka sitwasyon diin ang usa ka aplikasyon mag-screw nga parehas dinhi ug didto. Apan bisan kung parehas kini, tan-awa ang bisan unsang mga server.

Busa ania ang pagputol "usa ka server - usa ka adlaw" kini nahimo nga igo na alang kanamo alang sa bisan unsang pagtuki.

Ang una nga analitikal nga seksyon parehas "sampol" - usa ka pinamubo nga porma sa presentasyon sa plano, gilimpyohan sa tanang numerical indicators. Ang ikaduha nga pagputol mao ang aplikasyon o pamaagi, ug ang ikatulo nga pagputol mao ang piho nga node sa plano nga hinungdan sa mga problema.

Kung mibalhin kami gikan sa piho nga mga higayon ngadto sa mga template, nakakuha kami duha ka mga bentaha sa usa ka higayon:

  • daghang pagkunhod sa gidaghanon sa mga butang alang sa pagtuki
    Kinahanglan naton analisahon ang problema dili na pinaagi sa libu-libo nga mga pangutana o plano, apan pinaagi sa daghang mga template.
  • timeline
    Kana mao, pinaagi sa pag-summarize sa "mga kamatuoran" sulod sa usa ka seksyon, mahimo nimong ipakita ang ilang hitsura sa adlaw. Ug dinhi mahibal-an nimo nga kung adunay ka usa ka matang sa sumbanan nga mahitabo, pananglitan, kausa sa usa ka oras, apan kinahanglan kini mahitabo kausa sa usa ka adlaw, kinahanglan nimo nga hunahunaon kung unsa ang sayup - kinsa ang hinungdan niini ug ngano, tingali kinahanglan kini dinhi. dili unta. Kini mao ang lain nga non-numerical, puro biswal, pamaagi sa pagtuki.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Ang nahabilin nga mga pamaagi gibase sa mga indikasyon nga among gikuha gikan sa plano: kung pila ka beses nga nahitabo ang ingon nga sumbanan, ang kinatibuk-an ug kasagaran nga oras, kung pila ang datos nga nabasa gikan sa disk, ug pila ang gikan sa memorya...

Tungod kay, pananglitan, mianhi ka sa panid sa analytics alang sa host, tan-awa - adunay nagsugod sa pagbasa sa sobra sa disk. Ang disk sa server dili makadumala niini - kinsa nagbasa gikan niini?

Ug mahimo ka mag-sort sa bisan unsang kolum ug magdesisyon kung unsa ang imong atubangon karon - ang pagkarga sa processor o ang disk, o ang kinatibuk-ang gidaghanon sa mga hangyo... Gihan-ay namon kini, gitan-aw ang mga "ibabaw", giayo kini ug gilukot ang usa ka bag-ong bersyon sa aplikasyon.
[video nga lecture]

Ug diha-diha dayon makita nimo ang lainlaing mga aplikasyon nga adunay parehas nga template gikan sa usa ka hangyo sama SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, pagproseso... Ug nahibulong ka nganong ang pagproseso magbasa sa user kung dili siya makig-uban kaniya.

Ang kaatbang nga paagi mao ang pagtan-aw dayon gikan sa aplikasyon kung unsa ang gibuhat niini. Pananglitan, ang frontend mao kini, kini, kini, ug kini kausa sa usa ka oras (ang timeline makatabang). Ug ang pangutana mitungha dayon: morag dili trabaho sa frontend ang pagbuhat sa usa ka butang kausa sa usa ka oras...

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Paglabay sa pipila ka panahon, among naamgohan nga kulang kami sa aggregate estadistika pinaagi sa mga node sa plano. Gilain namon gikan sa mga plano ang mga node lamang nga adunay mga datos sa mga lamesa mismo (basaha / isulat kini pinaagi sa indeks o dili). Sa tinuud, usa ra ka aspeto ang gidugang kalabot sa miaging litrato - pila ka rekord ang nadala niini nga node kanamo?, ug pila ang gilabay (Rows Removed by Filter).

Wala ka'y ​​angay nga indeks sa plato, nangayo ka niini, molupad kini sa index, nahulog sa Seq Scan ... nasala nimo ang tanan nga mga rekord gawas sa usa. Ngano nga kinahanglan nimo ang 100M nga nasala nga mga rekord kada adlaw? Dili ba mas maayo nga i-roll up ang indeks?

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Sa pag-analisar sa tanan nga mga plano nga node sa node, among naamgohan nga adunay pipila ka mga tipikal nga istruktura sa mga plano nga lagmit kaayo tan-awon nga kadudahan. Ug maayo nga isulti sa nag-develop: "Higala, ania ka una nga nagbasa pinaagi sa indeks, dayon pagsunud, ug dayon putlon" - ingon usa ka lagda, adunay usa ka rekord.

Ang tanan nga nagsulat og mga pangutana tingali nakasinati niini nga sumbanan: "Ihatag kanako ang katapusang order alang sa Vasya, ang petsa niini." Ug kung wala ka'y ​​indeks sa petsa, o walay petsa sa indeks nga imong gigamit, nan ikaw tikang sa parehas nga "rake" .

Apan nahibal-an namon nga kini usa ka "rake" - busa nganong dili dayon isulti sa developer kung unsa ang kinahanglan niyang buhaton. Tungod niini, sa pagbukas sa usa ka plano karon, ang among developer nakakita dayon og usa ka matahum nga litrato nga adunay mga tip, diin gisultihan dayon nila siya: "Adunay ka mga problema dinhi ug didto, apan kini masulbad niining paagiha ug niana nga paagi."

Ingon usa ka sangputanan, ang gidaghanon sa kasinatian nga gikinahanglan aron masulbad ang mga problema sa sinugdanan ug karon mikunhod pag-ayo. Kini ang matang sa himan nga anaa kanato.

Mass optimization sa PostgreSQL nga mga pangutana. Kirill Borovikov (Tensor)

Source: www.habr.com

Idugang sa usa ka comment