PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como comparar o desempenho do PostgreSQL


A finalidade do benchmarking de um banco de dados não é apenas verificar a capacidade do banco de dados, mas também o comportamento de um banco de dados específico em relação ao seu aplicativo. Hardwares diferentes fornecem resultados diferentes com base no plano de benchmarking que você definiu. É muito importante isolar o servidor (o que está sendo comparado) de outros elementos, como os servidores que conduzem a carga ou os servidores usados ​​para coletar e armazenar métricas de desempenho. Como parte do exercício de benchmarking, você deve obter as características do aplicativo como a) O aplicativo é de leitura ou gravação intensiva? ou b) qual é a divisão de leitura/gravação (por exemplo, 80:20)? ou c) Qual é o tamanho do conjunto de dados?, os dados e a estrutura são representativos do banco de dados de produção real, etc.

PostgreSQL é o banco de dados de código aberto mais avançado do mundo. Se algum cliente de RDBMS corporativo deseja migrar seu banco de dados para código aberto, o PostgreSQL seria a primeira opção a ser avaliada.

Este post abrange o seguinte:
  • Como comparar o PostgreSQL
  • Quais são os principais fatores de desempenho no PostgreSQL
  • Quais são as alavancas que você pode usar para aumentar o desempenho
  • Quais são as armadilhas de desempenho a serem evitadas
  • Quais são os erros comuns que as pessoas cometem?
  • Como você sabe se o seu sistema está funcionando? Quais ferramentas você pode usar?

Como comparar o PostgreSQL


A ferramenta padrão para benchmark do PostgreSQL é o pgbench. Por padrão, os testes do pgbench são baseados no TPC-B. Envolve 5 comandos SELECT, INSERT e UPDATE por transação. No entanto, dependendo do comportamento do seu aplicativo, você pode escrever seus próprios arquivos de script. Vejamos o padrão e alguns resultados de teste orientados a script. Vamos usar a versão mais recente do PostgreSQL para esses testes, que é o PostgreSQL 10 no momento da redação deste artigo. Você pode instalá-lo usando o ClusterControl ou seguindo as instruções aqui:https://www.openscg.com/bigsql/package-manager/.

Especificações da máquina


Versão:RHEL 6 - 64 bits
Memória:4GB
Processadores:4
Armazenamento:50G
Versão PostgreSQL:10.0
Tamanho do banco de dados:15G

Antes de executar o benchmarking com a ferramenta pgbench, você precisaria inicializá-lo abaixo do comando:
-bash-4.1$ ./pgbench -i -p 5432 -d postgres
NOTICE:  table "pgbench_history" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_branches" does not exist, skipping
creating tables…
100000 of 100000 tuples (100%) done (elapsed 0.18 s, remaining 0.00 s)
Vacuum…
set primary keys…
done.

Conforme mostrado nas mensagens AVISO, ele cria as tabelas pgbench_history, pgbench_tellers, pgbench_accounts e pgbench_branches para executar as transações para benchmarking.

Aqui está um teste simples com 10 clientes:
-bash-4.1$ ./pgbench -c 10
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 100/100
latency average = 13.516 ms
tps = 739.865020 (including connections establishing)
tps = 760.775629 (excluding connections establishing)

Como você vê, ele funcionou com 10 clientes e 10 transações por cliente. Ele lhe deu 739 transações/s. Ele lhe deu 739 transações/s. Se você quiser executá-lo por um período específico de tempo, você pode usar a opção "-T". Em geral, uma corrida de 15 minutos ou 30 minutos é suficiente.

A partir de agora, falamos sobre como executar o pgbench, mas não sobre quais deveriam ser as opções. Antes de iniciar o benchmarking, você deve obter os detalhes adequados da equipe de aplicativos sobre:
  • Que tipo de carga de trabalho?
  • Quantas sessões simultâneas?
  • Qual ​​é o conjunto médio de resultados de consultas?
  • Quais são os tps (transação por segundo) esperados?

