{"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\/pt\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","title":{"rendered":"Uma abordagem industrial \u00e0 otimiza\u00e7\u00e3o do PostgreSQL: experimentos com bancos de dados. Nikolay Samokhvalov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Convido a familiarizar-se com a transcri\u00e7\u00e3o do relat\u00f3rio de Nikolai Samokhvalov \"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experimentos em bancos de dados\"<\/strong><\/p>\n<p><\/p>\n<p>Shared_buffers = 25% \u2013 isso \u00e9 muito ou pouco? Ou \u00e9 o ideal? Como entender se essa recomenda\u00e7\u00e3o, j\u00e1 bastante desatualizada, \u00e9 adequada para o seu caso espec\u00edfico?<\/p>\n<p><\/p>\n<p>Chegou a hora de abordar a quest\u00e3o da escolha dos par\u00e2metros do postgresql.conf \"de forma profissional\". N\u00e3o atrav\u00e9s de \"auto-afinadores\" cegos ou conselhos ultrapassados de artigos e blogs, mas com base em:<\/p>\n<p><\/p>\n<ol>\n<li>experimentos rigorosamente controlados em bancos de dados, realizados de forma automatizada, em grande escala e em condi\u00e7\u00f5es o mais pr\u00f3ximas poss\u00edvel das \"reais\",<\/li>\n<li>uma compreens\u00e3o profunda das particularidades de funcionamento do SGBD e do sistema operacional.<\/li>\n<\/ol>\n<p><\/p>\n<p>Usando Nancy CLI (<noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres.ai\/nancy\">https:\/\/gitlab.com\/postgres.ai\/nancy<\/a><\/noindex>), vamos examinar um exemplo espec\u00edfico \u2013 os not\u00f3rios shared_buffers \u2013 em diferentes situa\u00e7\u00f5es, em diversos projetos e tentaremos descobrir como escolher a configura\u00e7\u00e3o ideal para nossa infraestrutura, banco de dados e carga.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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>Falaremos sobre experimentos em bancos de dados. Esta \u00e9 uma hist\u00f3ria que est\u00e1 se desenrolando h\u00e1 pouco mais de seis meses. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/e77255c4abaa2a01ae37fe888fe67db7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um pouco sobre mim. Tenho mais de 14 anos de experi\u00eancia com Postgres. Fundei v\u00e1rias empresas em redes sociais. Em todas elas, o Postgres foi utilizado e continua a ser.<\/p>\n<p><\/p>\n<p>Al\u00e9m disso, o grupo RuPostgres no Meetup \u00e9 o segundo no mundo. Estamos nos aproximando aos poucos de 2.000 pessoas. RuPostgres.org.<\/p>\n<p><\/p>\n<p>E em v\u00e1rias confer\u00eancias, incluindo a Highload, sou respons\u00e1vel pelos bancos de dados, especialmente pelo Postgres desde a sua funda\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/fa009b50f1c0293eee80fc03fd2c05f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nos \u00faltimos anos, renovei minha pr\u00e1tica de consultoria em Postgres em 11 fusos hor\u00e1rios a partir daqui.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/550c3ddcd516adca14d2b3de9c34b7ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E quando fiz isso h\u00e1 alguns anos, tive uma pausa em meu trabalho manual ativo com Postgres, provavelmente desde 2010. Fiquei surpreso com qu\u00e3o pouco mudaram as rotinas di\u00e1rias dos DBAs, quanta m\u00e3o de obra ainda era necess\u00e1ria. E pensei imediatamente que algo estava errado, era preciso automatizar mais.<\/p>\n<p><\/p>\n<p>E como tudo isso estava em nuvem, a maioria dos clientes estava em ambientes em nuvem. E j\u00e1 estava muito automatizado, isso \u00e9 \u00f3bvio. Farei mais sobre isso em breve. Ou seja, tudo isso resultou na ideia de que deveria haver um conjunto de ferramentas, uma plataforma que automatizasse praticamente todas as a\u00e7\u00f5es do DBA, permitindo gerenciar um grande n\u00famero de bancos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b02097f0bb23fa9d7c30e38ab9f3de7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nesta palestra, n\u00e3o haver\u00e1:<\/p>\n<p><\/p>\n<ul>\n<li>Dizer que voc\u00ea deve usar 8 GB ou 25% de shared_buffers e tudo ficar\u00e1 bem \u00e9 simplista. N\u00e3o falaremos muito sobre shared_buffers. <\/li>\n<li>Componentes mais complexos. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ccea359ec78a967c150ddcedc3e50a88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E o que acontecer\u00e1?<\/p>\n<p><\/p>\n<ul>\n<li>Haver\u00e1 princ\u00edpios de otimiza\u00e7\u00e3o que aplicamos e desenvolvemos. Tamb\u00e9m surgir\u00e3o v\u00e1rias ideias ao longo do caminho e diferentes ferramentas que criamos, em sua maioria, em Open Source, ou seja, nossa base \u00e9 constru\u00edda em Open Source. Al\u00e9m disso, temos tickets e quase toda a comunica\u00e7\u00e3o ocorre em Open Source. Voc\u00ea pode ver o que estamos fazendo atualmente, o que ser\u00e1 na pr\u00f3xima vers\u00e3o, etc. <\/li>\n<li>Al\u00e9m disso, haver\u00e1 alguma experi\u00eancia no uso desses princ\u00edpios e ferramentas em v\u00e1rias empresas: de pequenas startups a grandes corpora\u00e7\u00f5es. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86e6f379726dec814aca616a30d36a2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como tudo isso se desenvolve?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c1422d9f2945e717c6ebb31f5fef6329.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Primeiro, a principal tarefa de um DBA, al\u00e9m de garantir a cria\u00e7\u00e3o de instances, implementa\u00e7\u00e3o de backups, etc., \u00e9 identificar gargalos e otimizar o desempenho.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8e682ca8666e94d6688348ebe4540327.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Atualmente, funciona assim. Observamos o monitoramento, vemos algumas coisas, mas nos faltam detalhes. Come\u00e7amos a investigar mais a fundo, geralmente manualmente, para entender o que fazer.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/04599422ea6b6d57c79a4e48ba2db8b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Existem duas abordagens. Pg_stat_statements \u00e9 a solu\u00e7\u00e3o padr\u00e3o para identificar consultas lentas. E a an\u00e1lise de logs do Postgres usando o pgBadger.<\/p>\n<p><\/p>\n<p>Cada uma dessas abordagens tem desvantagens significativas. Na primeira abordagem, todos os par\u00e2metros s\u00e3o descartados. Se vimos grupos de SELECT * FROM table WHERE coluna \u00e9 igual a '?' ou '$' a partir da vers\u00e3o 10 do Postgres, n\u00e3o sabemos se \u00e9 index scan ou seq scan. Isso depende muito do par\u00e2metro. Se voc\u00ea inserir um valor raro, ser\u00e1 index scan. Se voc\u00ea inserir um valor que representa 90% da tabela, ser\u00e1 seq scan, porque o Postgres conhece a estat\u00edstica. Essa \u00e9 uma grande desvantagem do pg_stat_statements, embora alguns trabalhos estejam sendo realizados.<\/p>\n<p><\/p>\n<p>A principal desvantagem da an\u00e1lise de logs \u00e9 que geralmente voc\u00ea n\u00e3o pode permitir 'log_min_duration_statement = 0'. E vamos falar sobre isso tamb\u00e9m. Portanto, voc\u00ea n\u00e3o v\u00ea o quadro completo. Uma consulta que \u00e9 muito r\u00e1pida pode consumir uma enorme quantidade de recursos, mas voc\u00ea n\u00e3o a ver\u00e1 porque est\u00e1 abaixo do seu limite.<\/p>\n<p><\/p>\n<p><strong>Como os DBAs resolvem os problemas encontrados?<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5e57fefdec6256f82045aaac037b516c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por exemplo, encontramos um problema. O que normalmente \u00e9 feito? Se voc\u00ea \u00e9 um desenvolvedor, voc\u00ea far\u00e1 algo em uma inst\u00e2ncia que n\u00e3o \u00e9 do tamanho certo. Se voc\u00ea \u00e9 um DBA, voc\u00ea tem um ambiente de staging. E pode haver apenas um. E ele est\u00e1 desatualizado h\u00e1 seis meses. E voc\u00ea pensa que vai para a produ\u00e7\u00e3o. E at\u00e9 mesmo os DBAs experientes ainda testam na produ\u00e7\u00e3o, em uma r\u00e9plica. E \u00e0s vezes, eles criam um \u00edndice tempor\u00e1rio, verificam se ele ajuda, o descartam e o entregam aos desenvolvedores para que o incluam nos arquivos de migra\u00e7\u00e3o. Esse tipo de absurdo est\u00e1 acontecendo agora. E isso \u00e9 um problema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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>Ajustar configura\u00e7\u00f5es.<\/li>\n<li>Otimizar o conjunto de \u00edndices. <\/li>\n<li>Modificar a pr\u00f3pria consulta SQL (esta \u00e9 a forma mais dif\u00edcil).<\/li>\n<li>Adicionar recursos (a forma mais simples na maioria dos casos).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8a6b3cd56e0df5c7908714926ba1eb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Com essas coisas, h\u00e1 muito a considerar. Existem muitos detalhes no Postgres. \u00c9 preciso saber muito. H\u00e1 muitos \u00edndices no Postgres, em parte gra\u00e7as aos organizadores desta confer\u00eancia. E tudo isso deve ser conhecido, e \u00e9 exatamente isso que causa a impress\u00e3o nos n\u00e3o DBAs de que os DBAs praticam magia negra. Ou seja, \u00e9 necess\u00e1rio cerca de 10 anos de experi\u00eancia para come\u00e7ar a entender tudo isso de maneira adequada.<\/p>\n<p><\/p>\n<p>E eu sou um lutador contra essa magia negra. Quero que haja tecnologia, e n\u00e3o intui\u00e7\u00e3o em tudo isso.<\/p>\n<p><\/p>\n<p><strong>Exemplos da vida real<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/70b11c3df9c41c66570635d5f309ed24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eu observei isso em pelo menos dois projetos, incluindo o meu. Um novo post no blog nos informa que um valor de 1.000 para default_statistic_target \u00e9 bom. Certo, vamos tentar na produ\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0b4c2bd6f73df06967c94d5d78b07279.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E aqui estamos n\u00f3s, usando nossa ferramenta dois anos depois, com experimentos sobre os bancos de dados que discutimos hoje, e podemos comparar o que era e o que se tornou. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/3564eade6532003d2279c2736ab6d733.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E para isso, precisamos criar um experimento. Ele consiste em quatro partes. <\/p>\n<p><\/p>\n<ul>\n<li>A primeira parte \u00e9 o ambiente. Precisamos de hardware. E quando eu chego a alguma empresa e fecho um contrato, digo que quero um hardware igual ao de produ\u00e7\u00e3o. Para cada um dos seus Mestres, eu preciso de pelo menos um hardware desse tipo. Seja uma inst\u00e2ncia de m\u00e1quina virtual na Amazon ou no Google, ou exatamente o mesmo hardware que eu preciso. Ou seja, quero recriar o ambiente. E no conceito de ambiente, inclu\u00edmos a vers\u00e3o maior do Postgres. <\/li>\n<li>A segunda parte \u00e9 o objeto de nossa pesquisa. \u00c9 o banco de dados. Ele pode ser criado de v\u00e1rias maneiras. Eu vou mostrar como. <\/li>\n<li>A terceira parte \u00e9 a carga. Este \u00e9 o momento mais dif\u00edcil. <\/li>\n<li>A quarta parte \u00e9 o que verificamos, ou seja, o que vamos comparar. Podemos alterar um ou mais par\u00e2metros na configura\u00e7\u00e3o, ou podemos criar um \u00edndice, entre outras coisas. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8ccd09ac4cdd336618413375617c10a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estamos realizando um experimento. Aqui est\u00e1 o pg_stat_statements. \u00c0 esquerda, o que era. \u00c0 direita, o que se tornou.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/6f82d7e25a77b700f2ddb01f42a861a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 esquerda, default_statistics_target = 100, \u00e0 direita = 1 000. Vemos que isso nos ajudou. Tudo melhorou em 8% no geral.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/52dda8fb5fbcb9beecaa1eda8443a374.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas se lembrarmos, l\u00e1 embaixo estar\u00e3o grupos de consultas do pgBadger ou do pg_stat_statements. Aqui existem duas op\u00e7\u00f5es. Vemos que alguma consulta caiu 88%. E aqui j\u00e1 entra a abordagem de engenharia. Podemos investigar mais a fundo, porque \u00e9 interessante entender por que caiu. Precisamos entender o que aconteceu com as estat\u00edsticas. Por que mais buckets nas estat\u00edsticas levam a um resultado pior.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4e6dfc04af4b3fc2b626dd46c08bdf66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ou podemos n\u00e3o investigar, mas fazer um \"ALTER TABLE \u2026 ALTER COLUMN\" e retornar 100 buckets para as estat\u00edsticas dessa coluna. E ent\u00e3o, com mais um experimento, podemos confirmar que esse reparo ajudou. Isso \u00e9 uma abordagem de engenharia que nos ajuda a ver o quadro e tomar decis\u00f5es com base em dados, e n\u00e3o em intui\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/9e766aa4348bd1a77b697e3179d84bbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alguns exemplos de outras \u00e1reas. Nos testes, os testes de CI j\u00e1 existem h\u00e1 muitos anos. E nenhum projeto com bom senso viveria sem testes autom\u00e1ticos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b6c21981dc8b2b285973ae42199e2b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Em outras ind\u00fastrias: na avia\u00e7\u00e3o, na ind\u00fastria automobil\u00edstica, quando testamos a aerodin\u00e2mica, tamb\u00e9m temos a oportunidade de realizar experimentos. N\u00e3o vamos lan\u00e7ar algo do projeto diretamente no espa\u00e7o ou colocar um carro na pista imediatamente. Por exemplo, existe um t\u00fanel de vento. <\/p>\n<p><\/p>\n<p>A partir das observa\u00e7\u00f5es em outras ind\u00fastrias, podemos tirar conclus\u00f5es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cef02ea9280e5795d1e593c600f0541b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Primeiro, temos um ambiente especial. Ele \u00e9 pr\u00f3ximo da produ\u00e7\u00e3o, mas n\u00e3o exatamente. Sua principal caracter\u00edstica \u00e9 que deve ser barato, repet\u00edvel e o mais automatizado poss\u00edvel. Tamb\u00e9m deve haver ferramentas especiais para realizar an\u00e1lises detalhadas.<\/p>\n<p><\/p>\n<p>Provavelmente, quando lan\u00e7amos o avi\u00e3o e estamos voando, temos menos oportunidades de estudar cada mil\u00edmetro da superf\u00edcie da asa do que em um t\u00fanel de vento. Temos mais recursos para diagn\u00f3stico. Podemos nos permitir adicionar mais peso, que n\u00e3o podemos carregar no avi\u00e3o no ar. O mesmo acontece com o Postgres. Em alguns casos, podemos ativar o registro completo de consultas durante os experimentos. E n\u00e3o queremos fazer isso em produ\u00e7\u00e3o. Talvez at\u00e9 mesmo ativemos isso com planos usando auto_explain.<\/p>\n<p><\/p>\n<p>E como j\u00e1 mencionei, um alto n\u00edvel de automa\u00e7\u00e3o significa que pressionamos um bot\u00e3o e repetimos. \u00c9 assim que deve ser, para que tenhamos muitos experimentos, para que isso fa\u00e7a parte do fluxo.<\/p>\n<p><\/p>\n<p>Nancy CLI \u2013 a base do \"laborat\u00f3rio de DB\".<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/f8303df21f309fb209929acec260b757.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E aqui est\u00e1 o que fizemos. Ou seja, falei sobre essas ideias em junho, quase um ano atr\u00e1s. E j\u00e1 temos em Open Source o que chamamos de Nancy CLI. Essa \u00e9 a base para construir um laborat\u00f3rio de banco de dados.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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> \u2013 Isso est\u00e1 em Open Source, no Gitlab. Voc\u00ea pode dizer, pode experimentar. Eu coloquei um link nos slides. Voc\u00ea pode clicar nele e l\u00e1 estar\u00e1. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\/-\/blob\/master\/help\/nancy_run.md\">ajuda<\/a><\/noindex> sobre todos os par\u00e2metros.<\/p>\n<p><\/p>\n<p>Claro, h\u00e1 muito mais em fase de desenvolvimento. H\u00e1 muitas ideias. Mas isso j\u00e1 \u00e9 algo que aplicamos praticamente todos os dias. E quando temos uma ideia \u2013 e se ao deletar 40.000.000 de linhas tudo estiver preso em I\/O, podemos conduzir um experimento e olhar mais de perto, para entender o que est\u00e1 acontecendo e depois tentar corrigir isso em andamento. Ou seja, fazemos um experimento. Por exemplo, ajustamos algo e vemos o que resulta. E n\u00e3o fazemos isso em produ\u00e7\u00e3o. Essa \u00e9 a ess\u00eancia da ideia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c22d332de4b45d604dfb9c5a95404fd6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Onde isso pode funcionar? Isso pode funcionar localmente, ou seja, pode ser feito em qualquer lugar, voc\u00ea pode at\u00e9 mesmo rodar em um MacBook. Precisa de Docker, vamos l\u00e1. E \u00e9 isso. Pode ser executado em algum inst\u00e2ncia de hardware ou em uma m\u00e1quina virtual, em qualquer lugar.<\/p>\n<p><\/p>\n<p>E ainda h\u00e1 a possibilidade de executar remotamente na Amazon em uma Inst\u00e2ncia EC2, nas inst\u00e2ncias spot. E isso \u00e9 uma oportunidade muito interessante. Por exemplo, ontem realizamos mais de 500 experimentos em uma inst\u00e2ncia i3, come\u00e7ando pela mais b\u00e1sica at\u00e9 a i3-16-xlarge. E esses 500 experimentos nos custaram 64 d\u00f3lares. Cada um durou 15 minutos. Ou seja, devido ao uso de inst\u00e2ncias spot, isso \u00e9 muito barato \u2014 um desconto de 70%, com cobran\u00e7a por segundo da Amazon. Voc\u00ea pode fazer muito. Voc\u00ea pode realizar uma pesquisa real.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/64c61cc9dd7181296b2ef5b815a17493.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E tr\u00eas vers\u00f5es principais do Postgres s\u00e3o suportadas. N\u00e3o \u00e9 t\u00e3o dif\u00edcil atualizar algumas antigas e a nova vers\u00e3o 12 tamb\u00e9m.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ee147c91014ab698cbd3c60e193bef23.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podemos especificar o objeto de tr\u00eas maneiras. S\u00e3o elas:<\/p>\n<p><\/p>\n<ul>\n<li>Dump\/arquivo sql. <\/li>\n<li>A principal maneira \u00e9 clonar o diret\u00f3rio PGDATA. Geralmente \u00e9 feito a partir de um servidor de backup. Se voc\u00ea tiver backups bin\u00e1rios adequados, pode criar clones a partir de l\u00e1. Se voc\u00ea estiver na nuvem, ent\u00e3o a empresa de nuvem, como a Amazon e o Google, far\u00e1 isso por voc\u00ea. Este \u00e9 o m\u00e9todo principal para clonar produ\u00e7\u00e3o real. \u00c9 assim que estamos implantando. <\/li>\n<li>E o \u00faltimo m\u00e9todo \u00e9 adequado para pesquisas, quando h\u00e1 o desejo de entender como algo funciona no Postgres. Isso \u00e9 o pgbench. Voc\u00ea pode gerar com a ajuda do pgbench. \u00c9 apenas uma op\u00e7\u00e3o \"db-pgbench\". Voc\u00ea diz a ele qual \u00e9 a escala. E tudo ser\u00e1 gerado na nuvem, como est\u00e1 dito.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/2bc3e30cb31a19f66c6b55480447126f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E a carga:<\/p>\n<p><\/p>\n<ul>\n<li>Podemos executar a carga em um \u00fanico fluxo SQL. Esta \u00e9 a maneira mais primitiva. <\/li>\n<li>Ou podemos emular a carga. E podemos emul\u00e1-la principalmente da seguinte forma. Precisamos coletar todos os logs. E isso \u00e9 doloroso. Eu vou mostrar por qu\u00ea. E com o pgreplay, que \u00e9 integrado ao Nancy, n\u00f3s reproduzimos. <\/li>\n<li>Ou outra op\u00e7\u00e3o. A chamada carga artesanal, que fazemos com um certo esfor\u00e7o. Analisando nossa carga atual no sistema em produ\u00e7\u00e3o, extra\u00edmos os grupos principais de consultas. E com o pgbench podemos emular essa carga em um laborat\u00f3rio. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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>Ou precisamos executar alguma SQL, ou seja, verificamos uma migra\u00e7\u00e3o, criamos um \u00edndice, executamos ANALYZE. E observamos o que havia antes e depois do vacuum. Em suma, qualquer SQL.<\/li>\n<li>Ou mudamos um ou mais par\u00e2metros na configura\u00e7\u00e3o. Podemos pedir para verificar, por exemplo, 100 valores na Amazon para nosso banco de dados de um terabyte. E em algumas horas voc\u00ea ter\u00e1 o resultado. Geralmente, o banco de dados de um terabyte levar\u00e1 v\u00e1rias horas para ser implantado. Mas na vers\u00e3o de desenvolvimento, h\u00e1 um patch, temos uma s\u00e9rie, ou seja, voc\u00ea pode usar o mesmo pgdata no mesmo servidor e testar sequencialmente. O Postgres ser\u00e1 reiniciado, os caches ser\u00e3o limpos. E voc\u00ea pode sobrecarregar. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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>Uma pasta chega, contendo v\u00e1rios arquivos, come\u00e7ando pelos snapshots do pg.<em>stat<\/em>***. E o mais interessante l\u00e1 s\u00e3o o pg_stat_statements e o pg_stat_kcacke. Estas s\u00e3o duas extens\u00f5es que analisam as consultas. E o pg_stat_bgwriter cont\u00e9m n\u00e3o apenas estat\u00edsticas do pgwriter, mas tamb\u00e9m sobre checkpoints e como os pr\u00f3prios backends expulsam buffers sujos. E \u00e9 tudo interessante de se observar. Por exemplo, quando configuramos shared_buffers, \u00e9 muito interessante ver quantos buffers foram expulsos.<\/li>\n<li>Os logs do Postgres tamb\u00e9m chegam. Dois logs \u2013 o log de prepara\u00e7\u00e3o e o log de reprodu\u00e7\u00e3o da carga. <\/li>\n<li>Um recurso relativamente novo \u2013 s\u00e3o os FlameGraphs.<\/li>\n<li>Al\u00e9m disso, se voc\u00ea usou op\u00e7\u00f5es de reprodu\u00e7\u00e3o de carga como pgreplay ou pgbench, seu resultado original estar\u00e1 l\u00e1. E voc\u00ea ver\u00e1 lat\u00eancia e TPS. Ser\u00e1 poss\u00edvel entender como eles enxergavam isso. <\/li>\n<li>Informa\u00e7\u00f5es do sistema. <\/li>\n<li>Verifica\u00e7\u00f5es b\u00e1sicas de CPU e IO. Isso \u00e9 mais para inst\u00e2ncias EC2 na Amazon, quando voc\u00ea deseja iniciar 100 inst\u00e2ncias id\u00eanticas em fluxo e realizar 100 execu\u00e7\u00f5es diferentes, ter\u00e1 10.000 experimentos. E voc\u00ea precisa garantir que n\u00e3o pegou uma inst\u00e2ncia defeituosa, que j\u00e1 est\u00e1 sendo prejudicada por algu\u00e9m. Nessa m\u00e1quina, outros est\u00e3o se ativando e poucos recursos sobrando para voc\u00ea. Esses resultados s\u00e3o melhores para serem descartados. E \u00e9 exatamente com a ajuda do sysbench de Alexey Kopytov que fazemos algumas verifica\u00e7\u00f5es r\u00e1pidas que chegam e podem ser comparadas com outras, ou seja, voc\u00ea entender\u00e1 como a CPU se comporta e como o IO se comporta. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c4ddf5283c3c79e3d4c2c061e7dd9e7d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quais s\u00e3o as dificuldades t\u00e9cnicas ao exemplo de diferentes empresas?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/959690b464a01a4a3cb67ec497becff1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Suponha que queremos replicar uma carga real usando logs. \u00c9 uma \u00f3tima ideia, se isso foi escrito no Open Source pgreplay. N\u00f3s o usamos. Mas para que funcione bem, voc\u00ea deve ativar o log completo das consultas com par\u00e2metros e temporiza\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Existem algumas complica\u00e7\u00f5es em rela\u00e7\u00e3o \u00e0 dura\u00e7\u00e3o e ao timestamp. Vamos deixar essa parte de lado. A quest\u00e3o principal \u00e9: voc\u00ea pode se dar a esse luxo ou n\u00e3o pode? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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>O problema \u00e9 que isso pode n\u00e3o estar dispon\u00edvel. Voc\u00ea deve, acima de tudo, entender qual fluxo ser\u00e1 registrado no log. Se voc\u00ea tiver o pg_stat_statements, pode usar esta consulta (o link estar\u00e1 dispon\u00edvel nos slides) para entender quantos bytes aproximadamente ser\u00e3o registrados por segundo.<\/p>\n<p><\/p>\n<p>Estamos observando o comprimento da consulta. Estamos desconsiderando o fato de que n\u00e3o h\u00e1 par\u00e2metros, mas sabemos o comprimento da consulta e quantas vezes ela foi executada por segundo. Assim, podemos estimar quantos bytes em m\u00e9dia por segundo. Podemos errar por um fator de dois, mas, de qualquer forma, teremos uma boa ideia.<\/p>\n<p><\/p>\n<p>Podemos ver que essa consulta \u00e9 executada 802 vezes por segundo. E vemos que bytes_por_sec \u2013 300 kB\/s ser\u00e1 registrado, mais ou menos. E, geralmente, podemos nos dar esse fluxo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/218f905073a8519115adf5c65825b74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas! O fato \u00e9 que existem diferentes sistemas de registro. E, por padr\u00e3o, as pessoas geralmente usam 'syslog'.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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 voc\u00ea tiver 'syslog', pode obter uma imagem assim. Vamos pegar o pgbench, ativar o registro de consultas e ver o que acontece.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a05723dcf10a7733f054ba108bb0f107.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sem registro \u2013 essa \u00e9 a coluna da esquerda. Tivemos 161 000 TPS. Com 'syslog' \u2013 no Ubuntu 16.04 na Amazon, obtemos 37 000 TPS. E se mudarmos para dois outros m\u00e9todos de registro, a situa\u00e7\u00e3o melhora muito. Ou seja, esper\u00e1vamos uma queda, mas n\u00e3o tanto.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a7d90af9d29761d3b80eb09bf050760f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E no CentOS 7, onde o journald tamb\u00e9m participa, convertendo logs em formato bin\u00e1rio para uma busca mais conveniente, a situa\u00e7\u00e3o \u00e9 um pesadelo; temos uma queda de 44 vezes no TPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86d2af18a0e6364f297a62378b6ede56.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E isso \u00e9 com o que as pessoas convivem. E muitas vezes nas empresas, especialmente as grandes, \u00e9 muito dif\u00edcil mudar. Se voc\u00ea conseguir se afastar do 'syslog', por favor, fa\u00e7a isso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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>Avalie o IOPS e o fluxo de grava\u00e7\u00e3o. <\/li>\n<li>Verifique seu sistema de registro. <\/li>\n<li>Se a carga prevista for excessivamente alta, considere a op\u00e7\u00e3o de amostragem. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/127fa1296578ba0ba6eac2b44c5c5398.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Temos o pg_stat_statements. Como eu disse, ele deve estar presente. E podemos descrever cada grupo de consultas de uma maneira especial em um arquivo. Em seguida, podemos usar um recurso muito conveniente do pgbench \u2013 a capacidade de fornecer v\u00e1rios arquivos por meio da op\u00e7\u00e3o '-f'.<\/p>\n<p><\/p>\n<p>Ele entende muito sobre \u00ab-f\u00bb. E podemos indicar com \u00ab@\u00bb no final qual fra\u00e7\u00e3o deve ser aplicada a cada arquivo. Ou seja, podemos especificar que este deve ser executado em 10% dos casos, e aquele em 20%. Isso nos aproximar\u00e1 do que vemos em produ\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b91d18a9861abdc36bfda54cd72a142f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como entenderemos o que temos em produ\u00e7\u00e3o? Qual fra\u00e7\u00e3o e o que exatamente? Aqui h\u00e1 um pequeno desvio. Temos mais um produto. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/postgres-checkup\">postgres-checkup<\/a><\/noindex>. Tamb\u00e9m \u00e9 uma base em Open Source. E estamos atualmente desenvolvendo ativamente.<\/p>\n<p><\/p>\n<p>Ele surgiu um pouco por outras raz\u00f5es. Devido ao fato de que o monitoramento \u00e9 insuficiente. Ou seja, voc\u00ea chega, analisa a base, observa os problemas existentes. E, geralmente, voc\u00ea faz um health_check. Se voc\u00ea \u00e9 um DBA experiente, voc\u00ea realiza o health_check. Observou o uso de \u00edndices, etc. Se voc\u00ea tiver o OKmeter, \u00f3timo. \u00c9 uma excelente ferramenta de monitoramento para o Postgres. OKmeter.io \u2013 por favor, instale, tudo foi feito de forma muito legal. \u00c9 pago.<\/p>\n<p><\/p>\n<p>Se voc\u00ea n\u00e3o o possui, geralmente voc\u00ea tem pouco ou nada. O monitoramento normalmente abrange CPU, IO e ainda com ressalvas, e s\u00f3. Precisamos de mais. Precisamos ver como funciona o autovacuum, como funciona o checkpoint, em IO precisamos separar o checkpoint do bgwriter e dos backends, etc.<\/p>\n<p><\/p>\n<p>O problema \u00e9 que, quando voc\u00ea ajuda uma grande empresa, eles n\u00e3o conseguem implementar algo rapidamente. N\u00e3o podem comprar o OKmeter rapidamente. Talvez comprem em seis meses. N\u00e3o podem instalar pacotes rapidamente. <\/p>\n<p><\/p>\n<p>E tivemos a ideia de que precisamos de uma ferramenta especial que n\u00e3o requer instala\u00e7\u00e3o; ou seja, voc\u00ea n\u00e3o precisa instalar nada em produ\u00e7\u00e3o. Voc\u00ea instala no seu laptop ou em um servidor de observa\u00e7\u00e3o, de onde voc\u00ea ir\u00e1 executar. E ela ir\u00e1 analisar muitas coisas: tanto o sistema operacional, quanto o sistema de arquivos e o pr\u00f3prio Postgres, realizando algumas consultas leves que podem ser executadas diretamente em produ\u00e7\u00e3o sem causar problemas.<\/p>\n<p><\/p>\n<p>N\u00f3s a chamamos de Postgres-checkup. Se olharmos pelo lado m\u00e9dico, \u00e9 um exame regular de sa\u00fade. Se pensarmos em termos automotivos, \u00e9 como uma revis\u00e3o. Voc\u00ea faz a revis\u00e3o do seu carro a cada seis meses ou um ano, dependendo da marca. E voc\u00ea faz revis\u00f5es para sua base de dados? Ou seja, faz uma an\u00e1lise profunda regularmente? \u00c9 necess\u00e1rio fazer isso. Se voc\u00ea faz backups, ent\u00e3o fa\u00e7a o checkup tamb\u00e9m, isso \u00e9 igualmente importante.<\/p>\n<p><\/p>\n<p>E temos essa ferramenta. Come\u00e7ou a se desenvolver ativamente apenas tr\u00eas meses atr\u00e1s. Ela ainda \u00e9 nova, mas j\u00e1 tem muitos recursos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/514d00b5cb710a7997af0a5dde55b5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Coletamos os grupos de consultas mais \"influentes\" \u2013 relat\u00f3rio K003 no Postgres-checkup<\/p>\n<p><\/p>\n<p>E l\u00e1 h\u00e1 um grupo de relat\u00f3rios K. Tr\u00eas relat\u00f3rios por enquanto. E h\u00e1 esse relat\u00f3rio K003. Ele cont\u00e9m o topo do pg_stat_statements, ordenado por total_time.<\/p>\n<p><\/p>\n<p>Quando ordenamos por total_time os grupos de consultas, vemos um grupo que mais sobrecarrega nosso sistema, ou seja, consome uma quantidade maior de recursos. Por que eu chamo de grupos de consultas? Porque descartamos os par\u00e2metros. J\u00e1 n\u00e3o s\u00e3o consultas, mas grupos de consultas, ou seja, est\u00e3o abstra\u00eddos.<\/p>\n<p><\/p>\n<p>E se formos otimizar de cima para baixo, estaremos aliviando nossos recursos e adiando o momento em que teremos que fazer um upgrade. Essa \u00e9 uma \u00f3tima maneira de economizar dinheiro.<\/p>\n<p><\/p>\n<p>Talvez n\u00e3o seja a melhor abordagem em termos de cuidar dos usu\u00e1rios, porque pode ser que n\u00e3o vejamos raros, mas muito inc\u00f4modos casos em que uma pessoa esperou 15 segundos. No total, s\u00e3o t\u00e3o raros que n\u00e3o os notamos, mas estamos cuidando dos recursos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d16abc423573e4d923b0c03683c2efee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que aconteceu nesta tabela? Fizemos dois snapshots. O Postgres_checkup lhe dar\u00e1 a delta de cada m\u00e9trica: total-time, calls, rows, shared_blks_read, etc. Pronto, a delta foi calculada. O pg_stat_statements tem um grande problema, pois ele n\u00e3o se lembra de quando ocorreu o reset. Se o pg_stat_database se lembra, o pg_stat_statements n\u00e3o lembra. Voc\u00ea ver\u00e1 um n\u00famero de 1.000.000, mas n\u00e3o sabemos de onde ele foi contado.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c370bf1237675e03c0a3d362c025ac24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui sabemos, pois temos dois snapshots. Sabemos que a delta foi, nesse caso, 56 segundos. Um intervalo muito pequeno. Ordenado por total_time. E ent\u00e3o podemos diferenciar, ou seja, dividimos todas as m\u00e9tricas pela dura\u00e7\u00e3o. Se dividirmos cada m\u00e9trica pela dura\u00e7\u00e3o, teremos o n\u00famero de chamadas por segundo.<\/p>\n<p><\/p>\n<p>A seguir, total_time por segundo \u2013 essa \u00e9 a minha m\u00e9trica favorita. Ela \u00e9 medida em segundos, por segundo, ou seja, quantos segundos o nosso sistema levou para executar esse grupo de consultas por segundo. Se voc\u00ea v\u00ea mais de um segundo por segundo, isso significa que voc\u00ea precisava fornecer mais de um n\u00facleo. Essa \u00e9 uma m\u00e9trica muito boa. Voc\u00ea pode entender que essa pessoa, por exemplo, precisa de pelo menos tr\u00eas n\u00facleos.<\/p>\n<p><\/p>\n<p>Esta \u00e9 a nossa novidade, nunca vi algo assim. Observe \u2013 \u00e9 uma coisa muito simples \u2013 segundo a segundo. \u00c0s vezes, quando sua CPU est\u00e1 a 100%, \u00e9 meia hora por segundo, ou seja, voc\u00ea ficou meia hora lidando apenas com essas consultas. <\/p>\n<p><\/p>\n<p>Em seguida, vemos as linhas por segundo. Sabemos quantas linhas por segundo foram retornadas.<\/p>\n<p><\/p>\n<p>E h\u00e1 outra coisa interessante. Quantos shared_buffers lemos por segundo do pr\u00f3prio shared_buffers. Os hits j\u00e1 estavam l\u00e1, e as linhas foram obtidas do cache do sistema operacional ou do disco. A primeira op\u00e7\u00e3o \u00e9 r\u00e1pida, e a segunda pode ser r\u00e1pida, mas tamb\u00e9m pode n\u00e3o ser, depende da situa\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>A segunda forma de diferencia\u00e7\u00e3o \u00e9 dividir o n\u00famero de consultas neste grupo. Na segunda coluna, voc\u00ea sempre ter\u00e1 uma consulta dividida pela consulta. E ent\u00e3o, o que \u00e9 interessante \u2013 quantos milissegundos foram gastos nesta consulta. Sabemos como essa consulta se comporta em m\u00e9dia. Foram necess\u00e1rios 101 milissegundos para cada consulta. Essa \u00e9 uma m\u00e9trica tradicional que precisamos para nossa compreens\u00e3o.<\/p>\n<p><\/p>\n<p>Quantas linhas cada consulta retornou em m\u00e9dia. Vemos que este grupo retorna 8. Quantas, em m\u00e9dia, foram obtidas e lidas do cache. Vemos que tudo est\u00e1 bem cacheado. Muitos hits para o primeiro grupo. <\/p>\n<p><\/p>\n<p>E a quarta linha em cada linha \u2013 \u00e9 quantos por cento do total. Temos chamadas. Digamos, 1.000.000. E podemos entender qual \u00e9 a contribui\u00e7\u00e3o deste grupo. Vemos que, neste caso, o primeiro grupo contribui com menos de 0,01%. Ou seja, \u00e9 t\u00e3o lento que n\u00e3o o vemos na imagem geral. O segundo grupo \u2013 5% das chamadas. Ou seja, 5% de todas as chamadas s\u00e3o deste segundo grupo. <\/p>\n<p><\/p>\n<p>Quanto ao total_time, tamb\u00e9m \u00e9 interessante. Para o primeiro grupo de consultas, gastamos 14% do tempo total de opera\u00e7\u00e3o. Para o segundo \u2013 11%, e assim por diante. <\/p>\n<p><\/p>\n<p>N\u00e3o vou entrar em detalhes, mas h\u00e1 sutilezas. Mostramos um erro acima porque, ao comparar, os snapshots podem variar, ou seja, algumas consultas podem faltar, e no segundo elas podem n\u00e3o estar presentes, enquanto novas podem aparecer. E l\u00e1 calculamos o erro. Se voc\u00ea v\u00ea 0, isso \u00e9 bom. Isso significa que n\u00e3o h\u00e1 erros. Se a taxa de erro estiver abaixo de 20%, est\u00e1 OK. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/327bbf167bc21d37a3e1597b52528e6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Em seguida, voltamos ao nosso tema. Precisamos craftar o workload. Vamos de cima para baixo, at\u00e9 atingir 80% ou 90%. Normalmente, s\u00e3o 10 a 20 grupos. E fazemos arquivos para pgbench. Usamos random l\u00e1. \u00c0s vezes, infelizmente, isso n\u00e3o funciona. E no Postgres 12 haver\u00e1 mais op\u00e7\u00f5es para usar essa abordagem. <\/p>\n<p><\/p>\n<p>E assim, acumulamos de 80 a 90% do total_time. O que devemos colocar depois do \u00ab@\u00bb? Observamos as chamadas, verificamos quantos por cento e entendemos que aqui precisamos de um certo percentual. A partir desses percentuais, podemos entender como equilibrar cada um dos arquivos. Depois disso, utilizamos o pgbench e come\u00e7amos a trabalhar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/53edf787f49dcabb5e4731510839332d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Temos tamb\u00e9m K001 e K002. <\/p>\n<p><\/p>\n<p>K001 \u00e9 uma grande string com quatro substrings. Essa \u00e9 a caracter\u00edstica de toda a nossa carga. Observe a segunda coluna e a segunda substring. Vemos que \u00e9 mais ou menos uma e meia por segundo, ou seja, se tivermos dois n\u00facleos, ser\u00e1 bom. A carga ser\u00e1 de aproximadamente 75%. E assim funcionar\u00e1. Se tivermos 10 n\u00facleos, ficaremos tranquilos. Assim, podemos avaliar os recursos.<\/p>\n<p><\/p>\n<p>K002 \u2013 eu chamo isso de classes de consultas, ou seja, SELECT, INSERT, UPDATE, DELETE. E separadamente, SELECT FOR UPDATE, pois este bloqueia. <\/p>\n<p><\/p>\n<p>E aqui podemos concluir que os SELECTs normais de leitura representam 82% de todas as chamadas, mas consomem 74% do total_time. Ou seja, s\u00e3o muitas chamadas, mas consomem menos recursos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0e0234e696ffe1c80f8b5acccc602dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E voltamos \u00e0 pergunta: \u00abComo podemos escolher corretamente os shared_buffers?\u00bb. Eu observo que a maioria dos benchmarks \u00e9 constru\u00edda com a ideia de \u2013 vamos ver qual ser\u00e1 a taxa de transfer\u00eancia, ou seja, qual ser\u00e1 o throughput. Geralmente, isso \u00e9 medido em TPS ou QPS.<\/p>\n<p><\/p>\n<p>E tentamos extrair da m\u00e1quina o m\u00e1ximo de transa\u00e7\u00f5es por segundo poss\u00edvel atrav\u00e9s de par\u00e2metros de afina\u00e7\u00e3o. Aqui s\u00e3o exatamente 311 por segundo para SELECT.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d5e73f2672d94bb92eed921ef3dfe0b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas ningu\u00e9m vai ao trabalho e volta para casa de carro em velocidade m\u00e1xima. Isso \u00e9 tolo. Assim s\u00e3o os bancos de dados. N\u00e3o devemos operar em velocidade m\u00e1xima, na verdade, ningu\u00e9m faz isso. Ningu\u00e9m vive em produ\u00e7\u00e3o com 100% de CPU. Embora, talvez algu\u00e9m viva, mas isso n\u00e3o \u00e9 desej\u00e1vel. <\/p>\n<p><\/p>\n<p>A ideia \u00e9 que geralmente operamos a cerca de 20% da capacidade, preferencialmente n\u00e3o acima de 50%. E tentamos otimizar o tempo de resposta para nossos usu\u00e1rios acima de tudo. Ou seja, devemos ajustar nossas configura\u00e7\u00f5es para que haja a menor lat\u00eancia poss\u00edvel a uma velocidade de 20%, de forma hipot\u00e9tica. Essa \u00e9 uma ideia que tamb\u00e9m tentamos aplicar em nossos experimentos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c32c2cfb76dce0ce6b50e929bbf914ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, para concluir, as recomenda\u00e7\u00f5es: <\/p>\n<p><\/p>\n<ul>\n<li>Certifique-se de fazer o Database Lab.<\/li>\n<li>Sempre que poss\u00edvel, fa\u00e7a on demand, para que seja configurado por um per\u00edodo \u2013 brinque e descarte. Se voc\u00ea estiver em nuvem, isso \u00e9 autom\u00e1tico, ou seja, tenha muitos standing. <\/li>\n<li>Seja curioso. E se algo n\u00e3o estiver certo, experimentem para ver como se comporta. Nancy pode ser usada para se treinar e verificar como funciona o banco de dados.<\/li>\n<li>E mire o tempo de resposta m\u00ednimo. <\/li>\n<li>E n\u00e3o tenha medo dos c\u00f3digos-fonte do Postgres. Quando voc\u00ea trabalha com c\u00f3digos-fonte, precisa saber ingl\u00eas. H\u00e1 muitos coment\u00e1rios; tudo est\u00e1 explicado. <\/li>\n<li>E verifique a sa\u00fade do banco regularmente, pelo menos a cada tr\u00eas meses, manualmente ou com o Postgres-checkup. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8d2ac05f44bd245b879799862ce9e233.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perguntas<\/p>\n<p><\/p>\n<p><em>Muito obrigado! \u00c9 uma coisa muito interessante.<\/em> <\/p>\n<p><\/p>\n<p>Duas coisas.<\/p>\n<p><\/p>\n<p><em>Sim, duas coisas. S\u00f3 que eu n\u00e3o entendi completamente. Quando trabalhamos com a Nancy, s\u00f3 podemos ajustar um par\u00e2metro ou um grupo inteiro?<\/em><\/p>\n<p><\/p>\n<p>Temos o par\u00e2metro delta-config. Voc\u00ea pode ajustar quantos quiser de uma vez. Mas \u00e9 preciso entender que, ao mudar muita coisa, voc\u00ea pode tirar conclus\u00f5es erradas. <\/p>\n<p><\/p>\n<p><em>Sim. Por que eu perguntei? Porque \u00e9 dif\u00edcil fazer experimentos quando voc\u00ea apenas tem um par\u00e2metro. Voc\u00ea ajusta ele, v\u00ea como funciona, ajusta e depois come\u00e7a com o pr\u00f3ximo.<\/em><\/p>\n<p><\/p>\n<p>\u00c9 poss\u00edvel ajustar v\u00e1rios ao mesmo tempo, mas depende da situa\u00e7\u00e3o, claro. Mas \u00e9 melhor testar uma ideia de cada vez. Ontem tivemos uma ideia. Tivemos uma situa\u00e7\u00e3o muito semelhante. Havia duas configura\u00e7\u00f5es e n\u00e3o conseguimos entender por que a diferen\u00e7a era t\u00e3o grande. E surgiu a ideia de usar a dicotomia para entender e descobrir a diferen\u00e7a. Voc\u00ea pode fazer metade dos par\u00e2metros iguais, depois um quarto, e assim por diante. Tudo \u00e9 flex\u00edvel.<\/p>\n<p><\/p>\n<p><em>E tamb\u00e9m tenho uma pergunta. O projeto \u00e9 jovem e est\u00e1 se desenvolvendo. A documenta\u00e7\u00e3o j\u00e1 est\u00e1 pronta, existe uma descri\u00e7\u00e3o detalhada?<\/em><\/p>\n<p><\/p>\n<p>Eu fiz um link especial para a descri\u00e7\u00e3o dos par\u00e2metros. Isso existe. Mas ainda falta muita coisa. Estou em busca de pessoas com a mesma mentalidade. E eu as encontro quando me apresento. \u00c9 muito legal. Algu\u00e9m j\u00e1 est\u00e1 trabalhando comigo, algu\u00e9m ajudou e fez algo. E se voc\u00ea est\u00e1 interessado nesse tema, d\u00ea um retorno \u2013 o que falta. <\/p>\n<p><\/p>\n<p><em>Assim que fizermos o laborat\u00f3rio, pode ser que haja um retorno. Vamos ver. Obrigado!<\/em><\/p>\n<p><\/p>\n<p><em>Ol\u00e1! Obrigado pela apresenta\u00e7\u00e3o! Eu vi que h\u00e1 suporte para a Amazon. Est\u00e1 prevista a inclus\u00e3o do suporte para o GSP?<\/em><\/p>\n<p><\/p>\n<p>Boa pergunta. Come\u00e7amos a fazer. E por enquanto est\u00e1 parado, porque queremos economizar. Ou seja, h\u00e1 suporte usando run on localhost. Voc\u00ea pode criar uma inst\u00e2ncia e trabalhar localmente. A prop\u00f3sito, \u00e9 assim que fazemos. No Getlab, eu fa\u00e7o assim, l\u00e1 no GSP. Mas fazer exatamente essa orquestra\u00e7\u00e3o ainda n\u00e3o vemos sentido, porque o Google n\u00e3o tem spots baratos. H\u00e1 inst\u00e2ncias ???, mas elas t\u00eam limita\u00e7\u00f5es. Primeiro, sempre t\u00eam apenas um desconto de 70% e n\u00e3o podemos brincar com o pre\u00e7o. Estendemos os spots em 5-10% no pre\u00e7o para diminuir a probabilidade de sermos derrubados. Ou seja, voc\u00ea economiza com os spots, mas eles podem ser retirados a qualquer momento. Se voc\u00ea definir um pre\u00e7o um pouco mais alto do que os outros, voc\u00ea ser\u00e1 derrubado mais tarde. O Google tem uma din\u00e2mica totalmente diferente. E ainda h\u00e1 uma limita\u00e7\u00e3o muito ruim \u2013 elas vivem apenas 24 horas. E \u00e0s vezes queremos rodar um experimento por 5 dias. Mas isso \u00e9 poss\u00edvel com os spots, eles \u00e0s vezes vivem por meses. <\/p>\n<p><\/p>\n<p><em>Ol\u00e1! Obrigado pela apresenta\u00e7\u00e3o! Voc\u00ea mencionou o checkup. Como voc\u00ea calcula os erros de stat_statements?<\/em><\/p>\n<p><\/p>\n<p>Uma pergunta muito boa. Posso mostrar e explicar em detalhes. Em resumo, observamos como o conjunto de grupos de consultas mudou: quantas falharam e quantas novas apareceram. E a\u00ed olhamos duas m\u00e9tricas: total_time e calls, ent\u00e3o h\u00e1 dois erros. E analisamos qual a contribui\u00e7\u00e3o dos grupos que mudaram. H\u00e1 dois subgrupos: o que saiu e o que entrou. Analisamos qual a contribui\u00e7\u00e3o deles para o todo. <\/p>\n<p><\/p>\n<p><em>E voc\u00ea n\u00e3o tem medo de que ele possa ser processado duas ou tr\u00eas vezes entre os snapshots?<\/em><\/p>\n<p><\/p>\n<p>Ou seja, eles se registraram novamente ou como?<\/p>\n<p><\/p>\n<p><em>Por exemplo, essa consulta j\u00e1 foi expulsa uma vez, depois voltou e foi expulsa novamente, depois voltou outra vez e foi expulsa de novo. E voc\u00ea fez alguma contagem, e onde est\u00e1 tudo isso?<\/em><\/p>\n<p><\/p>\n<p>Boa pergunta, precisamos analisar. <\/p>\n<p><\/p>\n<p><em>Eu fiz algo parecido. Com certeza foi mais simples, eu fiz sozinho. Mas tive que reiniciar, fazer reset stat_statements e me orientar no momento do snapshot, garantindo que estivesse abaixo de uma certa fra\u00e7\u00e3o para n\u00e3o ter chegado ao teto do quanto stat_statements pode acumular. E eu me baseio no fato de que, provavelmente, nada foi expulso.<\/em> <\/p>\n<p><\/p>\n<p>Sim, sim. <\/p>\n<p><\/p>\n<p><em>Mas n\u00e3o consigo entender como fazer isso de forma confi\u00e1vel de outra maneira.<\/em><\/p>\n<p><\/p>\n<p>Infelizmente, n\u00e3o me lembro exatamente \u2013 usamos o texto da consulta ou queryid do pg_stat_statements e nos baseamos nisso. Se nos baseamos no queryid, ent\u00e3o, idealmente, estamos comparando coisas compar\u00e1veis. <\/p>\n<p><\/p>\n<p><em>N\u00e3o, ele pode ser substitu\u00eddo v\u00e1rias vezes entre os snapshots e retornar novamente.<\/em><\/p>\n<p><\/p>\n<p>Com este mesmo id?<\/p>\n<p><\/p>\n<p><em>Sim.<\/em> <\/p>\n<p><\/p>\n<p>Vamos estudar isso. Boa pergunta. Precisamos analisar. Mas por enquanto o que vemos \u00e9 que temos 0 escrito...<\/p>\n<p><\/p>\n<p><em>Isso, claro, \u00e9 um caso raro, mas fiquei chocado quando descobri que stat_statements pode ser substitu\u00eddo.<\/em> <\/p>\n<p><\/p>\n<p>No Pg_stat_statements pode haver muita coisa. J\u00e1 nos deparamos com o fato de que se voc\u00ea tiver track_utility = on, seus conjuntos tamb\u00e9m s\u00e3o rastreados. <\/p>\n<p><\/p>\n<p><em>Sim, claro.<\/em><\/p>\n<p><\/p>\n<p>E se voc\u00ea tiver Java Hibernate, que \u00e9 aleat\u00f3rio, come\u00e7a a haver bloqueios na tabela hash. E assim que voc\u00ea desativa um aplicativo muito carregado, voc\u00ea fica com 50-100 grupos. E tudo fica mais ou menos est\u00e1vel. Uma das formas de lidar com isso \u00e9 aumentar pg_stat_statements.max. <\/p>\n<p><\/p>\n<p><em>Sim, mas \u00e9 necess\u00e1rio saber quanto. E \u00e9 preciso monitor\u00e1-lo. Eu fa\u00e7o isso. Ou seja, tenho pg_stat_statements.max. E vejo que no momento do snapshot n\u00e3o cheguei a 70%. Bem, isso significa que n\u00e3o perdemos nada. Fazemos um reset. E acumulamos novamente. Se no pr\u00f3ximo snapshot estiver abaixo de 70, significa que provavelmente n\u00e3o perdemos nada novamente.<\/em><\/p>\n<p><\/p>\n<p>Sim. O padr\u00e3o atualmente \u00e9 5.000. E muitos acham isso suficiente. <\/p>\n<p><\/p>\n<p><em>Normalmente \u2013 sim.<\/em> <\/p>\n<p><\/p>\n<p>V\u00eddeo:<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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. Adiciono que se houver dados confidenciais no Postgres que n\u00e3o podem ir para o ambiente de teste, voc\u00ea pode utilizar <noindex><a rel=\"nofollow\" href=\"https:\/\/labs.dalibo.com\/postgresql_anonymizer\">PostgreSQL Anonymizer<\/a><\/noindex>. O esquema \u00e9 mais ou menos o seguinte:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.&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 5.0.3 - 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\/pt\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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 Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados.\" Nikolai Samokhvalov | ProHoster","description":"Sugiro que voc\u00ea leia a transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Nikolai Samokhvalov \"Abordagem industrial para a otimiza\u00e7\u00e3o do PostgreSQL: experi\u00eancias com bancos de dados\" Shared_buffers = 25% \u2013 \u00e9 muito ou pouco?","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/78742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=78742"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/78742\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/78743"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=78742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=78742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=78742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}