【问题标题】:Why is pg_restore that slow and PostgreSQL almost not even using the CPU?为什么 pg_restore 这么慢而 PostgreSQL 几乎不使用 CPU?
【发布时间】:2023-01-17 23:22:36
【问题描述】:

我只需要使用 pg_restore 和一个 30MB 的小转储,平均需要 5 分钟!在我同事的电脑上,它非常快,十几秒。两者之间的区别在于 CPU 使用率:而对于其他数据库,数据库在恢复操作期间使用了大量 CPU (60-70%),而在我的机器上,它仅保持在百分之几左右 (0-3%) ) 就好像它根本没有活动一样。

确切的命令是:pg_restore -h 127.0.0.1 --username XXX --dbname test --no-comments test_dump.sql

生成此转储的原始命令是:pg_dump --dbname=XXX --user=XXX --no-owner --no-privileges --verbose --format=custom --file=/sql/test_dump.sql

查看恢复操作中间截取的屏幕截图:

这是运行命令对应的vmstat 1结果:

几个小时以来,我一直在网上寻找解决方案,但这种 CPU 使用不足的情况仍然很神秘。任何想法将不胜感激。

对于堆栈,我在 Ubuntu 20.04 上,postgres 版本 13.6 正在运行到 docker 容器中。我有一个不错的硬件,既不坏也不好。

编辑:这个非常相同的命令过去在我的机器上使用相同的普通硬盘工作,但现在它非常慢。从我的角度来看,我与其他人(对他们来说速度非常快)的唯一区别实际上是 CPU 使用率(即使他们有一个 SSD,这根本不应该是限制因素,尤其是 30 MB 的转储).

编辑 2:对于那些提出问题是关于 IO 限制和可能是慢速磁盘的人,我只是在没有任何信念的情况下尝试在我刚刚创建的 SSD 分区上运行我的命令,但没有任何改变。

【问题讨论】:

  • @LaurenzAlbe 谢谢,完成
  • 转储不是备份,它是一个充满 INSERT 语句的批处理文件。执行 30MB 的 INSERT 语句将受到 IO 吞吐量和延迟的影响。由于您使用容器,IO 会很慢,因为实际的数据库文件在容器内。增加数据库的大小将需要增加容器映像的大小。这将成为;这将是至少比使用物理数据库文件慢两倍
  • @PanagiotisKanavos 谢谢,我没明白你的意思,也许看看编辑,但对我来说,这与计算运行速度太慢以及 CPU 与其他人相比使用不足有关
  • @PanagiotisKanavos。 1) 默认情况下,Postgres 不会受到 INSERTs 的影响,它使用 COPY 来导入数据。您可以强制它使用 INSERTs 和 --inserts--column-inserts,但这不是 eytienne 所做的。 2)根据您指定命令的方式,转储可以包含的不仅仅是数据。 3) 转储可以是整个数据库的时间点备份或使用pg_dumpall整个集群。
  • @PanagiotisKanavos。嗯?你有一个空数据库,你将 pg_dump 文件恢复到它,你最终在 $PGDATA 中得到与 pg_basebackup 相同的东西。我不知道你在说什么数据库文件增加。

标签: postgresql performance cpu-usage postgresql-13


【解决方案1】:

vmstat 输出显示您受 I/O 限制。获得更快的存储,性能也会提高。

【讨论】:

  • 谢谢,我不太相信,所以我进行了编辑来解释它。
  • @eytienne 但你的编辑没有任何意义。相同的脚本在应用于不同的东西时做了不同的事情?所以呢。
  • 那么您对高 iowait% 值的解释是什么?也许磁盘正忙于其他事情。
  • @LaurenzAlbe 也许你应该放弃关于我的第二次编辑的答案......(如果你有其他想法?)
  • vmstat 1在你的快盘上显示什么?
【解决方案2】:

PostgreSQL, by default, is tuned for data durability. Usually transactions are flushed to the disk at each and every commit, forcing write-through of any disk write cache, 所以它似乎非常受 IO 限制。

当从转储文件恢复数据库时,降低这些持久性设置可能是有意义的,特别是如果恢复是在您的应用程序离线时完成的,尤其是在非生产环境中。

我暂时使用这些选项运行postgres-c fsync=off -c synchronous_commit=off -c full_page_writes=off -c checkpoint_flush_after=256 -c autovacuum=off -c max_wal_senders=0

有关详细信息,请参阅这些文档部分:

还有这篇文章:

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 2011-02-14
    • 2013-07-20
    • 2011-02-28
    • 1970-01-01
    • 2010-11-12
    • 2023-04-11
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多