使用 pg_restore 的 --jobs 参数没有提高性能

No performance improvement using --jobs parameter for pg_restore

我正在使用 pg_restore to restore the Postgresql database backed up using pg_dump。 (备份和恢复都在 PostgreSQL 12 上进行)。使用自定义格式选项进行备份 --format=custom.

10 GB 备份的还原需要将近 30 分钟。随着备份大小的增加,恢复时间会显着增加。所以我尝试了 --jobs 参数来缩短恢复时间。

根据 documentation,并发连接将用于恢复数据库对象。我验证了 restore 的输出,我可以验证是否有并行线程启动等于 --jobs 参数的值。但是,--jobs 参数的任何值都没有改善恢复时间。

我知道性能取决于硬件基础设施。但是机器有16个vcpus和32GB RAM。

我也尝试按照 blog 中提到的使用以下配置调整 Postgres,但恢复时间仍然没有改善。


    work_mem = 32MB
    shared_buffers = 4GB
    maintenance_work_mem = 2GB
    full_page_writes = off
    autovacuum = off
    wal_buffers = -1

有什么我遗漏的吗?如何缩短恢复时间?

有几件事可能是问题所在:

  • pg_restore 通过 运行 多个 COPYCREATE INDEX 命令并行化。

    现在,如果您的数据库有一个大型 table 和一个大型索引,并行化将无济于事。

  • 也许您的 I/O 系统已达到极限。那么 运行 并行进程不会提高性能。

  • 如果您有很多大对象,这会减慢处理速度,我不确定并行化是否有帮助。

永远不要将 full_page_writesautovacuum 设置为 off,除非您在还原后将它们设置回 on 并准备好将数据库集群转储到坠机事件。我怀疑性能提升是否值得,特别是对于 full_page_writes.

您忘记的一个参数是max_wal_size。如果你提出来,它将有助于写性能。

除此之外,你必须找出瓶颈在哪里才能解决它。

使用其他通常更快的备份方法(例如 pg_basebackup)怎么样?