{"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":"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti su database\u00bb. Nikolai Samokhvalov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Ti invitiamo a scoprire 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 tanto o poco? O \u00e8 proprio il giusto? Come capire se questa raccomandazione \u2013 piuttosto obsoleta \u2013 si adatta al vostro caso specifico?<\/p>\n<p><\/p>\n<p>\u00c8 ora di affrontare la questione della selezione dei parametri postgresql.conf \"in modo professionale\". Non attraverso \"autotuner\" ciechi o consigli obsoleti di articoli e blog, ma basandosi su:<\/p>\n<p><\/p>\n<ol>\n<li>esperimenti rigorosamente calibrati sui database, condotti in modo automatizzato, in grande quantit\u00e0 e in condizioni il pi\u00f9 simili possibile a quelle \"operative\",<\/li>\n<li>una profonda comprensione 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 specifico \u2013 i famosi shared_buffers \u2013 in diverse situazioni, in diversi progetti e cercheremo di capire come ottimizzare la configurazione per la nostra infrastruttura, DB e carico di lavoro.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 oltre 14 anni di esperienza con Postgres. Ho fondato diverse aziende nel campo dei social network. In tutte queste ho utilizzato e utilizzo ancora Postgres.<\/p>\n<p><\/p>\n<p>Inoltre, il gruppo RuPostgres su Meetup \u00e8 al secondo posto nel mondo. Stiamo avvicinandoci lentamente a 2000 membri. RuPostgres.org.<\/p>\n<p><\/p>\n<p>E in numerose conferenze, tra cui Highload, sono responsabile dei database, in particolare di Postgres, fin dalla sua fondazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/fa009b50f1c0293eee80fc03fd2c05f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Negli ultimi anni ho ripreso la mia pratica di consulenza su Postgres in 11 fusi orari da qui.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 alcuni anni fa, avevo avuto una pausa dal lavoro attivo con Postgres, probabilmente dal 2010. Sono rimasto sorpreso da quanto poco siano cambiati i compiti quotidiani di un DBA e da quanto lavoro manuale rimanga ancora da fare. Ho subito pensato che ci fosse qualcosa che non andava, e che fosse necessario automatizzare di pi\u00f9.<\/p>\n<p><\/p>\n<p>E poich\u00e9 tutto ci\u00f2 avveniva a distanza, la maggior parte dei clienti si trovava nel cloud. E gi\u00e0 molte cose erano chiaramente automatizzate. Di questo parler\u00f2 pi\u00f9 avanti. In altre parole, tutto ci\u00f2 ha portato all'idea che dovessero esserci una serie di strumenti, cio\u00e8 una piattaforma in grado di automatizzare praticamente tutte le operazioni di un DBA, in modo da poter gestire un gran numero di database.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b02097f0bb23fa9d7c30e38ab9f3de7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questo rapporto non ci saranno:<\/p>\n<p><\/p>\n<ul>\n<li>\u00abPallottole d'argento\u00bb e affermazioni del tipo \u2013 metti 8 GB o 25 % shared_buffers e andr\u00e0 tutto bene. Di shared_buffers parleremo poco. <\/li>\n<li>Componenti \u00abhardcore\u00bb. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ccea359ec78a967c150ddcedc3e50a88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E cosa ci sar\u00e0?<\/p>\n<p><\/p>\n<ul>\n<li>Ci saranno principi di ottimizzazione che applichiamo e sviluppiamo. Ci saranno varie idee che si presentano lungo il nostro cammino e diversi strumenti che creiamo principalmente in Open Source, cio\u00e8 costruiamo la base in Open Source. Inoltre, gestiamo ticket e praticamente tutta la comunicazione in Open Source. Potete vedere cosa stiamo facendo ora, cosa ci sar\u00e0 nel prossimo rilascio, ecc. <\/li>\n<li>Ci sar\u00e0 anche una certa esperienza nell'uso di questi principi e strumenti in diverse aziende: da piccoli startup a grandi compagnie. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c1422d9f2945e717c6ebb31f5fef6329.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Innanzitutto, l'obiettivo principale di un DBA, oltre a garantire la creazione di istanze, il deployment di backup, ecc., \u00e8 identificare i colli di bottiglia e ottimizzare le prestazioni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8e682ca8666e94d6688348ebe4540327.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Attualmente \u00e8 cos\u00ec che funziona. Guardiamo il monitoraggio, vediamo qualcosa, ma mancano alcuni dettagli. Iniziamo a scavare pi\u00f9 a fondo, di solito manualmente, e comprendiamo come affrontare la situazione in un modo o nell'altro.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 predefinita per identificare le query lente. Analizzando i log di Postgres con pgBadger.<\/p>\n<p><\/p>\n<p>Entrambi gli approcci presentano seri svantaggi. Nel primo approccio, perdiamo tutti i parametri. Se vediamo gruppi SELECT * FROM table where la colonna \u00e8 uguale al segno \u00ab?\u00bb o \u00ab$\u00bb a partire dalla versione 10 di Postgres, non sappiamo se si tratta di un index scan o un seq scan. Dipende molto dal parametro. Se inserisci un valore raro, si avr\u00e0 un index scan. Se inserisci un valore che occupa il 90% della tabella, sar\u00e0 chiaramente un seq scan, perch\u00e9 Postgres conosce le statistiche. Questo \u00e8 un grande svantaggio di pg_stat_statements, anche se sono in corso dei miglioramenti.<\/p>\n<p><\/p>\n<p>L'aspetto principale dei log analizzati \u00e8 che non puoi permetterti di impostare \u00ablog_min_duration_statement = 0\u00bb, in genere. Di questo parleremo anche. Pertanto, non hai una visione completa. Una query molto veloce pu\u00f2 consumare una grande quantit\u00e0 di risorse, ma non la vedrai, perch\u00e9 \u00e8 al di sotto della tua soglia.<\/p>\n<p><\/p>\n<p><strong>Come risolvono i DBA i problemi riscontrati?<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 un'istanza di dimensioni diverse. Se sei un DBA, hai un ambiente di staging. E questo ambiente pu\u00f2 essere solo uno. Pu\u00f2 essere fermo da sei mesi. E pensi di passare alla produzione. Anche i DBA pi\u00f9 esperti controllano successivamente in produzione, su una replica. A volte creano un indice temporaneo, verificano che funzioni, lo eliminano e lo restituiscono agli sviluppatori affinch\u00e9 lo inseriscano nei file di migrazione. Questo \u00e8 il tipo di follia che accade ora. Ed \u00e8 un problema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 modo pi\u00f9 complesso).<\/li>\n<li>Aggiungere risorse (il metodo pi\u00f9 semplice nella maggior parte dei casi).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 molti parametri in Postgres. Bisogna sapere molte cose. Ci sono molti indici in Postgres, grazie anche agli organizzatori di questa conferenza. \u00c8 importante conoscere tutto questo e proprio per questo i DBA non specializzati possono avere l'impressione che i DBA praticano una sorta di magia nera. Ci vogliono circa 10 anni di esperienza per iniziare a comprendere tutto in modo adeguato.<\/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 solo intuizione in tutto ci\u00f2.<\/p>\n<p><\/p>\n<p><strong>Esempi dalla vita<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/70b11c3df9c41c66570635d5f309ed24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo l'ho osservato in almeno due progetti, incluso il mio. Un altro post sul blog ci dice che un valore di 1.000 per default_statistict_target \u00e8 positivo. Va bene, proviamo in produzione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0b4c2bd6f73df06967c94d5d78b07279.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E qui noi, utilizzando il nostro strumento due anni dopo grazie agli esperimenti sulle basi di dati di cui parliamo oggi, possiamo confrontare ci\u00f2 che era e ci\u00f2 che \u00e8 diventato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 consiste di quattro parti. <\/p>\n<p><\/p>\n<ul>\n<li>La prima \u00e8 l'ambiente. Abbiamo bisogno dell'hardware. E quando arrivo in un'azienda e firmo un contratto, chiedo di avere una macchina uguale a quella in produzione. Ho bisogno di almeno un hardware uguale per ciascuno dei vostri Master. Pu\u00f2 essere una macchina virtuale in Amazon o Google, oppure mi serve proprio quella macchina. 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 vari modi. Vi mostrer\u00f2 come. <\/li>\n<li>La terza parte riguarda il carico. Questo \u00e8 il momento pi\u00f9 complesso. <\/li>\n<li>E la quarta parte riguarda ci\u00f2 che verifichiamo, cio\u00e8 con cosa confronteremo. Possiamo ad esempio modificare uno o pi\u00f9 parametri nella configurazione, o possiamo creare un indice, e cos\u00ec via. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8ccd09ac4cdd336618413375617c10a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Avviamo l'esperimento. Ecco pg_stat_statements. A sinistra c'\u00e8 quello che era, a destra c'\u00e8 quello che \u00e8 diventato.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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. Vedo che ci ha aiutato. In generale, tutto \u00e8 migliorato del 8%.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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, vedremo i gruppi di query da pgBadger o da pg_stat_statements. Qui ci sono due opzioni. Vediamo che una certa query \u00e8 diminuita dell'88%. E qui entra in gioco l'approccio ingegneristico. Possiamo scavare ulteriormente per capire perch\u00e9 \u00e8 diminuita. Dobbiamo comprendere cosa \u00e8 successo con le statistiche. Perch\u00e9 un maggior numero di bucket nelle statistiche porta a risultati peggiori.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 e fare \"ALTER TABLE \u2026 ALTER COLUMN\" riportando 100 bucket di nuovo nelle statistiche di questa colonna. E con un ulteriore esperimento possiamo confermare che questa soluzione ha funzionato. Questo \u00e8 l'approccio ingegneristico che ci aiuta a vedere il quadro complessivo e a prendere decisioni basate sui dati, non sull'intuizione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 da molti anni. E nessun progetto sensato vivrebbe senza test automatizzati.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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'automobilismo, quando testiamo l'aerodinamica, abbiamo anche la possibilit\u00e0 di eseguire esperimenti. Non lanceremo qualcosa nello spazio direttamente dai disegni n\u00e9 metteremo subito un'auto in strada. Ad esempio, abbiamo una galleria del vento. <\/p>\n<p><\/p>\n<p>Dall'osservazione di altri settori possiamo trarre delle conclusioni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cef02ea9280e5795d1e593c600f0541b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Innanzitutto, disponiamo di un ambiente speciale. \u00c8 simile alla produzione, ma non proprio. La sua principale caratteristica \u00e8 che deve essere economico, ripetibile e massimamente automatizzato. Inoltre, devono esserci strumenti speciali per eseguire analisi dettagliate.<\/p>\n<p><\/p>\n<p>Probabilmente, quando lanciamo l'aereo e voliamo, abbiamo meno opportunit\u00e0 di esaminare ogni millimetro della superficie dell'ala rispetto a quanto potremmo fare in una galleria del vento. Abbiamo pi\u00f9 strumenti per la diagnostica. Possiamo permetterci di aggiungere pi\u00f9 pesante, cosa che non possiamo fare con un aereo in volo. Lo stesso vale per Postgres. In alcuni casi, possiamo abilitare il logging completo delle query durante gli esperimenti. E non vogliamo farlo in producci\u00f3n. Potremmo anche includerlo nei piani tramite auto_explain.<\/p>\n<p><\/p>\n<p>E come ho gi\u00e0 detto, un alto livello di automazione significa che premiamo un pulsante e ripetiamo. Deve essere cos\u00ec, per poter fare molti esperimenti, per farlo diventare un flusso.<\/p>\n<p><\/p>\n<p>Nancy CLI \u2013 la base del \"laboratorio DB\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/f8303df21f309fb209929acec260b757.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco, abbiamo creato qualcosa del genere. Cio\u00e8, ho parlato di queste idee a giugno, quasi un anno fa. E abbiamo gi\u00e0 nel Open Source quella che chiamiamo Nancy CLI. \u00c8 la base per costruire un laboratorio di database.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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> \u2014 \u00c8 in Open Source, su Gitlab. Potete dirlo, potete provarlo. Ho fornito un link nelle diapositive. Potete cliccare e troverete <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 questo \u00e8 gi\u00e0 ci\u00f2 che applichiamo praticamente ogni giorno. E quando ci viene un'idea \u2013 per esempio, se eliminiamo 40 000 000 righe e tutto si blocca in IO, possiamo fare un esperimento e osservare meglio per capire cosa sta succedendo e poi cercare di risolverlo al volo. Cio\u00e8, facciamo un esperimento. Ad esempio, cambiamo qualcosa e vediamo cosa succede. E non lo facciamo in produzione. Questa \u00e8 l'essenza dell'idea.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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, via. E basta. Pu\u00f2 essere eseguito su qualche istanza su hardware, oppure in una macchina virtuale, ovunque.<\/p>\n<p><\/p>\n<p>C'\u00e8 anche la possibilit\u00e0 di avviare remote su Amazon EC2 Instance, negli spot. Questa \u00e8 un'opzione molto interessante. Ad esempio, ieri abbiamo condotto pi\u00f9 di 500 esperimenti su un'istanza i3, partendo dalla pi\u00f9 piccola fino ad arrivare all'i3-16-xlarge. E 500 esperimenti ci sono costati 64 dollari. Ognuno durava 15 minuti. Grazie all'uso degli spot, \u00e8 molto economico \u2013 uno sconto del 70%, con la tariffazione al secondo di Amazon. Puoi fare davvero molto. Puoi condurre una ricerca reale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/64c61cc9dd7181296b2ef5b815a17493.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sono supportate tre versioni principali di Postgres. Non \u00e8 cos\u00ec difficile adattare alcune versioni vecchie e la nuova versione 12 anch'essa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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\/file sql. <\/li>\n<li>Il metodo principale \u00e8 clonare la directory PGDATA. Di solito viene prelevato dal server di backup. Se hai backup binari normali, puoi creare cloni da l\u00ec. Se hai servizi cloud, la societ\u00e0 del cloud, come Amazon e Google, lo far\u00e0 per te. Questo \u00e8 il modo principale per i cloni di un vero ambiente di produzione. Procediamo in questo modo per il deployment. <\/li>\n<li>L'ultimo metodo \u00e8 utile per le ricerche, quando si desidera capire come funziona qualcosa in Postgres. Questo \u00e8 pgbench. Puoi generare utilizzando pgbench. \u00c8 semplicemente un'opzione \u00abdb-pgbench\u00bb. Gli dici quale scala utilizzare. E tutto verr\u00e0 generato nel cloud, come indicato.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 possiamo emularlo in primo luogo nel seguente modo. Dobbiamo raccogliere tutti i log. Ed \u00e8 un processo doloroso. Ti mostrer\u00f2 perch\u00e9. E utilizziamo pgreplay, che \u00e8 integrato in Nancy. <\/li>\n<li>Un'altra opzione \u00e8 il cosiddetto carico artigianale, per il quale mettiamo in campo un certo impegno. Analizzando il carico attuale sul sistema di produzione, estraiamo i gruppi di query pi\u00f9 importanti. E con pgbench possiamo emulare questo carico in laboratorio. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 qualche SQL, cio\u00e8 controlliamo una migrazione, creiamo un indice, eseguiamo ANALYZE. E vediamo cosa c'era prima e dopo il vacuum. In generale, qualsiasi SQL.<\/li>\n<li>Possiamo modificare uno o pi\u00f9 parametri nella configurazione. Possiamo chiedere di controllare, ad esempio, 100 valori su Amazon per il nostro database da un terabyte. E dopo alcune ore avrete il risultato. In genere, il database da un terabyte richiede alcune ore per essere distribuito. Ma nella fase di sviluppo c'\u00e8 una patch, quindi abbiamo la possibilit\u00e0 di eseguire una serie di test, cio\u00e8 potete usare lo stesso pgdata sullo stesso server e continuare a verificare. Postgres verr\u00e0 riavviato e le cache verranno azzerate. E potete eseguire il carico. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 qui le cose interessanti sono 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 sui checkpoint e su come i backend gestiscono i buffer sporchi. \u00c8 interessante da vedere. Ad esempio, quando configurate shared_buffers, \u00e8 molto interessante osservare quanto \u00e8 stato rimosso.<\/li>\n<li>Arrivano anche i log di Postgres. Due log: il log di preparazione e il log di riproduzione del carico. <\/li>\n<li>Una funzionalit\u00e0 relativamente nuova sono i FlameGraphs.<\/li>\n<li>Inoltre, se hai utilizzato pgreplay o pgbench per simulare il carico, avranno una restituzione nativa. Potrai vedere la latenza e il TPS. Sar\u00e0 possibile capire come si sono comportati. <\/li>\n<li>Informazioni sul sistema. <\/li>\n<li>Controlli di base per CPU e IO. Questo \u00e8 particolarmente utile per un'istanza EC2 su Amazon, quando vuoi avviare 100 istanze identiche in parallelo e testarne 100 diverse, avrai quindi 10.000 esperimenti. Devi assicurarti di non ottenere un'istanza difettosa, gi\u00e0 sovraccaricata da qualcun altro. Su questa macchina potrebbero esserci altre attivit\u00e0 e ti rimarrebbero poche risorse. Risultati come questi \u00e8 meglio escluderli. Proprio con l'aiuto di sysbench di Alexey Kopytov facciamo alcuni brevi controlli, che permetteranno di confrontare con altri, quindi capirai come si comporta la CPU e come si comporta l'IO. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 considerando diversi esempi aziendali?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/959690b464a01a4a3cb67ec497becff1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Supponiamo di voler riprodurre un carico reale utilizzando i log. \u00c8 un'ottima idea, se \u00e8 scritto in Open Source, utilizziamo pgreplay. Ma per farlo funzionare correttamente, devi abilitare la registrazione completa delle query con parametri e tempistiche.<\/p>\n<p><\/p>\n<p>Ci sono alcune difficolt\u00e0 riguardo a duration e timestamp. Possiamo tralasciare tutto questo. La domanda principale \u00e8: potete permettervi di fare questo o no? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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. Prima di tutto, dovete capire quale flusso verr\u00e0 scritto nel log. Se avete pg_stat_statements, potete utilizzare questa query (il collegamento sar\u00e0 disponibile nelle diapositive) per capire quanti byte verranno scritti al secondo.<\/p>\n<p><\/p>\n<p>Guardiamo la lunghezza della query. Ci\u00f2 che trascuriamo \u00e8 il fatto che non ci sono parametri, ma conosciamo la lunghezza della query e sappiamo quante volte al secondo viene eseguita. In questo modo possiamo stimare quanti byte vengono scritti al secondo. Potremmo sbagliare di due volte, ma la direzione la capiremo sicuramente 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 sar\u00e0 di circa 300 kB\/s. E, di norma, possiamo permetterci un tale flusso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 logging. E per impostazione predefinita, di solito, le persone usano 'syslog'.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/66054682083ba2ada174afb5e7ee3973.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se avete syslog, potreste avere un'immagine del genere. Prenderemo pgbench, attiveremo il logging delle query e vedremo cosa succede.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a05723dcf10a7733f054ba108bb0f107.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Senza logging \u2013 questo \u00e8 il grafico a sinistra. Abbiamo ottenuto 161.000 TPS. Con syslog \u2013 su Ubuntu 16.04 su Amazon otteniamo 37.000 TPS. Se cambiamo a due altri metodi di logging, la situazione migliora notevolmente. Cio\u00e8, ci aspettavamo una riduzione, ma non cos\u00ec drastica.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 facile, la situazione \u00e8 davvero pessima, con una riduzione di 44 volte nei TPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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. Spesso nelle aziende, specialmente quelle grandi, \u00e8 molto difficile cambiarlo. Se potete abbandonare syslog, vi preghiamo di farlo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a167a6fac7f28c7541515f7eff30bdb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Valutate gli IOPS e il throughput di scrittura. <\/li>\n<li>Controllate il vostro sistema di logging. <\/li>\n<li>Se il carico previsto \u00e8 eccessivo, prendere in considerazione il campionamento. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 essere presente. Possiamo prendere e descrivere ogni gruppo di query in un file specifico. E poi possiamo utilizzare una funzione molto comoda in pgbench \u2013 la possibilit\u00e0 di fornire diversi file utilizzando l'opzione \"-f.\"<\/p>\n<p><\/p>\n<p>Lui comprende molti \"-f\". E possiamo specificare con \"@\" alla fine quale percentuale ogni file dovrebbe avere. Possiamo dire, ad esempio, che questo deve essere eseguito nel 10% dei casi e quest'altro nel 20%. Questo ci avviciner\u00e0 a ci\u00f2 che vediamo in produzione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b91d18a9861abdc36bfda54cd72a142f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E come possiamo capire cosa abbiamo in produzione? Qual \u00e8 la percentuale e cosa significa? 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 un database Open Source. E attualmente lo stiamo sviluppando attivamente.<\/p>\n<p><\/p>\n<p>\u00c8 nato per motivi un po' diversi. Per la mancanza di monitoraggio. Cio\u00e8, arrivate, guardate il database, osservate i problemi che ci sono. E, di norma, fate un health_check. Se siete un DBA esperto, farete un health_check. Controllate l'uso degli indici, ecc. Se avete OKmeter, \u00e8 fantastico. \u00c8 un ottimo monitoraggio per Postgres. OKmeter.io \u2013 per favore, installatelo, \u00e8 tutto realizzato molto bene. \u00c8 a pagamento.<\/p>\n<p><\/p>\n<p>Se non lo avete, di norma, avrete poco. In monitoraggio di solito ci sono CPU, IO e con delle riserve, e basta. E noi abbiamo bisogno di di pi\u00f9. Abbiamo bisogno di vedere come funziona l'autovacuum, come funziona il checkpoint, nell'IO dobbiamo separare il checkpoint dal bgwriter e dai backend, ecc.<\/p>\n<p><\/p>\n<p>Il problema \u00e8 che quando aiuti un'azienda di grandi dimensioni, non possono implementare rapidamente qualcosa. Non possono acquistare rapidamente OKmeter. Potrebbero farlo tra sei mesi. Non possono installare rapidamente alcuni pacchetti. <\/p>\n<p><\/p>\n<p>E ci \u00e8 venuta l'idea di creare uno strumento speciale che non richiede alcuna installazione, cio\u00e8 non devi installare nulla nel tuo ambiente di produzione. Lo installi sul tuo laptop o su un server di osservazione da cui lo esegui. Analizzer\u00e0 molte cose: il sistema operativo, il file system e PostgreSQL stesso, facendo alcune query leggere che puoi eseguire direttamente in produzione senza problemi.<\/p>\n<p><\/p>\n<p>Lo abbiamo chiamato Postgres-checkup. In termini medici, \u00e8 un controllo regolare della salute. Se parliamo di automobili, \u00e8 come il tagliando. Effettui il tagliando della tua auto ogni sei mesi o un anno, a seconda della marca. E tu fai il tagliando per il tuo database? Cio\u00e8, fai ricerche approfondite regolarmente? \u00c8 qualcosa che va fatto. Se esegui backup, fai anche il checkup, \u00e8 altrettanto importante.<\/p>\n<p><\/p>\n<p>E abbiamo uno strumento di questo tipo. Ha iniziato a svilupparsi attivamente solo circa tre mesi fa. \u00c8 ancora giovane, ma ha gi\u00e0 molte funzionalit\u00e0.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 rapporto K003 in Postgres-checkup<\/p>\n<p><\/p>\n<p>E ci sono gruppi di rapporti K. Attualmente ci sono tre rapporti. E c'\u00e8 questo rapporto K003. Qui troviamo l'apice 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 maggiormente il nostro sistema, cio\u00e8 consuma una quantit\u00e0 maggiore di risorse. Perch\u00e9 li chiamo gruppi di query? Perch\u00e9 abbiamo escluso i parametri. Non sono pi\u00f9 query, ma gruppi di query, sono astratti.<\/p>\n<p><\/p>\n<p>E se ottimizziamo dall'alto verso il basso, possiamo alleggerire le nostre risorse e rimandare il momento in cui dovremo fare un upgrade. \u00c8 un ottimo modo per risparmiare denaro.<\/p>\n<p><\/p>\n<p>Forse non \u00e8 il modo migliore per prendersi cura degli utenti, perch\u00e9 potremmo non vedere casi rari ma molto frustranti, quando una persona ha atteso 15 secondi. In totale sono cos\u00ec rari che non li notiamo, ma stiamo gestendo le risorse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 fatto due istantanee. Postgres_checkup ti fornir\u00e0 la delta per ogni metrica: per total-time, calls, rows, shared_blks_read, ecc. Tutto, abbiamo calcolato la delta. Un grande problema con pg_stat_statements \u00e8 che non ricorda quando \u00e8 stato effettuato il reset. Se pg_stat_database ricorda, pg_stat_statements non lo fa. Vedi quel numero di 1.000.000, ma da dove lo abbiamo ottenuto, non lo sappiamo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c370bf1237675e03c0a3d362c025ac24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui invece lo sappiamo, abbiamo due istantanee. Sappiamo che la delta in questo caso era di 56 secondi. Un intervallo molto breve. Abbiamo ordinato per total_time. E poi possiamo differenziare, cio\u00e8 dividiamo tutte le metriche per la durata. Se dividiamo ogni metrica per la durata, avremo il numero di chiamate al secondo.<\/p>\n<p><\/p>\n<p>Poi, total_time per secondo \u00e8 la mia metrica preferita. Si misura in secondi, cio\u00e8 quanti secondi la nostra sistema ha impiegato per eseguire questo gruppo di query al secondo. Se vedi pi\u00f9 di un secondo al secondo, significa che hai bisogno di pi\u00f9 di un core. \u00c8 una metrica molto utile. Puoi capire, per esempio, che a quel tizio servono almeno tre core.<\/p>\n<p><\/p>\n<p>Questo \u00e8 il nostro fiore all'occhiello, non ho mai visto nulla di simile. Notate - \u00e8 qualcosa di molto semplice - secondo dopo secondo. A volte, quando la CPU \u00e8 al 100%, il tempo di risposta \u00e8 di mezz'ora per secondo, ossia spendi mezz'ora solo per questa richiesta. <\/p>\n<p><\/p>\n<p>Poi vediamo le righe al secondo. Sappiamo quante righe sono state restituite al secondo.<\/p>\n<p><\/p>\n<p>E c'\u00e8 anche un'altra cosa interessante. Quante volte abbiamo letto shared_buffers al secondo dal shared_buffers stesso. I colpi erano gi\u00e0 l\u00ec, e le righe le abbiamo prese dalla cache del sistema operativo o dal disco. La prima opzione \u00e8 veloce, la seconda pu\u00f2 essere veloce, ma dipende dalla situazione. <\/p>\n<p><\/p>\n<p>Il secondo modo di differenziare \u00e8 dividere il numero di richieste in questo gruppo. Nella seconda colonna avrete sempre una richiesta divisa per richiesta. E poi \u00e8 interessante sapere quanti millisecondi ci sono stati in questa richiesta. Sappiamo come si comporta mediamente questa richiesta. Ci abbiamo messo 101 millisecondi per ogni richiesta. Questa \u00e8 una metrica tradizionale di cui abbiamo bisogno per comprendere.<\/p>\n<p><\/p>\n<p>Quante righe ha restituito mediamente ogni richiesta. Vediamo che il gruppo restituiva 8. Quante in media sono state ottenute e lette dalla cache. Notiamo che tutto \u00e8 stato memorizzato in modo efficiente. Solo hit per il primo gruppo. <\/p>\n<p><\/p>\n<p>E la quarta sottoriga in ogni riga rappresenta la percentuale rispetto al numero totale. Abbiamo delle chiamate. Supponiamo di avere 1.000.000. Possiamo capire quale contributo d\u00e0 questo gruppo. Vediamo che, in questo caso, il primo gruppo contribuisce con meno dello 0,01%. Cio\u00e8, \u00e8 cos\u00ec lento che non appare nel quadro generale. Il secondo gruppo, invece, rappresenta il 5% delle chiamate. Cio\u00e8, il 5% di tutte le chiamate proviene dal secondo gruppo. <\/p>\n<p><\/p>\n<p>Anche per il total_time \u00e8 interessante. Sui primi gruppi di richieste abbiamo speso il 14% del tempo totale di esecuzione. Sul secondo gruppo abbiamo speso l'11%, e cos\u00ec via. <\/p>\n<p><\/p>\n<p>Non entrer\u00f2 nei dettagli, ma ci sono delle sottigliezze. Riportiamo un errore in alto, perch\u00e9 quando confrontiamo, gli snapshot possono variare, cio\u00e8 alcune richieste possono mancare e non essere presenti nel secondo, mentre altre possono apparire nuove. E l\u00ec calcoliamo l'errore. Se vedi 0, \u00e8 un segnale positivo. Significa che non ci sono errori. Se il tasso di errore \u00e8 fino al 20%, va bene. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/327bbf167bc21d37a3e1597b52528e6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora torniamo al nostro argomento. Dobbiamo catalogare il workload. Procediamo dall'alto verso il basso, finch\u00e9 non raggiungiamo l'80% o il 90%. Di solito si tratta di 10-20 gruppi. Creiamo i file per pgbench, utilizzando valori casuali. A volte, purtroppo, non \u00e8 possibile. Con Postgres 12 avremo pi\u00f9 possibilit\u00e0 di applicare questo approccio. <\/p>\n<p><\/p>\n<p>E in questo modo accumuliamo l'80-90% del total_time. Cosa dobbiamo inserire dopo il \u00ab@\u00bb? Guardiamo le chiamate, osserviamo quanti percentuali e comprendiamo quanto dovremmo avere qui. 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=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 sotto-stringhe. Questa \u00e8 la caratteristica del nostro carico complessivo. Osservate la seconda colonna e la seconda sotto-stringa. Vediamo che \u00e8 circa 1,5 secondi al secondo, quindi se abbiamo due core, andr\u00e0 bene. Sar\u00e0 circa il 75% di utilizzo. E cos\u00ec funzioner\u00e0. Se abbiamo 10 core, saremo completamente a posto. Cos\u00ec possiamo valutare le risorse.<\/p>\n<p><\/p>\n<p>K002 \u00e8 ci\u00f2 che chiamo classi di query, ossia SELECT, INSERT, UPDATE, DELETE. E separatamente SELECT FOR UPDATE, perch\u00e9 blocca. <\/p>\n<p><\/p>\n<p>E qui possiamo concludere che le query SELECT normali rappresentano l'82% di tutte le chiamate, ma il 74% del total_time. Cio\u00e8, vengono chiamate molte volte, ma consumano meno risorse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 configurare correttamente shared_buffers?\u00bb. Osservo che la maggior parte dei benchmark si basa sull'idea di verificare qual \u00e8 il throughput, ossia quale sar\u00e0 la capacit\u00e0 di elaborazione. Questa viene solitamente misurata in TPS o QPS.<\/p>\n<p><\/p>\n<p>E cerchiamo di ottenere il massimo dalla macchina con i parametri di tuning per raggiungere il maggior numero possibile di transazioni al secondo. Qui abbiamo 311 selezioni al secondo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d5e73f2672d94bb92eed921ef3dfe0b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma nessuno guida verso il lavoro e torna a casa a piena velocit\u00e0. \u00c8 sciocco. Lo stesso vale per i database. Non dobbiamo viaggiare a piena velocit\u00e0, e nessuno lo fa. Nessuno vive in un ambiente di produzione con il 100% della CPU. Anche se, forse, qualcuno lo fa, ma non \u00e8 una buona cosa. <\/p>\n<p><\/p>\n<p>L'idea \u00e8 che normalmente operiamo al 20% delle nostre capacit\u00e0, idealmente non oltre il 50%. Ci sforziamo di ottimizzare i tempi di risposta per i nostri utenti prima di tutto. Dobbiamo gestire le nostre operazioni in modo da garantire la minima latenza a una velocit\u00e0 del 20%, per cos\u00ec dire. Questa \u00e8 un'idea che cerchiamo di sfruttare anche nei nostri esperimenti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c32c2cfb76dce0ce6b50e929bbf914ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E in conclusione, i consigli: <\/p>\n<p><\/p>\n<ul>\n<li>Assicurati di creare un Database Lab.<\/li>\n<li>Se possibile, rendilo on demand, in modo che possa essere attivato temporaneamente \u2013 gioca e poi elimina. Se hai risorse cloud, questo \u00e8 implicito, cio\u00e8 assicurati di avere molte risorse disponibili. <\/li>\n<li>Sii curioso. E se qualcosa non funziona, verifica con esperimenti come si comporta. Puoi usare Nancy per formarti e vedere come funziona il database.<\/li>\n<li>Punta a tempi di risposta minimi. <\/li>\n<li>E non temere il codice sorgente di Postgres. Quando lavori con il codice sorgente, devi conoscere l'inglese. Ci sono molti commenti, tutto \u00e8 spiegato. <\/li>\n<li>E controlla regolarmente la salute del database, almeno una volta ogni tre mesi, manualmente o usando Postgres-checkup. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 stata un'idea molto interessante.<\/em> <\/p>\n<p><\/p>\n<p>Due elementi.<\/p>\n<p><\/p>\n<p><em>S\u00ec, due pezzi. Solo che non ho capito bene. Quando lavoriamo con Nancy, possiamo regolare solo un parametro o un intero gruppo?<\/em><\/p>\n<p><\/p>\n<p>Abbiamo il parametro di configurazione delta. Puoi modificarne quanti ne vuoi subito. Ma bisogna capire che quando cambi molte cose, potresti fare 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, vedi come funziona. Lo imposti. Poi cominci con il successivo.<\/em><\/p>\n<p><\/p>\n<p>Puoi regolare pi\u00f9 cose contemporaneamente, ma dipende dalla situazione, ovviamente. Ma \u00e8 meglio testare un'idea alla volta. 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. E ci \u00e8 venuta l'idea che bisogna usare la diacronia per capire e trovare in cosa consistesse la differenza. Puoi subito rendere met\u00e0 dei parametri uguali, poi un quarto, e cos\u00ec via. Tutto \u00e8 flessibile.<\/p>\n<p><\/p>\n<p><em>E c'\u00e8 un'altra domanda. Il progetto \u00e8 giovane e in fase di sviluppo. La documentazione \u00e8 gi\u00e0 pronta, c'\u00e8 una descrizione dettagliata?<\/em><\/p>\n<p><\/p>\n<p>Ho creato un link specifico per la descrizione delle caratteristiche. \u00c8 disponibile. Ma ci sono ancora molte cose mancanti. Sto cercando persone che condividano le mie idee. E le trovo quando parlo. \u00c8 davvero fantastico. Qualcuno gi\u00e0 lavora con me, qualcun altro ha aiutato e ha fatto qualcosa. E se questo argomento ti interessa, fammi sapere \u2013 cosa manca. <\/p>\n<p><\/p>\n<p><em>Quando avremo pronto il laboratorio, potrebbe esserci un feedback. Vedremo. Grazie!<\/em><\/p>\n<p><\/p>\n<p><em>Buongiorno! Grazie per l'intervento! Ho notato che c'\u00e8 supporto per Amazon. \u00c8 prevista anche la supporto per GSP?<\/em><\/p>\n<p><\/p>\n<p>Ottima domanda. Abbiamo iniziato e al momento abbiamo sospeso il progetto perch\u00e9 vogliamo risparmiare. C'\u00e8 supporto per l'esecuzione in localhost. Puoi creare un'istanza da solo e lavorare localmente. A proposito, cos\u00ec facciamo noi. In Getlab faccio cos\u00ec, l\u00ec su GSP. Ma non vediamo al momento il senso di fare un orchestrazione di questo tipo, perch\u00e9 non ci sono spazi economici da parte di Google. Ci sono istanze ???, ma hanno delle restrizioni. Primo, hanno sempre solo uno sconto del 70% e non puoi modificare il prezzo. Negli spazi aumentiamo il prezzo del 5-10% per ridurre la probabilit\u00e0 che ti elimina. In altre parole, risparmi con gli spazi, ma possono essere ritirati in qualsiasi momento. Se imposti un prezzo leggermente superiore a quello degli altri, verrai eliminato pi\u00f9 tardi. Google ha una specifica completamente diversa. E c'\u00e8 anche una restrizione molto negativa: vivono solo per 24 ore. A volte vogliamo condurre esperimenti per 5 giorni. Ma questo \u00e8 possibile negli spazi, a volte gli spazi vivono per mesi. <\/p>\n<p><\/p>\n<p><em>Salve! Grazie per la presentazione! Hai menzionato il checkup. Come calcoli gli errori stat_statements?<\/em><\/p>\n<p><\/p>\n<p>Ottima domanda. Posso spiegare e raccontare in dettaglio. In breve, osserviamo come \u00e8 cambiato il set di gruppi di query: quanti sono scomparsi e quanti sono nuovi. E poi esaminiamo due metriche: total_time e calls, quindi ci sono due errori. E vediamo quale contributo hanno i gruppi che sono cambiati. Ci sono due sottogruppi: quelli che se ne sono andati e quelli che sono arrivati. Analizziamo il loro contributo all'immagine complessiva. <\/p>\n<p><\/p>\n<p><em>Non temete che possa girare due o tre volte durante il tempo 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 query \u00e8 gi\u00e0 stata espulsa una volta, poi \u00e8 tornata ed \u00e8 stata espulsa di nuovo, poi \u00e8 tornata ancora ed \u00e8 stata espulsa. E qui hai fatto qualche calcolo e dov'\u00e8 tutto questo?<\/em><\/p>\n<p><\/p>\n<p>Bella domanda, bisogna esaminare. <\/p>\n<p><\/p>\n<p><em>Ho fatto qualcosa di simile. Certo, l'ho fatto in modo pi\u00f9 semplice, l'ho fatto da solo. Ma ho dovuto resettare, fare un reset stat_statements e orientarmi nel momento dello snapshot, dove c'era meno di una certa quota, che non aveva comunque raggiunto il limite, quanto stat_statements pu\u00f2 accumulare. E mi orienterei sul fatto che, molto probabilmente, nulla \u00e8 stato espulso.<\/em> <\/p>\n<p><\/p>\n<p>S\u00ec, s\u00ec. <\/p>\n<p><\/p>\n<p><em>Ma non capisco come possiamo farlo in modo affidabile.<\/em><\/p>\n<p><\/p>\n<p>Purtroppo non ricordo esattamente se utilizziamo il testo della query o il queryid con pg_stat_statements per orientarci. Se ci riferiamo al queryid, allora in teoria stiamo confrontando cose comparabili. <\/p>\n<p><\/p>\n<p><em>No, pu\u00f2 essere sovrascritto 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>Studieremo questa questione. \u00c8 una buona domanda. Dobbiamo approfondire. Ma per ora, ci\u00f2 che vediamo \u00e8 che abbiamo scritto 0...<\/p>\n<p><\/p>\n<p><em>\u00c8 sicuramente un caso raro, ma sono rimasto colpito quando ho scoperto che stat_statements pu\u00f2 essere sovrascritto.<\/em> <\/p>\n<p><\/p>\n<p>In Pg_stat_statements pu\u00f2 esserci di tutto. Abbiamo riscontrato che se track_utility \u00e8 attivo, anche i 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, inizia a bloccarsi la tabella hash. E non appena disattivi un'applicazione molto carica, hai 50-100 gruppi. E l\u00ec tutto \u00e8 pi\u00f9 o meno stabile. Uno dei modi per affrontare questo problema \u00e8 aumentare pg_stat_statements.max. <\/p>\n<p><\/p>\n<p><em>S\u00ec, ma bisogna sapere quanto. E bisogna tenerne traccia. Io lo faccio. Cio\u00e8, ho pg_stat_statements.max. E controllo che nel momento dello snapshot non ho raggiunto il 70%. Bene, significa che non abbiamo perso nulla. Facciamo un reset. E accumuliamo di nuovo. Se nel prossimo snapshot siamo sotto il 70%, significa che probabilmente non abbiamo perso nulla nuovamente.<\/em><\/p>\n<p><\/p>\n<p>S\u00ec. Di default ora sono 5.000. E a molti 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=\"Riproduci 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 che non devono finire nell'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 all'incirca il seguente:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database&quot;. Nikolai 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 4.9.10 - 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? \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\" \/>\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) 4.9.10\" \/>\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? \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\" \/>\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 su database\u00bb. Nikolai Samokhvalov | ProHoster","description":"Propongo di consultare la trascrizione della relazione di Nikolai Samokhvalov \"Un approccio industriale alla messa a punto di PostgreSQL: esperimenti sui database\". Shared_buffers = 25% \u00e8 troppo o troppo poco? O va bene cos\u00ec? Come capire se questa raccomandazione \u2013 piuttosto obsoleta \u2013 \u00e8 adatta al vostro specifico caso? \u00c8 arrivato il momento di affrontare la questione della selezione dei parametri di postgresql.conf \"in modo serio\". Non con metodi ciechi.","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? \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","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"},"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}]}}