【问题标题】:AWS RDS I/O usage very different from Postgres blocks readAWS RDS I/O 使用与 Postgres 块读取非常不同
【发布时间】:2021-06-01 23:47:02
【问题描述】:

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

【问题讨论】:

    标签: postgresql amazon-rds


    【解决方案1】:

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

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

    【讨论】:

    • 我不确定这是否可以解释 - 当我第一次运行代码以插入和选择数据时,读取 I/O 和写入 I/O 操作存在巨大差异。无法想象写 I/O 是如何从缓存中获得的
    • 您从 SELECT 中显示了一行。它并不表示正在进行任何写入(如果表已被吸尘,这是有道理的)。当没有不同的信息来源时,可能存在什么差异。
    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2016-09-16
    相关资源
    最近更新 更多