Ferramenta de monitoramento de desempenho PostgreSQL
-
09-06-2019 - |
Pergunta
Estou configurando um aplicativo da web com back-end FreeBSD PostgreSQL.Estou procurando alguma ferramenta/técnica de otimização de desempenho de banco de dados.
Solução
pgfouine funciona bastante bem para mim.E parece que há um Porta FreeBSD por isso.
Outras dicas
A otimização do banco de dados geralmente é uma combinação de duas coisas
- Reduza o número de consultas ao banco de dados
- Reduza a quantidade de dados que precisam ser analisados para responder a consultas
A redução da quantidade de consultas geralmente é feita armazenando em cache dados não voláteis/menos importantes (por exemplo,"Quais usuários estão online" ou "Quais são as postagens mais recentes deste usuário?") dentro do aplicativo (se possível) ou em um armazenamento de dados externo - mais eficiente - (memcached, redis, etc.).Se você tiver informações muito difíceis de escrever (por exemplo,contadores de visitas) e não precisa ÁCIDO-semântica, você também pode pensar em movê-lo do banco de dados Postgres para armazenamentos de dados mais eficientes.
Otimizar o tempo de execução da consulta é mais complicado - isso pode significar criar índices especiais (ou índices em primeiro lugar), alterando (possivelmente desnormalizando) o modelo de dados ou alterando a abordagem fundamental que o aplicativo adota quando se trata de trabalhar com o banco de dados.Veja por exemplo o Paginação feita do jeito Postgres falar por Markus Winand sobre como repensar o conceito de paginação para torná-lo mais eficiente no banco de dados
Medindo consultas de maneira lenta
Mas para entender quais consultas devem ser analisadas primeiro você precisa saber com que frequência elas são executadas e quanto tempo duram em média.
Uma abordagem para isso é registrar todas as consultas (ou "lentas"), incluindo seu tempo de execução e, em seguida, analisar o log de consultas.Uma boa ferramenta para isso é pgfouine
que já foi mencionado anteriormente nesta discussão, desde então foi substituído por pgbadger
que é escrito em uma linguagem mais amigável, é muito mais rápido e mantido de forma mais ativa.
Ambos pgfouine
e pgbadger
sofrem com o fato de que eles precisam do log de consultas habilitado, o que pode causar um impacto perceptível no desempenho do banco de dados ou causar problemas de espaço em disco, além do fato de que a análise do log com a ferramenta pode levar algum tempo e não vai fornecer insights atualizados sobre o que está acontecendo no banco de dados.
Acelerando com extensões
Para resolver essas deficiências, existem agora duas extensões que rastreiam o desempenho da consulta diretamente no banco de dados - pg_stat_statements
(que só é útil na versão 9.2 ou mais recente) e pg_stat_plans
.Ambas as extensões oferecem a mesma funcionalidade básica - rastrear a frequência com que uma determinada "consulta normalizada" (string de consulta menos todos os literais de expressão) foi executada e quanto tempo levou no total.Devido ao fato de que isso é feito enquanto a consulta é realmente executada, isso é feito de maneira muito eficiente, a sobrecarga mensurável foi inferior a 5% em benchmarks sintéticos.
Entendendo os dados
A lista de consultas em si é muito "seca" do ponto de vista informativo.Tem havido trabalho em uma terceira extensão tentando resolver esse fato e oferecer uma representação melhor dos dados chamada pg_statsinfo
(juntamente com pg_stats_reporter
), mas é um pouco trabalhoso colocá-lo em funcionamento.
Para oferecer uma solução mais conveniente para este problema comecei a trabalhar em um projeto comercial focado em pg_stat_statements
e pg_stat_plans
e aumenta as informações coletadas por muitos outros dados retirados do banco de dados.É chamado pganalyze
e você pode encontrá-lo em https://pganalyze.com/.
Para oferecer uma visão geral concisa de ferramentas e projetos interessantes na área de monitoramento do Postgres também comecei a compilar uma lista no Wiki do Postgres que é atualizado regularmente.
Eu usei pgtop um pouco.É bastante grosseiro, mas pelo menos posso ver qual consulta está sendo executada para cada ID de processo.
Tentei o pgfouine, mas se bem me lembro, é uma ferramenta offline.
Também sigo o arquivo psql.log e defino os critérios de registro em um nível onde posso ver as consultas problemáticas.
#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
# and their durations, > 0 logs only
# statements running at least this time.
Eu também uso o EMS Postgres Manager para fazer trabalho administrativo geral.Ele não faz nada por você, mas facilita a maioria das tarefas e simplifica a revisão e a configuração do seu esquema.Acho que, ao usar uma GUI, é muito mais fácil detectar inconsistências (como índice ausente, critérios de campo, etc.).É apenas um dos dois programas que estou disposto a usar o VMWare no meu Mac.
Munin é bastante simples, mas eficaz, para obter tendências de evolução e desempenho do banco de dados ao longo do tempo.No kit padrão do Munin você pode, entre outras coisas, monitorar o tamanho do banco de dados, número de bloqueios, número de conexões, varreduras sequenciais, tamanho do log de transações e consultas de longa duração.
Fácil de configurar e começar e, se necessário, você pode escrever seu próprio plugin com bastante facilidade.
Confira os plug-ins postgresql mais recentes fornecidos com Munin aqui:
http://munin-monitoring.org/browser/branches/1.4-stable/plugins/node.d/
Bem, a primeira coisa a fazer é tentar todas as suas consultas do psql usando "explicar" e ver se há varreduras sequenciais que podem ser convertidas em varreduras de índice adicionando índices ou reescrevendo a consulta.
Fora isso, estou tão interessado nas respostas a esta pergunta quanto você.
Confira o Lightning Admin, ele possui uma GUI para capturar instruções de log, não é perfeita, mas funciona muito bem para a maioria das necessidades. http://www.amsoftwaredesign.com
DBTuna http://www.dbtuna.com/postgresql_monitor.php recentemente começou a oferecer suporte ao monitoramento PostgreSQL.Nós o usamos extensivamente para monitoramento do MySQL, portanto, se ele fornecer o mesmo para o Postgres, deverá ser uma boa opção para você também.