[英]Postgres insert slow after snapshot restore but not after restart
我的设置
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.