Quanto seu PostgreSQL aguenta? Benchmarks no PostgreSQL!

Com pgbench você pode rodar benchmarks no seu PostgreSQL e descobrir quanto ele aguenta.

Você pode usar o benchmark padrão do pgbench ou você pode criar seu próprio script.

O comando pgbench recebe alguns parâmetros, são eles:

# Parâmetros de inicialização-i para criar as tabelas para rodar o teste padrão de benchmark do pgbench# Parâmetros de configuração do servidor-h endereço ip ou dns do banco postgresql-p porta do banco postgresql-U username# Parâmetros de execução do benchmark-d imprime o debug na tela-c número de clientes que se conectarão (padrão 1)-C cria uma conexão nova a cada transação (para testar o overhead de conexões)-j número de threads, coloque para o número de CPUs disponíveis na sua máquina-M protocolo usado para enviar queries ao servidor (simple, extended, prepared)-n não executa vacuum antes do teste começar-v realiza vacuum nas tabelas pgbench_tellers, pgbench_branches e truncate na pgbench_history--random-seed define uma semente para gerar os números randômicos# Sobre a quantidade de vezes e até quando o benchmark será rodado-R executa as transações para um limite de até x por segundo ao invés de quantas transações puder (padrão)-t define o número de transações que cada cliente executa-T roda o benchmark durante x segundos# Sobre estatísticas do benchmark gerado-l Escreve dados estatísticos de cada transação em um arquivo de log-L transações que demorarem mais de x millisegundos são contadas e reportadas separadamente--aggregate-interval de quantos em quantos segundos um relatório estatístico é gerado--log-prefix para definir o nome do arquivo de log do pgbench (padrão é pgbench_log)-P cria um relatorio a cada x segundos com latência média e desvio padrão.--progress-timestamp ao usar o -P, utiliza unix timestamp ao invés do número de segundos decorridos--sampling-rate usado ao escrever o log, para reduzir o número de logs gerados. Se essa opção é chamada, apenas um pedaço das transações são logadas, 1.0 = 100%, 0.05 = 5% (ou seja, apenas 5% das transações serão logadas)# Parâmetros para escolher parâmetros dos benchmark padrão-b permite escolher qual script de benchmark será rodado (tpcb-like, simple-update, select-only)-N não executa updates no benchmark -S executa apenas selects no benchmark# Parâmetros para usar em um benchmark customizado-f permite rodar um script .sql ao invés dos benchmarks padrão-D escreve define uma variavel a ser usada por um script customizado

Para usar o benchmark padrão, você precisa criar as tabelas necessárias para o teste rodando o comando:

pgbench -i -h localhost -p 5432 -U postgres -d postgres

Para rodar o benchmark, execute:

pgbench -c 100 -T 300 -S -n -h localhost -p 5432 -U postgres -d postgres

BEGIN;UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;SELECT abalance FROM pgbench_accounts WHERE aid = :aid;UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);END;

Ou você pode criar seu próprio script.

Testando Escrita

# -c número de clientes conectados# -j número de threads a ser utilizadas (é bom colocar o número de cores do seu CPU)# -T número de segundos em que o pgbench ficará executando# -t número de transações a serem executadas (é o número de vezes que os inserts/updates/selects serão executados)# O -T e -t são mutuamente exclusivos, se há um não pode haver o outro# -n não executa vacuum nas tabelas antes de rodar o testepgbench -c 4 -j 2 -T 600 -N bench2

Testando timeseries no PostgreSQL

Criando a tabela

CREATE TABLE "sensor_1"("time" TIMESTAMPTZ PRIMARY KEY DEFAULT now(),"value" NUMERIC NOT NULL DEFAULT (random() * 100));CREATE INDEX "sensor_1_index" ON "sensor_1"("time" DESC);

Arquivo que será executado várias vezes. Crie ele e salve como query.sql

INSERT INTO "sensor_1"DEFAULT VALUES;

Execute o pgbench

pgbench -c 1 -T 60 -f query.sql

Salvando scripts em texto

script benchmark.txtpgbench -c 1 -T 60 -P 10 -f query.sql -h localhost -p 5432 -U postgresexit

Referências

SeveralNines - Tutorial PGBench
https://severalnines.com/blog/benchmarking-postgresql-performance

Wiki Postgresql - Pgbench
https://wiki.postgresql.org/wiki/Pgbenchtesting

PostgreSQL Docs - Pgbench
https://www.postgresql.org/docs/current/pgbench.html

Salvando output do terminal em um arquivo texto
https://unix.stackexchange.com/questions/200637/save-all-the-terminal-output-to-a-file

You should also read:

PostgreSQL

# Instalando o wget para fazer download da chave do repositório # Instalando o wget, capaz de fazer downloads de documentos via HTTP…