Como Fazer Benchmark no PostgreSQL para um Desempenho Ótimo

Conforme a adoção do PostgreSQL cresce, administradores de banco de dados (DBAs) e desenvolvedores frequentemente precisam avaliar seu desempenho para garantir que suas aplicações funcionem de maneira eficiente sob diferentes cargas de trabalho. O benchmarking de desempenho é um processo crítico que mede como o PostgreSQL lida com cargas variadas, ajudando a identificar gargalos e áreas para otimização. Este artigo explora ferramentas, métricas e cenários de teste para ajudar você a fazer benchmarking no PostgreSQL como um profissional.

Por que Fazer Benchmarking no PostgreSQL?

O benchmarking permite que você:

  1. Meça o throughput e a latência do seu banco de dados sob cargas de trabalho específicas.
  2. Identifique gargalos de hardware ou configuração.
  3. Compare o impacto de otimizações como mudanças de índice ou reescrita de consultas.
  4. Simule cenários do mundo real, como alta atividade concurrente de usuários ou escritas em massa de dados.

Métricas Chave a Serem Acompanhadas

Ao fazer benchmarking no PostgreSQL, foque nessas métricas:

  • TPS (Transações Por Segundo): Mede quantas transações o banco de dados completa em um segundo.
  • IOPS (Operações de Entrada/Saída Por Segundo): Rastreia a atividade do disco.
  • Latência: Mede o tempo levado para executar consultas, o que impacta a experiência do usuário.
  • Utilização de Recursos: Rastreia o uso de CPU, memória e disco durante o benchmark.

Ferramentas para Benchmarking no PostgreSQL

1. pgbench

O que é pgbench? 

pgbench é a ferramenta de benchmarking integrada do PostgreSQL. Ela simula clientes concorrentes executando transações e mede o desempenho do banco de dados.

Instalação

Ele vem incluído com as instalações do PostgreSQL. Para verificar, execute:

Shell

 

bash
pgbench --version

Começando

1. Inicialize um banco de dados de benchmark:

Shell

 

bash
pgbench -i -s 50 mydb

Aqui, -s define o fator de escalonamento, que determina o tamanho do conjunto de dados.

2. Execute um benchmark simples:

Shell

 

bash
pgbench -c 10 -j 2 -T 60 mydb

  • -c 10: Número de conexões de clientes.
  • -j 2: Número de threads.
  • -T 60: Duração do benchmark em segundos.

Exemplo de saída:

YAML

 

transaction type: TPC-B (sort of)
scaling factor: 50
number of clients: 10
number of threads: 2
duration: 60 s
tps = 1420.123 (excluding connections establishing)

2. Sysbench

Por que usar Sysbench? 

Sysbench é uma ferramenta de benchmarking versátil para bancos de dados e sistemas. Ela oferece mais flexibilidade que o pgbench para cargas de trabalho personalizadas.

Instalação

Instale o Sysbench usando o seguinte comando:

Shell

 

bash
sudo apt-get install sysbench

Começando

1. Prepare o benchmark:

Shell

 

bash
sysbench --db-driver=pgsql --pgsql-db=mydb \
  --pgsql-user=postgres --tables=10 --table-size=1000000 \
  oltp_read_write prepare

2. Execute o benchmark:

Shell

 

bash
sysbench --db-driver=pgsql --pgsql-db=mydb \
  --pgsql-user=postgres --threads=4 \
  --time=60 oltp_read_write run

3. pg_stat_statements

O que é pg_stat_statements?

Uma extensão do PostgreSQL que rastreia o desempenho e as estatísticas de execução de consultas. Embora não simule cargas de trabalho, ajuda a analisar consultas lentas durante benchmarks.

Configuração

1. Habilite a extensão em postgresql.conf:

Plain Text

 

shared_preload_libraries = 'pg_stat_statements'

2. Recarregue a configuração e crie a extensão:

SQL

 

CREATE EXTENSION pg_stat_statements;

Uso

Execute a seguinte consulta para identificar instruções de longa execução:

SQL

 

SELECT query, total_exec_time, calls
FROM pg_stat_statements
ORDER BY total_exec_time DESC;

Cenários de Benchmarking

Abaixo está uma representação visual dos resultados do benchmark para três cenários: carga de leitura intensiva, carga de escrita intensiva e cargas de trabalho mistas. O diagrama de transações por segundo (TPS) demonstra a capacidade do PostgreSQL de lidar com transações concorrentes de forma eficiente, enquanto o diagrama de latência ilustra o tempo taken para a execução de consultas em milissegundos.

Transações do PostgreSQL Por Segundo (TPS)

Latência de Consultas do PostgreSQL

Tipos de Cargas de Trabalho

1. Cargas de Trabalho de Leitura Intensiva

Objetivo: Testar o desempenho do banco de dados sob alta atividade de leitura.

Configuração: Use pgbenchcom transações apenas de leitura padrão:

Shell

 

bash
pgbench -c 50 -T 120 -S mydb

  • -S: Execute apenas consultas SELECT.
  • -c 50: Simule 50 clientes concorrentes.

2. Cargas de Trabalho de Escrita Intensiva

Objetivo: Medir o desempenho do banco de dados com inserções ou atualizações frequentes.

Configuração: Modifique o benchmark para incluir escritas:

Shell

 

bash
pgbench -c 20 -j 4 -T 120 -N mydb

  • -N: Execute non-SELECT queries.

3. Cargas de Trabalho Mistas de Leitura/Escrita

Objetivo: Simular uma carga de trabalho do mundo real que mistura leituras e escritas.

Configuração: Use uma configuração balanceada:

Shell

 

bash
pgbench -c 30 -j 4 -T 180 mydb

Optimizando PostgreSQL para Melhores Resultados no Benchmark

Ajustar Configurações de Memória

Ajuste esses parâmetros no postgresql.conf:

Plain Text

 

shared_buffers = 25% of system memory
work_mem = 4MB
maintenance_work_mem = 64MB

Habilitar Execução Paralela de Consultas

Ajuste esses parâmetros no postgresql.conf:

Plain Text

 

max_parallel_workers_per_gather = 4

Optimizar E/S de Disco

Use SSDs para arquivos WAL e ajuste essas configurações:

Plain Text

 

wal_buffers = 16MB
synchronous_commit = off

Exemplos de Resultados e Interpretação

Cenário: 50 clientes concorrentes executando uma carga de trabalho intensiva em leitura por 60 segundos.

Saída:

Plain Text

 

tps = 2500.456 (excluding connections establishing)

Interpretação: O banco de dados é capaz de lidar com 2500 transações por segundo sob essa carga de trabalho.

Se o TPS for menor do que o esperado, analise os planos de consulta usando EXPLAIN ANALYZE para identificar gargalos de desempenho.

Conclusão

Benchmarking PostgreSQL é uma maneira poderosa de identificar limitações de desempenho e otimizar seu banco de dados para diversos tipos de carga de trabalho. Ferramentas como pgbench e sysbench, combinadas com insights do pg_stat_statements, permitem simular cenários do mundo real e ajustar finamente as configurações do PostgreSQL.

Ao dominar essas ferramentas e técnicas, você pode garantir que sua instância do PostgreSQL ofereça alto desempenho tanto para aplicativos intensivos em leitura quanto para aqueles com alta demanda de escrita.

Source:
https://dzone.com/articles/how-to-benchmark-postgresql-for-optimal-performance