Eu preciso de um grande banco de dados como 10TB-15TB no Postgresql para benchmarking.
Eu criei um banco de dados de amostra menor de ~ 100 GB com pgbench
assim:
pgbench -i -s 7000 --no-vacuum exampledb
No entanto, não observo nenhuma aceleração ao fazer a restauração paralela do custom
formato (criado com pg_dump -F c ...
). Incluindo a restauração do .sql
dump também:
time psql -d pgbench7000 < pgbench7000.sql
SET
SET
SET
SET
SET
set_config
------------
(1 row)
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
COPY 700000000
COPY 7000
COPY 0
COPY 70000
ALTER TABLE
ALTER TABLE
ALTER TABLE
real 32m1.539s
user 3m28.575s
sys 1m40.125s
####################
time pg_restore -d pgbench7000 pgbench7000.custom
real 20m7.504s
user 2m35.556s
sys 0m35.750s
####################
time pg_restore -j 16 -d pgbench7000 pgbench7000.custom
real 20m56.565s
user 2m57.547s
sys 0m40.096s
Eu dei recursos generosos ao servidor Postgresql:
max_connections = 1000
shared_buffers = 94GB # 25% of system's memory
work_mem = 512MB
maintenance_work_mem = 12GB
effective_io_concurrency = 500
max_worker_processes = 50
max_parallel_maintenance_workers = 10
max_parallel_workers_per_gather = 10
max_parallel_workers = 50
A caixa é realmente poderosa, possui 374 GB de RAM, 72 vCPUs e armazenamento NAS rápido montado em NFS (é onde reside o diretório de dados PG).
pgbench
cria um banco de dados bastante simples, existem quatro tabelas e apenas uma tabela é grande e ocupa a maior parte do espaço. Isso pode ser o motivo da falta de aceleração?
Alguém sabe dizer onde está o gargalo? Ou é apenas estrutura db?
Ambiente: Centos 7.9 (é o que tenho que usar), Postgres 11 instalado a partir do repositório do projeto.
A restauração paralela executa diferentes operações em paralelo, mas não paraleliza operações individuais. Como o pgbench é dominado por uma tabela, não há muito que possa ser feito em paralelo no nível do cliente.
Com alguns scripts de shell, você pode executar o pg_restore várias vezes em paralelo, apontando cada um para um nome de banco de dados diferente. (Mas você pode fazer o mesmo script usando
pgbench -i -s 7000 $DBNAME &
, pulando as etapas de despejo e recarregamento.)