繁体   English   中英

Postgres 在快照还原后插入速度很慢,但在重新启动后没有

[英]Postgres insert slow after snapshot restore but not after restart

我的设置

  • Postgres 11 在运行 Amazon Linux 的 AWS EC2 t4g.xlarge 实例(4 个 vCPU,16GB)上运行。
  • 设置为每晚拍摄磁盘快照(我的工作负载不需要高可靠性)。
  • 数据库有表xtc_table_1约 630 万行,约 3.2GB。

设想

为了测试一些新的数据处理代码,我从生产实例的夜间快照创建了一个新的测试 AWS 实例。 我创建了一个新的UNLOGGED表,并用INSERT INTO holding_table_1 SELECT * FROM xtc_table_1;填充它

执行 CREATE 语句大约需要2 分 24 秒

我截断holding_table_1并再次运行 CREATE 语句,它在30 sec内完成。 对于表的连续截断和创建,约 30 秒的时间是一致的。

我认为这可能是因为一些数据缓存。 我尝试重新启动 Postgres 服务,然后重新启动 AWS 实例(在使用sudo service postgresql stop停止 postgres 之后),然后停止并启动 AWS 实例。 但是,创建表仍然需要约 30 秒。

如果我从快照重建一个新实例,我第一次运行 CREATE 语句时会回到 ~2m+ 时间。

其他表 xtc_table_2、xtc_table_3 的类似行为。

假设

在研究并找到这个答案之后,我想知道发生了什么是磁盘快照包含一些在我第一次对 xtc_table_n 执行任何操作时正在重放的 WAL 数据。 随后,由于 Postgres 被“很好地”关闭,没有 WAL 可以播放。

这听起来合理吗?

我对 Postgres 内部的了解还不够,无法确定。 我会想象在启动 postgres 时会发生任何 WAL 播放,但也许它会在第一次触摸表时发生在单个表级别?

知道原因不仅仅是理论上的; 我正在使用测试实例对一些处理代码进行一些调整,并且需要有信心拥有一致的基线来进行测量。

如果需要有关我的设置或我正在做什么的更多信息,请告诉我。

@jellycsc 的建议是正确的; 在此处添加更多信息,以防对其他人有帮助。

我遇到的问题根本不是 postgres 问题,而是因为 AWS 处理卷和快照的方式。
这个页面

对于从快照创建的卷,必须先从 Amazon S3 中提取存储块并将其写入卷,然后才能访问它们。 此初步操作需要时间,并且可能会导致第一次访问每个块时 I/O 操作的延迟显着增加。 将所有块下载并写入卷后,即可实现卷性能。

我使用链接的 AWS 页面中描述的fio实用程序来初始化恢复的卷,并且首次性能与后续查询时间一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM