O PostgreSQL inclui o pgbench, uma ferramenta leve de teste de estresse para execução de benchmarks no PolarDB for PostgreSQL (Compatible with Oracle). Essa ferramenta executa repetidamente os mesmos comandos SQL em sessões simultâneas de banco de dados. Este tópico descreve como usar o pgbench para testar o desempenho máximo de um cluster PolarDB for PostgreSQL (Compatible with Oracle).
Ambiente de testes
Todos os testes foram executados na região China (Qingdao). O cluster PolarDB e a instância ECS estavam na mesma zona.
Tipo de instância ECS: ecs.g5.16xlarge (64 núcleos, 256 GiB).
Especificações de armazenamento da ECS: disco local SSD de 200 GiB.
Tipo de rede: Virtual Private Cloud (VPC). O cluster PolarDB e a instância ECS estavam na mesma VPC.
Sistema operacional: CentOS 7.6 x64.
Nós do cluster PolarDB: um nó primário e um nó somente leitura.
O CentOS 6 não oferece suporte ao PostgreSQL 11.
Métricas de teste
-
Consultas por segundo (QPS) somente leitura
Número de instruções SQL somente leitura (apenas SELECT) executadas por segundo.
-
QPS de leitura e gravação
Número de instruções SQL de leitura e gravação (INSERT, SELECT e UPDATE) executadas por segundo.
Preparações
-
Instale a ferramenta de teste
Execute os comandos a seguir para instalar o PostgreSQL 11 na instância ECS.
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum install -y postgresql11 -
Modifique os parâmetros do cluster
Os parâmetros do cluster
PolarDB
devem ser modificados da seguinte forma:
log_statement = 'none' enable_hashjoin=off enable_mergejoin=off enable_bitmapscan=offNotaAtualmente, apenas o parâmetro
log_statement
pode ser modificado no console. Para obter mais informações sobre como definir parâmetros de cluster, consulte
.
Após modificar os parâmetros de configuração, reinicie o cluster para que as alterações entrem em vigor.
Método de teste
-
Execute os comandos a seguir para configurar as variáveis de ambiente:
export PGHOST=<Private endpoint of the PolarDB cluster> export PGPORT=<Private port of the PolarDB cluster> export PGDATABASE=postgres export PGUSER=<Username for the PolarDB database> export PGPASSWORD=<Password for the PolarDB user>NotaPara obter mais informações sobre como visualizar o endpoint de um cluster
PolarDB for PostgreSQL (Compatible with Oracle)
, consulte
.
-
Inicialize os dados de teste conforme o tamanho do banco de dados de destino. Utilize os seguintes comandos:
-
Inicialize 1 bilhão de entradas de dados:
/usr/pgsql-11/bin/pgbench -i -s 10000 -
Inicialize 500 milhões de entradas de dados:
/usr/pgsql-11/bin/pgbench -i -s 5000 -
Inicialize 100 milhões de entradas de dados:
/usr/pgsql-11/bin/pgbench -i -s 1000
-
-
Crie scripts de teste somente leitura e de leitura/gravação.
-
Crie o script somente leitura ro.sql:
Execute o comando
vim ro.sql.Pressione a tecla I para entrar no modo de edição.
-
Insira o seguinte conteúdo:
\set aid random_gaussian(1, :range, 10.0) SELECT abalance FROM pgbench_accounts WHERE aid = :aid; Pressione a tecla Esc para sair do modo de edição e insira
:wqpara salvar e sair.
-
Crie o script de leitura/gravação rw.sql:
Execute o comando
vim rw.sql.Pressione a tecla I para entrar no modo de edição.
-
Insira o seguinte conteúdo:
\set aid random_gaussian(1, :range, 10.0) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) 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; Pressione a tecla Esc para sair do modo de edição e insira
:wqpara salvar e sair.
-
-
Execute os comandos a seguir para realizar os testes:
-
Teste somente leitura:
88-core 710 GB (polar.o.x8.12xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=1000000000 64-core 512 GB (polar.o.x8.8xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=1000000000 32-core 256 GB (polar.o.x8.4xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 16-core 128 GB (polar.o.x8.2xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8-core 64 GB (polar.o.x8.xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=1000000000 8-core 32 GB (polar.o.x4.xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=1000000000 4-core 16 GB (polar.o.x4.large) Total data volume: 500 million, Hot data: 50 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=5000 -D range=50000000 Total data volume: 500 million, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=5000 -D range=100000000 2-core 4 GB (polar.o.x4.medium) Total data volume: 100 million, Hot data: 50 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 32 -T 120 -D scale=1000 -D range=50000000 Total data volume: 100 million, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 32 -T 120 -D scale=1000 -D range=100000000 -
Teste de leitura/gravação:
88-core 710 GB (polar.o.x8.12xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=1000000000 64-core 512 GB (polar.o.x8.8xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=1000000000 32-core 256 GB (polar.o.x8.4xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 16-core 128 GB (polar.o.x8.2xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8-core 64 GB (polar.o.x8.xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8-core 32 GB (polar.o.x4.xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000 4-core 16 GB (polar.o.x4.large) Total data volume: 500 million, Hot data: 50 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=50000000 Total data volume: 500 million, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000 2-core 8 GB (polar.o.x4.medium) Total data volume: 100 million, Hot data: 50 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000 Total data volume: 100 million, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=100000000
Notascale: valor multiplicado por 100.000 para representar o volume de dados de teste.
range: volume de dados ativos.
-c: número de conexões de teste simultâneas. Esse valor não representa o limite máximo de conexões do tipo de instância. Para obter mais informações sobre o limite de conexões, consulte Compute node specifications.
-
Resultados dos testes
| Especificações | Volume de dados de teste | Volume de dados quentes (ativos) | QPS somente leitura | QPS de leitura/gravação |
polar.o.x8.12xlarge 88 núcleos, 710 GB | 1 bilhão | 100 milhões | 630650,40 | 263746,37 |
| 500 milhões | 601262,24 | 247352,76 | ||
| 1 bilhão | 589405,79 | 218788,92 | ||
polar.o.x8.8xlarge 64 núcleos, 512 GB | 1 bilhão | 100 milhões | 592064,65 | 227352,23 |
| 500 milhões | 554777,11 | 213343,13 | ||
| 1 bilhão | 508404,07 | 203331,35 | ||
polar.o.x8.4xlarge 32 núcleos, 256 GB | 1 bilhão | 100 milhões | 522182,92 | 213212,34 |
| 500 milhões | 509372,85 | 203322,34 | ||
| 1 bilhão | 489349,72 | 198531,37 | ||
polar.o.x8.2xlarge 16 núcleos, 128 GB | 1 bilhão | 100 milhões | 263893,72 | 152863,27 |
| 500 milhões | 250221,62 | 129238,26 | ||
| 1 bilhão | 239832,62 | 106212,82 | ||
polar.o.x8.xlarge 8 núcleos, 64 GB | 1 bilhão | 100 milhões | 142836,56 | 69725,29 |
| 500 milhões | 133931,69 | 55927,65 | ||
| 1 bilhão | 124151,02 | 50786,21 | ||
polar.o.x4.xlarge 8 núcleos, 32 GB | 1 bilhão | 100 milhões | 126748,07 | 59738,33 |
| 500 milhões | 113432,32 | 48372,25 | ||
| 1 bilhão | 104232,84 | 49763,64 | ||
polar.o.x4.large 4 núcleos, 16 GB | 500 milhões | 50 milhões | 76238,89 | 47388,27 |
| 100 milhões | 69892,83 | 43638,85 | ||
polar.o.x4.medium 2 núcleos, 8 GB | 100 milhões | 50 milhões | 28320,70 | 18152,63 |
| 100 milhões | 30792,19 | 19111,15 |
Especificações: código do tipo de instância do PolarDB for PostgreSQL (Compatible with Oracle).
Volume de dados de teste: número de registros nesta rodada de testes.
Volume de dados quentes (ativos): número de registros utilizados pelas instruções SQL de consulta e atualização nesta rodada de testes.
QPS somente leitura: número de consultas somente leitura executadas por segundo.
QPS de leitura/gravação: número de consultas de leitura e gravação executadas por segundo.







