我需要一个像 Postgresql 中的 10TB-15TB 这样的大型数据库来进行基准测试。
我创建了一个较小的 ~100GB 示例数据库,pgbench
如下所示:
pgbench -i -s 7000 --no-vacuum exampledb
custom
但是,在从格式(使用创建)进行并行恢复时,我观察到没有加速pg_dump -F c ...
。包括从.sql
转储中恢复:
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
我为 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
这个盒子非常强大,它有 374GB 的 RAM、72 个 vCPU 和安装在 NFS 上的快速 NAS 存储(这是 PG 数据目录所在的位置)。
pgbench
创建一个相当简单的数据库,大约有四张表,只有一张表很大,占用了大部分空间。这可能是缺乏加速的原因吗?
谁能告诉瓶颈在哪里?还是只是数据库结构?
环境:Centos 7.9(这是我必须使用的),从项目 repo 安装的 Postgres 11。
并行还原并行执行不同的操作,但不并行化单个操作。由于 pgbench 由一张表主导,因此在客户端级别上没有太多可以并行完成的事情。
使用一些 shell 脚本,您可以并行运行 pg_restore 多次,将每次指向不同的数据库名称。(但是您可以使用相同的脚本来
pgbench -i -s 7000 $DBNAME &
代替,跳过转储和重新加载步骤。)