【发布时间】: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