Postgresql

使用帶有 pg_restore 的並行恢復沒有加速

  • February 17, 2022

我需要一個像 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 &代替,跳過轉儲和重新載入步驟。)

引用自:https://dba.stackexchange.com/questions/307643