{"id":78742,"date":"2020-04-21T19:42:46","date_gmt":"2020-04-21T17:42:46","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov"},"modified":"2020-04-21T19:42:46","modified_gmt":"2020-04-21T17:42:46","slug":"promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","title":{"rendered":"Approccio industriale alla messa a punto di PostgreSQL: esperimenti su database\u00bb. Nikolay Samokhvalov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Ti invitiamo a leggere la trascrizione della relazione di Nikolai Samokhvalov 'Approccio industriale al tuning di PostgreSQL: esperimenti sui database'<\/strong><\/p>\n<p><\/p>\n<p>Shared_buffers = 25% \u2013 \u00e8 troppo o troppo poco? O va bene cos\u00ec? Come capire se questa \u2013 piuttosto obsoleta \u2013 raccomandazione \u00e8 adatta al tuo caso specifico?<\/p>\n<p><\/p>\n<p>\u00c8 giunto il momento di affrontare la questione della selezione dei parametri di postgresql.conf 'in modo serio'. Non attraverso 'autotuner' ciechi o consigli obsoleti da articoli e blog, ma basandosi su:<\/p>\n<p><\/p>\n<ol>\n<li>esperimenti rigorosamente controllati sui database, condotti in modo automatizzato, in grande quantit\u00e0 e in condizioni il pi\u00f9 possibile simili a quelle 'di combattimento',<\/li>\n<li>una comprensione profonda delle peculiarit\u00e0 del funzionamento del DBMS e del sistema operativo.<\/li>\n<\/ol>\n<p><\/p>\n<p>Utilizzando Nancy CLI (<noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres.ai\/nancy\">https:\/\/gitlab.com\/postgres.ai\/nancy<\/a><\/noindex>), esamineremo un caso concreto \u2013 i famigerati shared_buffers \u2013 in diverse situazioni, in diversi progetti e cercheremo di capire come ottimizzare le impostazioni per la nostra infrastruttura, DB e carico di lavoro.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a15b93734b6563abaec4a713c975732a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Si parler\u00e0 di esperimenti sui database. Questa \u00e8 una storia che dura da poco pi\u00f9 di sei mesi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/e77255c4abaa2a01ae37fe888fe67db7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un po' su di me. Ho un'esperienza con Postgres di oltre 14 anni. Ho fondato diverse aziende nel settore dei social network. In ognuna di esse sono stati utilizzati Postgres e sono ancora utilizzati.<\/p>\n<p><\/p>\n<p>Inoltre, il gruppo RuPostgres su Meetup \u00e8 al secondo posto a livello mondiale. Ci stiamo avvicinando lentamente ai 2000 membri. RuPostgres.org.<\/p>\n<p><\/p>\n<p>E nelle varie conferenze, inclusa Highload, mi occupo dei database, in particolare di Postgres sin dalla sua fondazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/fa009b50f1c0293eee80fc03fd2c05f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E negli ultimi anni ho rilanciato la mia attivit\u00e0 di consulenza su Postgres in 11 fusi orari di distanza.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/550c3ddcd516adca14d2b3de9c34b7ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando l'ho fatto qualche anno fa, avevo preso una pausa dal lavoro pratico con Postgres, probabilmente dal 2010. Sono rimasto sorpreso da quanto poco siano cambiati i compiti quotidiani dei DBA, da quanto sia comunque necessario fare ancora molto lavoro manuale. Ho subito pensato che ci fosse qualcosa che non andava, dovevo automatizzare di pi\u00f9.<\/p>\n<p><\/p>\n<p>E dato che tutto ci\u00f2 avveniva a distanza, la maggior parte dei clienti era nel cloud. E gi\u00e0 molte attivit\u00e0 sono state automatizzate, \u00e8 ovvio. Ne parler\u00f2 pi\u00f9 tardi. Cio\u00e8, tutto ci\u00f2 ha portato all'idea che dovrebbero esserci diversi strumenti, cio\u00e8 una sorta di piattaforma, che automatizzer\u00e0 praticamente tutte le azioni del DBA, in modo da poter gestire un gran numero di database.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b02097f0bb23fa9d7c30e38ab9f3de7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questa relazione non ci saranno:<\/p>\n<p><\/p>\n<ul>\n<li>\u00abPallottole d'argento\u00bb e affermazioni del tipo \u2013 imposta 8 GB o 25 % di shared_buffers e andr\u00e0 tutto bene. Si parler\u00e0 di shared_buffers non cos\u00ec tanto. <\/li>\n<li>Componenti hardcore. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ccea359ec78a967c150ddcedc3e50a88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E cosa succeder\u00e0?<\/p>\n<p><\/p>\n<ul>\n<li>Ci saranno principi di ottimizzazione che applichiamo e sviluppiamo. Ci saranno varie idee che ci vengono in mente lungo il cammino e diversi strumenti che creiamo per lo pi\u00f9 in Open Source, cio\u00e8 la base la facciamo in Open Source. Inoltre, abbiamo ticket, tutta la comunicazione praticamente in Open Source. Potete vedere cosa stiamo facendo ora, cosa ci sar\u00e0 nella prossima release, ecc. <\/li>\n<li>Ci sar\u00e0 anche una certa esperienza nell'utilizzo di questi principi e strumenti in diverse aziende: da piccoli startup a grandi imprese. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86e6f379726dec814aca616a30d36a2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come si sviluppa tutto questo?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c1422d9f2945e717c6ebb31f5fef6329.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In primo luogo, il compito principale del DBA, oltre a garantire la creazione di istanze, il dispiegamento dei backup, ecc., \u00e8 la ricerca dei colli di bottiglia e l'ottimizzazione delle prestazioni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8e682ca8666e94d6688348ebe4540327.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora funziona in questo modo. Guardiamo il monitoraggio, vediamo qualcosa, ci mancano alcuni dettagli. Iniziamo a scavare pi\u00f9 a fondo, di solito manualmente, e capiamo come affrontare la situazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/04599422ea6b6d57c79a4e48ba2db8b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono due approcci. Pg_stat_statements \u00e8 la soluzione standard per individuare le query lente. E l'analisi dei log di Postgres utilizzando pgBadger.<\/p>\n<p><\/p>\n<p>Ciascuno degli approcci ha seri svantaggi. Nel primo approccio abbiamo buttiamo via tutti i parametri. E se vediamo gruppi SELECT * FROM table where una colonna \u00e8 uguale al segno \u00ab?\u00bb o \u00ab$\u00bb a partire dalla versione Postgres 10. Non sappiamo se si tratta di un index scan o di un seq scan. Dipende molto dal parametro. Se ci metti un valore raro, sar\u00e0 index scan. Se metti un valore che rappresenta il 90 % della tabella, sar\u00e0 ovviamente seq scan, perch\u00e9 Postgres conosce la statistica. E questo \u00e8 un grande svantaggio di pg_stat_statements, anche se si stanno facendo dei lavori.<\/p>\n<p><\/p>\n<p>L'analisi dei log ha il principale svantaggio che non puoi permetterti di avere \u00ablog_min_duration_statement = 0\u00bb, in genere. E di questo parleremo anche. Di conseguenza, non vedi l'intera situazione. E una query che \u00e8 molto veloce pu\u00f2 consumare una grande quantit\u00e0 di risorse, ma non la vedrai, perch\u00e9 \u00e8 sotto la tua soglia.<\/p>\n<p><\/p>\n<p><strong>Come risolvono i DBA i problemi trovati?<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5e57fefdec6256f82045aaac037b516c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ad esempio, abbiamo riscontrato un problema. Cosa si fa di solito? Se sei uno sviluppatore, lavorerai su qualche istanza che non \u00e8 di quelle dimensioni. Se sei un DBA, hai uno staging. E pu\u00f2 essercene solo uno. E questo \u00e8 rimasto indietro di sei mesi. E pensi che andr\u00e0 in produzione. E anche i DBA esperti controllano poi in produzione, su una replica. A volte creano un indice temporaneo, si assicurano che sia utile, lo eliminano e lo restituiscono agli sviluppatori per inselinarlo nei file di migrazione. Questo sta succedendo ora. Ed \u00e8 un problema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/402e80c7e5fbca6a054c0c9ec61e5fe3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Ottimizzare le configurazioni.<\/li>\n<li>Ottimizzare il set di indici. <\/li>\n<li>Modificare la query SQL stessa (questo \u00e8 il metodo pi\u00f9 complesso).<\/li>\n<li>Aggiungere potenza (il modo pi\u00f9 semplice nella maggior parte dei casi).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8a6b3cd56e0df5c7908714926ba1eb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono molte cose da considerare. Ci sono molte leve in Postgres. \u00c8 necessario sapere molto. Ci sono molti indici in Postgres, grazie anche agli organizzatori di questa conferenza. E bisogna sapere tutto questo, ed \u00e8 proprio questo che d\u00e0 ai non DBA l'impressione che i DBA si occupino di magia nera. Cio\u00e8, bisogna dedicarsi a questo per almeno 10 anni per iniziare a capire tutto correttamente.<\/p>\n<p><\/p>\n<p>E io sono un combattente contro questa magia nera. Voglio fare in modo che ci sia tecnologia, e non intuito in tutto questo.<\/p>\n<p><\/p>\n<p><strong>Esempi dalla vita<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/70b11c3df9c41c66570635d5f309ed24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'ho osservato in almeno due progetti, incluso il mio. Un ulteriore post sul blog ci informa che il valore di 1000 per default_statistic_target \u00e8 buono. Va bene, proviamo in produzione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0b4c2bd6f73df06967c94d5d78b07279.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E qui noi, usando il nostro strumento due anni dopo grazie a esperimenti su database di cui parliamo oggi, possiamo confrontare cosa c'era e cosa \u00e8 diventato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/3564eade6532003d2279c2736ab6d733.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E per questo dobbiamo creare un esperimento. Esso \u00e8 composto da quattro parti. <\/p>\n<p><\/p>\n<ul>\n<li>La prima parte \u00e8 l'ambiente. Abbiamo bisogno di hardware. E quando arrivo in un'azienda e firmo un contratto, chiedo che mi diano hardware identico a quello di produzione. Per ciascuno dei vostri Master ho bisogno di almeno un hardware identico. O \u00e8 un'istanza virtuale su Amazon o Google, o ho bisogno di hardware proprio cos\u00ec. Cio\u00e8, voglio ricreare l'ambiente. E nel concetto di ambiente includiamo la versione principale di Postgres. <\/li>\n<li>La seconda parte \u00e8 l'oggetto delle nostre ricerche. \u00c8 il database. Pu\u00f2 essere creato in diversi modi. Vi mostrer\u00f2 come. <\/li>\n<li>La terza parte \u00e8 il carico. Questo \u00e8 il momento pi\u00f9 complesso. <\/li>\n<li>E la quarta parte \u00e8 ci\u00f2 che controlliamo, cio\u00e8 con cosa confronteremo. Supponiamo che possiamo cambiare uno o pi\u00f9 parametri nella configurazione, oppure possiamo creare un indice, e cos\u00ec via. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8ccd09ac4cdd336618413375617c10a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Stiamo lanciando un esperimento. Ecco pg_stat_statements. A sinistra c'\u00e8 quello che era. A destra c'\u00e8 come \u00e8 diventato.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/6f82d7e25a77b700f2ddb01f42a861a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A sinistra default_statistics_target = 100, a destra = 1 000. Vediamo che questo ci ha aiutato. In generale, tutto \u00e8 migliorato dell'8%.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/52dda8fb5fbcb9beecaa1eda8443a374.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma se scorriamo verso il basso, ci saranno gruppi di query da pgBadger o da pg_stat_statements. Ci sono due opzioni. Vedremo che una certa query \u00e8 diminuita dell'88%. E qui entra in gioco l'approccio ingegneristico. Possiamo approfondire ulteriormente, perch\u00e9 \u00e8 interessante capire perch\u00e9 \u00e8 diminuita. Dobbiamo capire cosa c'era con le statistiche. Perch\u00e9 pi\u00f9 bucket nella statistica portano a risultati peggiori.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4e6dfc04af4b3fc2b626dd46c08bdf66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oppure possiamo non approfondire, ma fare un 'ALTER TABLE \u2026 ALTER COLUMN' e riportarli a 100 bucket nella statistica di questa colonna. E poi, con un ulteriore esperimento, possiamo assicurarci che questa patch abbia funzionato. Tutto qui. Questo \u00e8 l'approccio ingegneristico che ci aiuta a vedere il quadro e prendere decisioni basate sui dati, non sull'intuizione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c87df172b994a4523478beebaf4a0275.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/9e766aa4348bd1a77b697e3179d84bbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alcuni esempi da altri settori. Nei test ci sono test CI gi\u00e0 da molti anni. E nessun progetto sensato ormai pu\u00f2 vivere senza test automatici.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b6c21981dc8b2b285973ae42199e2b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In altri settori: nell'aviazione, nell'industria automobilistica, quando testiamo l'aerodinamica, abbiamo anche la possibilit\u00e0 di fare esperimenti. Non lanceremo qualcosa direttamente nello spazio dal progetto n\u00e9 porteremo un'auto sulla pista subito. Ad esempio, c'\u00e8 una galleria del vento. <\/p>\n<p><\/p>\n<p>Dalle osservazioni di altri settori possiamo trarre conclusioni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cef02ea9280e5795d1e593c600f0541b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per prima cosa, abbiamo un ambiente speciale. \u00c8 vicino alla produzione, ma non troppo. La sua principale caratteristica \u00e8 che deve essere economico, ripetibile e il pi\u00f9 automatizzato possibile. E devono esserci strumenti specializzati per condurre un'analisi dettagliata.<\/p>\n<p><\/p>\n<p>\u00c8 probabile che quando lanciamo l'aereo e siamo in volo, abbiamo meno opportunit\u00e0 di studiare ogni millimetro della superficie dell'ala rispetto a quanto possiamo fare in una galleria del vento. Abbiamo pi\u00f9 strumenti per la diagnosi. Possiamo permetterci di caricare pi\u00f9 cose pesanti, che non possiamo permetterci di installare sull'aereo in volo. Anche con Postgres. In alcuni casi possiamo attivare la registrazione completa delle query durante gli esperimenti. E noi non vogliamo farlo in produzione. Potremmo anche attivarlo in futuro con l'aiuto di auto_explain.<\/p>\n<p><\/p>\n<p>E come ho gi\u00e0 detto, un alto livello di automazione significa che abbiamo premuto un pulsante e ripetuto. Cos\u00ec deve essere, per avere tanti esperimenti e per essere in modo continuativo.<\/p>\n<p><\/p>\n<p>Nancy CLI \u2013 la base del \"laboratorio DB\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/f8303df21f309fb209929acec260b757.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco, abbiamo fatto una cosa del genere. Cio\u00e8, ho parlato di queste idee a giugno, quasi un anno fa. E abbiamo gi\u00e0 in Open Source quella che chiamiamo Nancy CLI. Questa \u00e8 la base per costruire un laboratorio per basi di dati.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0ed3c72461123745be4fa9e58455baa0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\">Nancy<\/a><\/noindex> \u2013 \u00c8 in Open Source, su Gitlab. Potete dirlo, potete provarlo. Ho messo un link nelle slide. Potete cliccarlo e l\u00ec ci sar\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\/-\/blob\/master\/help\/nancy_run.md\">help<\/a><\/noindex> per tutti i parametri.<\/p>\n<p><\/p>\n<p>Certo, c'\u00e8 ancora molto in fase di sviluppo. Ci sono molte idee. Ma \u00e8 gi\u00e0 quello che applichiamo praticamente ogni giorno. E quando abbiamo un'idea \u2013 ad esempio, cosa succede se cancelliamo 40.000.000 righe e ci troviamo tutto bloccato su IO, possiamo fare un esperimento e guardare pi\u00f9 da vicino per capire cosa sta succedendo e poi cercare di correggerlo al volo. Cio\u00e8, facciamo un esperimento. Ad esempio, regoliamo qualcosa e vediamo cosa otteniamo alla fine. E non lo facciamo in produzione. Questa \u00e8 l'essenza dell'idea.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c22d332de4b45d604dfb9c5a95404fd6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dove pu\u00f2 funzionare? Pu\u00f2 funzionare localmente, cio\u00e8 si pu\u00f2 fare ovunque, si pu\u00f2 anche avviare su un MacBook. Serve Docker, andiamo. E basta. Pu\u00f2 essere avviato in qualche istanza su un server fisico, o in una macchina virtuale, ovunque.<\/p>\n<p><\/p>\n<p>C'\u00e8 anche la possibilit\u00e0 di avviare remotamente su Amazon nei EC2 Instance, negli spot. E questa \u00e8 un'ottima opportunit\u00e0. Ad esempio, ieri abbiamo condotto pi\u00f9 di 500 esperimenti su un'istanza i3, iniziando dalla pi\u00f9 piccola fino a i3-16-xlarge. E questi 500 esperimenti ci sono costati 64 dollari. Ognuno \u00e8 durato 15 minuti. Vale a dire, grazie all'utilizzo degli spot, \u00e8 molto economico - uno sconto del 70%, tariffe al secondo di Amazon. Puoi fare davvero molto. Puoi condurre una ricerca reale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/64c61cc9dd7181296b2ef5b815a17493.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E tre versioni principali di Postgres sono supportate. Non \u00e8 cos\u00ec difficile adattare alcune versioni vecchie e la nuova versione 12.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ee147c91014ab698cbd3c60e193bef23.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Possiamo definire l'oggetto in tre modi. Questi sono:<\/p>\n<p><\/p>\n<ul>\n<li>Dump\/sql-file. <\/li>\n<li>Il modo principale \u00e8 clonare la directory PGDATA. Di solito viene presa dal server di backup. Se hai backup binari adeguati, puoi creare cloni da l\u00ec. Se hai un cloud, sar\u00e0 il provider cloud come Amazon o Google a farlo per te. Questo \u00e8 il modo principale per clonare produzioni reali. \u00c8 proprio cos\u00ec che effettuiamo il nostro schieramento. <\/li>\n<li>L'ultimo modo \u00e8 adatto per ricerche, quando si desidera comprendere come funzioni un certo aspetto di Postgres. \u00c8 pgbench. Puoi generare usando pgbench. \u00c8 semplicemente un'opzione \"db-pgbench\". Gli dici quale scala. E tutto sar\u00e0 generato nel cloud, come indicato.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/2bc3e30cb31a19f66c6b55480447126f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E il carico:<\/p>\n<p><\/p>\n<ul>\n<li>Possiamo eseguire il carico in un singolo thread SQL. Questo \u00e8 il modo pi\u00f9 primitivo. <\/li>\n<li>Oppure possiamo emulare il carico. E la emulazione pu\u00f2 essere fatta prima di tutto in questo modo. Dobbiamo raccogliere tutti i log. E questo \u00e8 doloroso. Ti mostrer\u00f2 perch\u00e9. E usando pgreplay, che \u00e8 integrato in Nancy, lo riproduciamo. <\/li>\n<li>Oppure un'altra opzione. Il cosiddetto carico artigianale, che realizziamo con un certo impegno. Analizzando il nostro carico attuale sul sistema live, estraiamo i gruppi di query principali. E usando pgbench possiamo emulare questo carico in laboratorio. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4adba12881faf9ad9d4f9e9f42c0f5c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Oppure dobbiamo eseguire un certo SQL, vale a dire verifichiamo qualche migrazione, creiamo un indice, eseguiamo ANALAZE. E vediamo cosa c'era prima e dopo il vacuum. In generale, qualsiasi SQL.<\/li>\n<li>O cambiamo uno o pi\u00f9 parametri nella configurazione. Possiamo chiedere di controllare, ad esempio, 100 valori su Amazon per il nostro database di un terabyte. E dopo qualche ora avrete il risultato. In genere, un database di un terabyte impiega diverse ore per avviarsi. Ma nello sviluppo esiste una patch, abbiamo la possibilit\u00e0 di fare una serie di test, cio\u00e8 potete utilizzare lo stesso pgdata su lo stesso server e controllare. Postgres verr\u00e0 riavviato e le cache verranno svuotate. E potete eseguire il carico. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/02985b47bf0ab62e8f1c4cc3ea003f26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Arriva una directory con un sacco di file, a partire dagli snapshot pg<em>stat<\/em>***. E l\u00ec la cosa pi\u00f9 interessante \u00e8 pg_stat_statements, pg_stat_kcache. Questi sono due estensioni che analizzano le query. E pg_stat_bgwriter contiene non solo le statistiche di pgwriter, ma anche informazioni su checkpoint e su come i backend stesso gestiscono i buffer sporchi. \u00c8 tutto interessante da vedere. Ad esempio, quando configuriamo shared_buffers, \u00e8 molto interessante vedere quanto \u00e8 stato espulso.<\/li>\n<li>Arrivano anche i log di Postgres. Due log \u2013 il log di preparazione e il log di esecuzione del carico. <\/li>\n<li>Una nuova funzionalit\u00e0 relativamente \u2013 i FlameGraphs.<\/li>\n<li>Inoltre, se avete utilizzato pgreplay o le varianti di pgbench per l'esecuzione del carico, avrete la loro output nativa. E vedrete latenza e TPS. Si potr\u00e0 capire come l'hanno visto. <\/li>\n<li>Informazioni sul sistema. <\/li>\n<li>Controlli di base CPU e IO. Questo \u00e8 pi\u00f9 per gli istanze EC2 su Amazon, quando vuoi avviare 100 istanze identiche in stream e farci passare 100 esecuzioni diverse, avrai 10.000 esperimenti. E deve essere sicuro che non ti sia capitato un'istanza difettosa, che \u00e8 gi\u00e0 sotto pressione da qualcun altro. Su quel hardware ci sono altre attivit\u00e0 in corso e le risorse scarseggiano. \u00c8 meglio scartare tali risultati. E con l'aiuto di sysbench di Alexey Kopytov facciamo alcuni brevi controlli, che arriveranno e possono essere confrontati con altri, cio\u00e8 capirete come si comporta la CPU e come si comporta l'IO. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c4ddf5283c3c79e3d4c2c061e7dd9e7d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quali sono le complessit\u00e0 tecniche nell'esempio di diverse aziende?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/959690b464a01a4a3cb67ec497becff1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Supponiamo che vogliamo ripetere un carico reale usando i log. \u00c8 un'ottima idea se \u00e8 stato scritto su Open Source pgreplay. Lo utilizziamo. Ma, affinch\u00e9 funzioni bene, devi abilitare il logging completo delle query con i parametri e i timing.<\/p>\n<p><\/p>\n<p>Ci sono alcune difficolt\u00e0 riguardo a duration e timestamp. Tralasceremo tutti questi dettagli. La domanda principale \u00e8: puoi permettertelo o no? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5d08fadbaf67b8a137212302b6adf48a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/NikolayS\/08d9b7b4845371d03e195a8d8df43408\">https:\/\/gist.github.com\/NikolayS\/08d9b7b4845371d03e195a8d8df43408<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Il problema \u00e8 che potrebbe non essere disponibile. Devi prima di tutto capire quale flusso verr\u00e0 registrato nel log. Se hai pg_stat_statements, puoi capire a grandi linee quanti byte verranno scritti al secondo con questa query (il link sar\u00e0 disponibile nelle diapositive).<\/p>\n<p><\/p>\n<p>Guardiamo la lunghezza della query. Trascuriamo il fatto che non ci sono parametri, ma sappiamo la lunghezza della query e sappiamo quante volte al secondo \u00e8 stata eseguita. In questo modo possiamo stimare quanti byte al secondo. Potremmo sbagliarci di due volte, ma capiremo sicuramente l'ordine di grandezza in questo modo.<\/p>\n<p><\/p>\n<p>Possiamo vedere che questa query viene eseguita 802 volte al secondo. E vediamo che bytes_per sec \u2013 300 kB\/s verranno scritti pi\u00f9 o meno. E, di norma, possiamo permetterci questo flusso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/218f905073a8519115adf5c65825b74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma! Il fatto \u00e8 che ci sono diversi sistemi di registrazione. E per impostazione predefinita le persone di solito usano \u00absyslog\u00bb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/66054682083ba2ada174afb5e7ee3973.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se hai syslog, puoi avere un'immagine del genere. Prenderemo pgbench, attiveremo la registrazione delle query e vedremo cosa succede.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a05723dcf10a7733f054ba108bb0f107.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Senza registrazione \u2013 questa \u00e8 la colonna a sinistra. Ottenevamo 161.000 TPS. Con syslog \u2013 su Ubuntu 16.04 su Amazon otteniamo 37.000 TPS. E se cambiamo a due altri metodi di registrazione, la situazione migliora notevolmente. Cio\u00e8, ci aspettavamo un calo, ma non cos\u00ec tanto.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a7d90af9d29761d3b80eb09bf050760f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E su CentOS 7, dove \u00e8 coinvolto anche journald, che trasforma i log in formato binario per una ricerca pi\u00f9 comoda, l\u00e0 \u00e8 un vero disastro, perdiamo 44 volte in TPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86d2af18a0e6364f297a62378b6ede56.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E questo \u00e8 ci\u00f2 con cui convivono le persone. E spesso nelle aziende, soprattutto nelle grandi, \u00e8 molto difficile cambiarlo. Se puoi allontanarti da syslog, allora ti prego di farlo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a167a6fac7f28c7541515f7eff30bdb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Valuta IOPS e flusso di scrittura. <\/li>\n<li>Controlla il tuo sistema di registrazione. <\/li>\n<li>Se il carico previsto \u00e8 eccessivo, prendi in considerazione l'opzione del campionamento. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/127fa1296578ba0ba6eac2b44c5c5398.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo pg_stat_statements. Come ho detto, deve esserci assolutamente. E possiamo prendere e descrivere ogni gruppo di query in modo speciale in un file. E poi possiamo utilizzare una funzione molto utile in pgbench \u2013 la possibilit\u00e0 di fornire diversi file con l'opzione \u00ab-f\u00bb.<\/p>\n<p><\/p>\n<p>Lui comprende molto \u00ab-f\u00bb. E si pu\u00f2 dire usando \u00ab@\u00bb alla fine, quale quota ognuno dei file dovrebbe avere. Cio\u00e8, possiamo dire che questo deve essere eseguito nel 10% dei casi, e questo nel 20%. E questo ci avviciner\u00e0 a ci\u00f2 che vediamo in produzione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b91d18a9861abdc36bfda54cd72a142f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E come capiremo cosa abbiamo in produzione? Qual \u00e8 la quota e cosa riguarda? Qui ci allontaniamo un po'. Abbiamo un altro prodotto <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/postgres-checkup\">postgres-checkup<\/a><\/noindex>. Anche questo \u00e8 basato su Open Source. E attualmente lo stiamo sviluppando attivamente.<\/p>\n<p><\/p>\n<p>\u00c8 nato per ragioni un po' diverse. A causa del fatto che il monitoraggio \u00e8 insufficiente. Cio\u00e8, arrivi, guardi il database, vedi i problemi esistenti. E, di solito, fai un controllo di salute. Se sei un DBA esperto, fai un controllo di salute. Hai esaminato l'uso degli indici, ecc. Se hai OKmeter, va benissimo. \u00c8 un ottimo monitoraggio per Postgres. OKmeter.io \u2013 per favore, installalo, \u00e8 tutto fatto molto bene. \u00c8 a pagamento.<\/p>\n<p><\/p>\n<p>Se non ce l'hai, di solito non hai molto. Nel monitoraggio di solito ci sono CPU, IO e questo con riserve, e basta. E a noi serve di pi\u00f9. Dobbiamo vedere come funziona l'autovacuum, come funziona il checkpoint, in IO dobbiamo separare il checkpoint dal bgwriter e dai backend, ecc.<\/p>\n<p><\/p>\n<p>Il problema \u00e8 che quando aiuti una grande azienda, non possono implementare rapidamente qualcosa. Non riescono ad acquistare rapidamente OKmeter. Magari lo compreranno fra sei mesi. Non possono installare rapidamente alcuni pacchetti. <\/p>\n<p><\/p>\n<p>E ci \u00e8 venuta l'idea che avevamo bisogno di uno strumento speciale che non richieda alcuna installazione, cio\u00e8 non dovete installare nulla in produzione. Lo installi sul tuo laptop, o su un server di osservazione, da cui eseguirai. E analizzer\u00e0 molte cose: sia il sistema operativo, che il file system, e lo stesso Postgres, facendo alcune semplici query che possono essere eseguite direttamente in produzione senza problemi.<\/p>\n<p><\/p>\n<p>L'abbiamo chiamato Postgres-checkup. Se parliamo in termini medici, \u00e8 un controllo della salute regolare. Se parliamo di automobile, \u00e8 come il tagliando. Fai un tagliando alla tua auto ogni sei mesi o un anno, a seconda del modello. E fai un tagliando per il tuo database? Cio\u00e8, fai una ricerca approfondita regolarmente? \u00c8 necessario farlo. Se fai backup, fai anche un checkup, \u00e8 altrettanto importante.<\/p>\n<p><\/p>\n<p>E abbiamo uno strumento del genere. Ha iniziato a nascere attivamente solo tre mesi fa. \u00c8 ancora giovane, ma ha gi\u00e0 molte funzionalit\u00e0.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/514d00b5cb710a7997af0a5dde55b5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Raccogliamo i gruppi di query pi\u00f9 \"influenti\" \u2013 report K003 in Postgres-checkup<\/p>\n<p><\/p>\n<p>E l\u00ec c'\u00e8 un gruppo di report K. Al momento ci sono tre report. E c'\u00e8 questo report K003. L\u00ec troviamo il vertice di pg_stat_statements, ordinato per total_time.<\/p>\n<p><\/p>\n<p>Quando ordiniamo i gruppi di query per total_time, vediamo in cima un gruppo che carica di pi\u00f9 il nostro sistema, cio\u00e8 consuma un maggior numero di risorse. Perch\u00e9 chiamo gruppi di query? Perch\u00e9 abbiamo scartato i parametri. Non si tratta pi\u00f9 di query, ma di gruppi di query, cio\u00e8 sono astratti.<\/p>\n<p><\/p>\n<p>E se ottimizziamo dall'alto verso il basso, alleggeriamo le nostre risorse e ritardiamo il momento in cui dobbiamo fare un upgrade. Questo \u00e8 un ottimo modo per risparmiare denaro.<\/p>\n<p><\/p>\n<p>Forse non \u00e8 il modo migliore in termini di cura degli utenti, perch\u00e9 potremmo non vedere casi rari, ma molto frustranti, in cui una persona ha aspettato 15 secondi. In totale, sono cos\u00ec rari che non li vediamo, ma ci occupiamo delle risorse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d16abc423573e4d923b0c03683c2efee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa \u00e8 successo in questa tabella? Abbiamo effettuato due snapshot. Postgres_checkup ti fornir\u00e0 la delta per ogni metrica: total-time, calls, rows, shared_blks_read, ecc. Ecco, ha calcolato la delta. Un grande problema di pg_stat_statements \u00e8 che non ricorda quando \u00e8 stato resettato. Se pg_stat_database lo ricorda, pg_stat_statements non lo fa. Vedi che c'\u00e8 il numero 1.000.000, ma non sappiamo da dove abbiamo contato.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c370bf1237675e03c0a3d362c025ac24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E qui lo sappiamo, abbiamo due snapshot. Sappiamo che la delta in questo caso era di 56 secondi. Un intervallo molto piccolo. Ordinato per total_time. E poi possiamo differenziare, cio\u00e8 dividiamo tutte le metriche per la duration. Se dividiamo ogni metrica per la duration, avremo il numero di chiamate al secondo.<\/p>\n<p><\/p>\n<p>Successivamente, total_time per secondo \u00e8 la mia metrica preferita. Si misura in secondi, al secondo, cio\u00e8 quanti secondi ha impiegato il nostro sistema per eseguire questo gruppo di query al secondo. Se vedi pi\u00f9 di un secondo al secondo, significa che avevi bisogno di pi\u00f9 di un core. \u00c8 una metrica molto utile. Puoi capire che questa persona, ad esempio, ha bisogno di almeno tre core.<\/p>\n<p><\/p>\n<p>Questo \u00e8 il nostro segreto, non l'ho mai visto da nessuna parte. Fai attenzione: \u00e8 una cosa molto semplice \u2013 secondo per secondo. A volte, quando hai CPU al 100 %, si tratta di mezz'ora al secondo, cio\u00e8 hai dedicato mezz'ora solo a queste query. <\/p>\n<p><\/p>\n<p>In seguito vediamo righe al secondo. Sappiamo quante righe al secondo sono state restituite.<\/p>\n<p><\/p>\n<p>E c'\u00e8 anche una cosa interessante. Quante shared_buffers al secondo abbiamo letto dallo stesso shared_buffers. I colpi erano gi\u00e0 l\u00ec, e le righe le abbiamo prese dalla cache del sistema operativo, oppure dal disco. La prima opzione \u00e8 veloce, mentre la seconda pu\u00f2 essere veloce, ma non sempre, dipende dalla situazione. <\/p>\n<p><\/p>\n<p>E il secondo modo di differenziare \u00e8 dividere il numero di richieste in questo gruppo. Nella seconda colonna avrai sempre una richiesta divisa per richiesta. E poi diventa interessante: quanti millisecondi sono stati in questa richiesta. Sappiamo come si comporta mediamente questa richiesta. Ogni richiesta ha richiesto 101 millisecondi. Questa \u00e8 una metrica tradizionale di cui abbiamo bisogno per comprendere.<\/p>\n<p><\/p>\n<p>Quante righe ogni richiesta ha restituito mediamente. Vediamo che questo gruppo restituisce 8. Quante ne ha prese mediamente dalla cache e lette. Vediamo che tutto \u00e8 stato memorizzato in cache in modo eccellente. Solo hit per il primo gruppo. <\/p>\n<p><\/p>\n<p>E la quarta sotto-stringa in ogni riga \u00e8 la percentuale del totale. Abbiamo chiamate. Supponiamo 1.000.000. E possiamo capire quale contributo porta questo gruppo. Vediamo che in questo caso il primo gruppo contribuisce con meno dello 0,01%. Cio\u00e8 \u00e8 cos\u00ec lento che non lo vediamo nel quadro generale. E il secondo gruppo porta il 5% delle chiamate. Cio\u00e8 il 5% di tutte le chiamate \u00e8 questo secondo gruppo. <\/p>\n<p><\/p>\n<p>Anche per total_time \u00e8 interessante. Abbiamo speso il 14% del tempo totale per il primo gruppo di richieste. E l'11% per il secondo, e cos\u00ec via. <\/p>\n<p><\/p>\n<p>Non scender\u00f2 nei dettagli, ma ci sono delle sottigliezze. Mostriamo un errore dall'alto, perch\u00e9 quando confrontiamo, gli snapshot possono sfuggire, cio\u00e8 alcune richieste possono mancare nel secondo e potrebbero non essere presenti, mentre altre possono apparire. E calcoliamo l'errore l\u00ec. Se vedi 0, va bene. Significa che non ci sono errori. Se la misura dell'errore \u00e8 fino al 20%, va bene. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/327bbf167bc21d37a3e1597b52528e6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In seguito torniamo al nostro argomento. Dobbiamo generare workload. Andiamo dall'alto verso il basso, finch\u00e9 non raggiungiamo l'80% o il 90%. Di solito sono 10-20 gruppi. E facciamo dei file per pgbench. L\u00ec usiamo random. A volte questo, sfortunatamente, non funziona. E nella versione 12 di Postgres ci saranno pi\u00f9 opportunit\u00e0 per utilizzare questo approccio. <\/p>\n<p><\/p>\n<p>E cos\u00ec continuiamo a raccogliere l'80-90 % del total_time. Cosa dobbiamo inserire dopo \u00ab@\u00bb? Guardiamo le chiamate, vediamo quanti sono i percentuali e capiamo che qui dobbiamo avere una certa percentuale. Da queste percentuali possiamo capire come bilanciare ciascun file. Dopo di che utilizziamo pgbench e iniziamo a lavorare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/53edf787f49dcabb5e4731510839332d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo anche K001 e K002. <\/p>\n<p><\/p>\n<p>K001 \u00e8 una grande stringa con quattro sottostringhe. Questa \u00e8 la caratteristica del nostro carico. Guarda la seconda colonna e la seconda sottostringa. Vediamo che \u00e8 circa un secondo e mezzo al secondo, cio\u00e8 se ci sono due core, andr\u00e0 bene. Sar\u00e0 circa il 75 % di carico. E funzioner\u00e0 in questo modo. Se avremo 10 core, saremo davvero tranquilli. In questo modo possiamo valutare le risorse.<\/p>\n<p><\/p>\n<p>K002 \u00e8 quello che io chiamo classi di richieste, cio\u00e8 SELECT, INSERT, UPDATE, DELETE. E a parte SELECT FOR UPDATE, perch\u00e9 blocca. <\/p>\n<p><\/p>\n<p>E qui possiamo concludere che i SELECT normali letti sono il 82 % di tutte le chiamate, ma allo stesso tempo sono il 74 % del total_time. Cio\u00e8 sono molto invocati, ma consumano meno risorse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0e0234e696ffe1c80f8b5acccc602dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E torniamo alla domanda: \u00abCome possiamo scegliere correttamente gli shared_buffers?\u00bb. Osservo che la maggior parte dei benchmark sono costruiti sull'idea \u2013 vediamo quale sar\u00e0 il throughput, cio\u00e8 quale sar\u00e0 la capacit\u00e0 di elaborazione. Essa di solito viene misurata in TPS o QPS.<\/p>\n<p><\/p>\n<p>E cerchiamo di estrarre il massimo dalla macchina grazie ai parametri di ottimizzazione per ottenere quante pi\u00f9 transazioni al secondo possibile. Qui sono precisamente 311 al secondo per SELECT.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d5e73f2672d94bb92eed921ef3dfe0b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma nessuno va al lavoro e torna a casa in macchina a tutta velocit\u00e0. Sarebbe sciocco. E cos\u00ec anche con i database. Non dovremmo viaggiare a tutta velocit\u00e0, anzi, nessuno lo fa. Nessuno vive in produzione con il 100% di CPU. Anche se, forse, qualcuno lo fa, ma non \u00e8 una buona cosa. <\/p>\n<p><\/p>\n<p>L'idea \u00e8 che di solito viaggiamo al 20% delle nostre capacit\u00e0, preferibilmente non oltre il 50%. E cerchiamo di ottimizzare il tempo di risposta per i nostri utenti prima di tutto. Cio\u00e8, dobbiamo muovere le nostre mani in modo che ci sia la minima latenza a una velocit\u00e0 del 20%, in modo ipotetico. Questa \u00e8 un'idea che cerchiamo di utilizzare nei nostri esperimenti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c32c2cfb76dce0ce6b50e929bbf914ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E per concludere le raccomandazioni: <\/p>\n<p><\/p>\n<ul>\n<li>Assicurati di creare un Database Lab.<\/li>\n<li>Se possibile, falla on demand, in modo che si possa avviare per un certo periodo di tempo \u2013 giocare e poi scartare. Se hai cloud, allora \u00e8 ovvio, cio\u00e8 avere molti standing. <\/li>\n<li>Siate curiosi. E se qualcosa non va, verificate con esperimenti come si comporta. Potete usare Nancy per imparare e per controllare come funziona il database.<\/li>\n<li>E puntate a un tempo di risposta minimo. <\/li>\n<li>E non abbiate paura del codice sorgente di Postgres. Quando lavorate con il codice sorgente, dovete conoscere l'inglese. Ci sono molti commenti, tutto \u00e8 spiegato. <\/li>\n<li>E controllate la salute del database regolarmente, almeno una volta ogni tre mesi a mano, oppure usando Postgres-checkup. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8d2ac05f44bd245b879799862ce9e233.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Domande<\/p>\n<p><\/p>\n<p><em>Grazie mille! \u00c8 una cosa molto interessante.<\/em> <\/p>\n<p><\/p>\n<p>Due cose.<\/p>\n<p><\/p>\n<p><em>S\u00ec, due cose. Solo che non ho capito completamente. Quando lavoriamo con Nancy, possiamo modificare solo un parametro o un intero gruppo?<\/em><\/p>\n<p><\/p>\n<p>Abbiamo un parametro di delta-config. Potete modificarne quanti ne volete. Ma bisogna capire che quando cambiate molte cose, potreste trarre conclusioni sbagliate. <\/p>\n<p><\/p>\n<p><em>S\u00ec. Perch\u00e9 ho chiesto? Perch\u00e9 \u00e8 difficile condurre esperimenti quando hai solo un parametro. Lo modifichi, guardi come funziona. Lo imposti. Poi inizi con il successivo.<\/em><\/p>\n<p><\/p>\n<p>Si pu\u00f2 modificare pi\u00f9 di un parametro contemporaneamente, ma dipende dalla situazione, ovviamente. Ma \u00e8 meglio testare una sola idea. Ieri ci \u00e8 venuta un'idea. Avevamo una situazione molto simile. C'erano due configurazioni. E non riuscivamo a capire perch\u00e9 ci fosse una grande differenza. \u00c8 emersa l'idea che fosse necessario utilizzare la dicotomia per capire e trovare in cosa consiste la differenza. Si possono immediatamente rendere uguali met\u00e0 dei parametri, poi un quarto e cos\u00ec via. \u00c8 tutto flessibile.<\/p>\n<p><\/p>\n<p><em>E c'\u00e8 un'altra domanda. Il progetto \u00e8 giovane e si sta sviluppando. La documentazione \u00e8 gi\u00e0 pronta, c'\u00e8 una descrizione dettagliata?<\/em><\/p>\n<p><\/p>\n<p>Ho messo un link per la descrizione dei parametri. C'\u00e8. Ma c'\u00e8 ancora molto che manca. Sto cercando alleati. E li trovo quando parlo. \u00c8 fantastico. Qualcuno gi\u00e0 lavora con me, qualcun altro ha aiutato e ha fatto qualcosa. E se questa tematica vi interessa, date un feedback su cosa manca. <\/p>\n<p><\/p>\n<p><em>Quando avremo il laboratorio, potrebbe esserci un feedback. Vedremo. Grazie!<\/em><\/p>\n<p><\/p>\n<p><em>Salve! Grazie per la presentazione! Ho visto che c'\u00e8 supporto per Amazon. \u00c8 prevista la supporto per GSP?<\/em><\/p>\n<p><\/p>\n<p>Buona domanda. Abbiamo iniziato a lavorare. E al momento abbiamo congelato, perch\u00e9 vogliamo risparmiare. Cio\u00e8, c'\u00e8 supporto tramite run on localhost. Puoi creare un'istanza e lavorare localmente. A proposito, lo facciamo cos\u00ec. In Getlab faccio cos\u00ec, l\u00ec su GSP. Ma fare proprio questo orchestrazione, al momento non vediamo senso, perch\u00e9 Google non ha spot a prezzi bassi. Ci sono ??? istanze, ma hanno delle limitazioni. Prima di tutto, hanno sempre solo uno sconto del 70% e l\u00ec non si pu\u00f2 giocare con il prezzo. Gli spot aumentiamo il prezzo del 5-10%, per ridurre la probabilit\u00e0 di essere eliminati. Cio\u00e8, negli spot risparmi, ma possono portarteli via in qualsiasi momento. Se fai il prezzo un po' pi\u00f9 alto rispetto agli altri, verrai eliminato pi\u00f9 tardi. Google ha una specifica del tutto diversa. E c'\u00e8 un'altra limitazione molto sgradevole: vivono solo per 24 ore. E a volte vogliamo eseguire esperimenti per 5 giorni. Ma negli spot questo \u00e8 possibile, a volte gli spot vivono per mesi. <\/p>\n<p><\/p>\n<p><em>Salve! Grazie per la relazione! Hai menzionato il checkup. Come calcolate gli errori stat_statements?<\/em><\/p>\n<p><\/p>\n<p>Ottima domanda. Posso mostrarti e spiegarti molto in dettaglio. Brevemente, guardiamo come \u00e8 cambiato il gruppo di richieste: quante sono crollate e quante nuove sono apparse. E poi osserviamo due metriche: total_time e calls, e quindi ci sono due errori. E vediamo quale contributo hanno i gruppi modificati. Ci sono due sottogruppi: quello che \u00e8 andato via e quello che \u00e8 tornato. Controlliamo quale sia il loro contributo all'insieme. <\/p>\n<p><\/p>\n<p><em>Ma non hai paura che venga elaborato due o tre volte tra i snapshot?<\/em><\/p>\n<p><\/p>\n<p>Cio\u00e8, si sono registrati di nuovo o come?<\/p>\n<p><\/p>\n<p><em>Ad esempio, questa richiesta \u00e8 gi\u00e0 stata espulsa una volta, poi \u00e8 tornata ed \u00e8 stata nuovamente espulsa, poi ancora \u00e8 tornata ed \u00e8 stata espulsa di nuovo. E qui hai fatto qualche calcolo, e dove sono tutte queste informazioni?<\/em><\/p>\n<p><\/p>\n<p>Buona domanda, dobbiamo controllare. <\/p>\n<p><\/p>\n<p><em>Ho fatto un lavoro simile. Certo, era pi\u00f9 semplice, l'ho fatto da solo. Ma ho dovuto resettare, fare il reset stat_statements e orientarmi al momento dello snapshot, per verificare che ci fosse meno di una certa quota, che in ogni caso non fosse arrivato al limite di quanto possa accumulare stat_statements. E mi oriento sul fatto che, molto probabilmente, non \u00e8 stato espulso nulla.<\/em> <\/p>\n<p><\/p>\n<p>S\u00ec-s\u00ec. <\/p>\n<p><\/p>\n<p><em>Ma come fare diversamente in modo affidabile, non riesco a capire.<\/em><\/p>\n<p><\/p>\n<p>Purtroppo, non ricordo esattamente se utilizziamo il testo della richiesta o l'queryid con pg_stat_statements e ci orientiamo su quello. Se ci orientiamo su queryid, allora, in teoria, confrontiamo cose comparabili. <\/p>\n<p><\/p>\n<p><em>No, pu\u00f2 essere espulso pi\u00f9 volte tra gli snapshot e tornare di nuovo.<\/em><\/p>\n<p><\/p>\n<p>Con lo stesso ID?<\/p>\n<p><\/p>\n<p><em>S\u00ec.<\/em> <\/p>\n<p><\/p>\n<p>Lo studieremo. Bella domanda. Dobbiamo analizzarlo. Ma per ora, quello che vediamo \u00e8 che abbiamo o 0 scritto...<\/p>\n<p><\/p>\n<p><em>\u00c8 ovviamente un caso raro, ma sono rimasto sorpreso quando ho scoperto che stat_statements pu\u00f2 espellere.<\/em> <\/p>\n<p><\/p>\n<p>In Pg_stat_statements pu\u00f2 esserci di tutto. Abbiamo riscontrato che se track_utility \u00e8 attivato, anche i tuoi set vengono tracciati. <\/p>\n<p><\/p>\n<p><em>S\u00ec, certo.<\/em><\/p>\n<p><\/p>\n<p>E se hai Java Hibernate, che \u00e8 casuale, allora inizia a bloccarsi la tabella hash. E non appena disattivi un'applicazione molto pesante, hai 50-100 gruppi. E l\u00ec tutto diventa pi\u00f9 o meno stabile. Uno dei modi per combattere questo \u00e8 aumentare pg_stat_statements.max. <\/p>\n<p><\/p>\n<p><em>S\u00ec, ma bisogna sapere di quanto. E bisogna monitorarlo. Io lo faccio cos\u00ec. Cio\u00e8, ho pg_stat_statements.max e vedo che al momento dello snapshot non ho raggiunto il 70%. Bene, significa che non abbiamo perso nulla. Facciamo il reset. E accumuliamo di nuovo. Se nel prossimo snapshot siamo sotto il 70%, allora probabilmente non abbiamo perso nulla di nuovo.<\/em><\/p>\n<p><\/p>\n<p>S\u00ec. Attualmente, per impostazione predefinita, \u00e8 5.000. E a molti di loro basta questo. <\/p>\n<p><\/p>\n<p><em>Di solito s\u00ec.<\/em> <\/p>\n<p><\/p>\n<p>Video:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"yvO1jjG-tDI\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/yvO1jjG-tDI\/hqdefault.jpg\" alt=\"Guarda il video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>P.S. Aggiungo che se in Postgres ci sono dati riservati e non devono finire in ambiente di test, si pu\u00f2 utilizzare <noindex><a rel=\"nofollow\" href=\"https:\/\/labs.dalibo.com\/postgresql_anonymizer\">PostgreSQL Anonymizer<\/a><\/noindex>. Lo schema \u00e8 approssimativamente il seguente:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cf9a2052364e09a20e68d2347dd0c25b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/498060\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e? \u0418\u043b\u0438 \u0432 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437? \u041a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u044d\u0442\u0430 \u2013 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u2013 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435? \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 postgresql.conf &quot;\u043f\u043e-\u0432\u0437\u0440\u043e\u0441\u043b\u043e\u043c\u0443&quot;. \u041d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u043f\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":78743,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-78742","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e?\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb. \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e?\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-21T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-21T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\"Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati\". Nikolay Samokhvalov | ProHoster","description":"Ti invitiamo a leggere la trascrizione della relazione di Nikolay Samokhvalov \"Approccio industriale al tuning di PostgreSQL: esperimenti sulle basi di dati\" Shared_buffers = 25% \u2013 \u00e8 tanto o poco?","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb. \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e?","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-21T17:42:46+00:00","article:modified_time":"2020-04-21T17:42:46+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"78742","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:51:38","updated":"2022-09-28 02:51:26","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/78742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=78742"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/78742\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/78743"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=78742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=78742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=78742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}