Aqui está um exemplo para cargas de trabalho somente leitura. Você pode usar a opção "-S" para usar apenas SELECTs que se enquadram em somente leitura. Observe que -n é pular a limpeza das tabelas.
-bash-4.1$ ./pgbench -c 100 -T 300 -S -n
transaction type: <builtin: select only>
scaling factor: 1000
query mode: simple
number of clients: 100
number of threads: 1
duration: 300 s
number of transactions actually processed: 15741
latency average = 1916.650 ms
tps = 52.174363 (including connections establishing)
tps = 52.174913 (excluding connections establishing)
-bash-4.1$

A latência aqui é o tempo médio de transação decorrido de cada instrução executada por cada cliente. Dá 52 tps com o hardware fornecido. Como este benchmark é para um ambiente somente leitura, vamos tentar ajustar os parâmetros shared_buffers e Effective_cache_size no arquivo postgresql.conf e verificar a contagem de tps. Eles estão nos valores padrão no teste acima, tente aumentar os valores e verifique os resultados.
-bash-4.1$ ./pgbench -c 100 -T 300 -S -n
transaction type: <builtin: select only>
scaling factor: 1000
query mode: simple
number of clients: 100
number of threads: 1
duration: 300 s
number of transactions actually processed: 15215
latency average = 1984.255 ms
tps = 68.396758 (including connections establishing)
tps = 68.397322 (excluding connections establishing)

Alterar os parâmetros melhorou o desempenho em 30%.

O pgbench normalmente executa transações em suas próprias tabelas. Se você tiver uma carga de trabalho de 50% de leituras e 50% de gravações (ou um ambiente 60:40), poderá criar um arquivo de script com um conjunto de instruções para atingir a carga de trabalho esperada.
-bash-4.1$ cat /tmp/bench.sql 
INSERT INTO test_bench VALUES(1,'test');
INSERT INTO test_bench VALUES(1,'test');
SELECT * FROM test_bench WHERE id=1;
SELECT * FROM test_bench WHERE id=2;
-bash-4.1$ ./pgbench -c 100 -T 300 -S -n -f /tmp/bench.sql 
transaction type: multiple scripts
scaling factor: 1000
query mode: simple
number of clients: 100
number of threads: 1
duration: 300 s
number of transactions actually processed: 25436
latency average = 1183.093 ms
tps = 84.524217 (including connections establishing)
tps = 84.525206 (excluding connections establishing)
SQL script 1: <builtin: select only>
 - weight: 1 (targets 50.0% of total)
 - 12707 transactions (50.0% of total, tps = 42.225555)
 - latency average = 914.240 ms
 - latency stddev = 558.013 ms
SQL script 2: /tmp/bench.sql
 - weight: 1 (targets 50.0% of total)
 - 12729 transactions (50.0% of total, tps = 42.298662)
 - latency average = 1446.721 ms
 - latency stddev = 765.933 ms
Baixe o whitepaper hoje PostgreSQL Management &Automation with ClusterControlSaiba o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o PostgreSQLBaixe o whitepaper

Quais são os principais fatores de desempenho no PostgreSQL


Se considerarmos um ambiente de produção real, ele é consolidado com diferentes componentes no nível do aplicativo, hardware como CPU e memória e o sistema operacional subjacente. Instalamos o PostgreSQL em cima do sistema operacional para se comunicar com outros componentes do ambiente de produção. Cada ambiente é diferente e o desempenho geral será prejudicado se não estiver configurado corretamente. No PostgreSQL, algumas consultas são mais rápidas e outras mais lentas, porém isso depende da configuração que foi feita. O objetivo da otimização do desempenho do banco de dados é maximizar a taxa de transferência do banco de dados e minimizar as conexões para obter a maior taxa de transferência possível. Abaixo estão alguns fatores-chave de desempenho que afetam o banco de dados:
  • Carga de trabalho
  • Recurso
  • Otimização
  • Contenção

A carga de trabalho consiste em trabalhos em lote, consultas dinâmicas para transações online, consultas de análise de dados que são usadas para gerar relatórios. A carga de trabalho pode ser diferente durante o período do dia, semana ou mês, e depende das aplicações. A otimização de cada banco de dados é única. Pode ser configuração em nível de banco de dados ou otimização em nível de consulta. Abordaremos mais sobre otimização em outras seções da postagem. Contenção é a condição em que dois ou mais componentes da carga de trabalho estão tentando usar um único recurso de maneira conflitante. À medida que a contenção aumenta, o rendimento diminui.

O que são dicas e práticas recomendadas


Aqui estão algumas dicas e práticas recomendadas que você pode seguir para evitar problemas de desempenho:
  • Você pode considerar a execução de atividades de manutenção como VACUUM e ANALYZE após uma grande modificação em seu banco de dados. Isso ajuda o planejador a criar o melhor plano para executar as consultas.
  • Procure qualquer necessidade de indexar tabelas. Isso torna as consultas muito mais rápidas, em vez de ter que fazer verificações de tabela completas.
  • Para tornar uma travessia de índice muito mais rápida, você pode usar os comandos CREATE TABLE AS ou CLUSTER para agrupar linhas com valores de chave semelhantes.
  • Quando você encontrar um problema de desempenho, use o comando EXPLAIN para ver o plano de como o otimizador decidiu executar sua consulta.
  • Você pode tentar alterar os planos influenciando o otimizador modificando os operadores de consulta. Por exemplo, se você vir uma verificação sequencial para sua consulta, poderá desabilitar a verificação seq usando "SET ENABLE_SEQSCAN TO OFF". Não há garantia de que o otimizador não escolheria esse operador se você desativá-lo. O otimizador apenas considera o operador muito mais caro. Mais detalhes estão aqui:https://www.postgresql.org/docs/current/static/runtime-config-query.html
  • Você também pode tentar alterar os parâmetros de custos como CPU_OPERATOR_COST, CPU_INDEX_TUPLE_COST, CPU_TUPLE_COST, RANDOM_PAGE_COST e EFFECTIVE_CACHE_SIZE para influenciar o otimizador. Mais detalhes estão aqui:https://www.postgresql.org/docs/current/static/runtime-config-query.html#RUNTIME-CONFIG-QUERY-CONSTANTS
  • Sempre filtre os dados no servidor e não no aplicativo cliente. Isso minimizará o tráfego de rede e proporcionará melhor desempenho.
  • Para realizar operações comuns, é sempre recomendável usar procedimentos do lado do servidor (gatilhos e funções). Os acionadores ou funções do lado do servidor são analisados, planejados e otimizados na primeira vez que são usados, não sempre.

Quais são os erros comuns que as pessoas cometem


Um dos erros comuns que as pessoas cometem é executar o servidor de banco de dados e o banco de dados com parâmetros padrão. A configuração padrão do PostgreSQL é testada em poucos ambientes, porém nem todos os aplicativos achariam esses valores ideais. Portanto, você precisa entender o comportamento do seu aplicativo e, com base nele, definir seus parâmetros de configuração. Você pode usar a ferramenta pgTune para obter valores para seus parâmetros com base no hardware que está usando. Você pode dar uma olhada em:http://pgtune.leopard.in.ua/. No entanto, lembre-se de que você terá que testar seu aplicativo com as alterações que fizer, para ver se há alguma degradação de desempenho com as alterações.

Outra coisa a considerar seria a indexação do banco de dados. Os índices ajudam a buscar os dados mais rapidamente, porém mais índices criam problemas com o carregamento dos dados. Portanto, sempre verifique se há índices não utilizados no banco de dados e elimine-os para reduzir a manutenção desses índices e melhorar o carregamento de dados.