AWS RDS I/O 使用与 Postgres 块读取非常不同

时间:2021-06-01 14:31:22

标签: postgresql amazon-rds

我在 AWS RDS 中创建了一个测试 Postgres 数据库。创建了一个 1 亿行 2 列的表。在那张桌子上选择*。 Postgres 报告“缓冲区:共享命中=24722 读取=521226”,但 AWS 报告了数百个 IOPS。为什么会有如此巨大的差异?从广义上讲,我试图弄清楚如何估计查询可能花费的 AWS I/O 操作的数量。 enter image description here

1 个答案:

答案 0 :(得分:0)

PostgreSQL 没有深入了解内核/FS 做了什么。如果 PostgreSQL 发出系统调用来读取数据,那么它会将该缓冲区报告为“已读”。如果它实际上是从内核的文件系统缓存中提供的,而不是真正从磁盘中提供的,PostgreSQL 无法知道这一点(尽管如果 track_io_timing 开启,您可以做出一些合理的统计猜测),而 AWS 的 IO 监控工具会知道。

如果您将 shared_buffers 设置为大部分内存,那么文件系统缓存的剩余空间就会很小,因此大多数报告为读取的缓冲区应该确实是从磁盘读取的。这可能不是运行系统的好方法,但它可能会为您的 EXPLAIN 计划提供一些清晰度。我还听说 Amazon Aurora 重新实现了存储系统,以便它使用 directIO 或类似的东西,因此根本不使用文件系统缓存。