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 teste pgbench -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 postgres exit
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