【问题标题】:What happens when maxing out Postgres' work_mem?最大化 Postgres 的 work_mem 时会发生什么?
【发布时间】:2009-07-28 18:56:13
【问题描述】:

Postgres 中的 work_mem 选项如何工作?这是http://www.postgresql.org/docs/8.4/static/runtime-config-resource.html的描述:

指定内部使用的内存量 在切换到之前排序操作和哈希表 临时磁盘文件。该值默认为 1 兆字节 (1MB)。请注意,对于一个复杂的查询,几个排序或 哈希操作可能并行运行;每一个 将被允许​​使用与此值一样多的内存 在开始将数据放入临时文件之前指定 文件。此外,可能正在进行几个正在运行的会话 此类操作同时进行。所以使用的总内存 可能是 work_mem 值的许多倍;它是 有必要在选择时牢记这一事实 价值。排序操作用于 ORDER BY、DISTINCT、 并合并连接。哈希表用于哈希连接, 基于散列的聚合和基于散列的 IN 处理 子查询。

我在这里可能完全错了,但是..“切换到临时磁盘文件”与操作系统中的“虚拟内存”本质上不是一样的吗?一旦 RAM 消失,操作系统不会创建一个交换文件吗?将其设置为 100TB 并让操作系统自己解决不是更好吗?在我可能弄乱我的系统之前,我想检查一下是否有人真的尝试过这种方法。

【问题讨论】:

    标签: optimization postgresql


    【解决方案1】:

    例如,如果 PostgreSQL 知道排序将在磁盘上发生,它会切换到比内存排序更适合磁盘排序的排序操作 - 它不会知道它是否发生在交换中。

    此外,如果 PostgreSQL 发现数据不适合 RAM,它可以切换到完全不同的计划(例如,使用不同的 JOIN 方法)。

    将 work_mem 设置得太高一旦你有足够的数据就会让你的数据库变得非常慢,以至于所有东西都不再适合 RAM。

    【讨论】:

      【解决方案2】:

      请记住,work_mem 是可用于每个单个排序操作的最大 RAM 量。对于单个查询,多个排序操作可能并行运行,并且可能有多个连接同时查询数据库。出于这个原因,所有排序操作可能会使用 x 倍于 RAM 中 work_mem 的数量(这就是建议使用保守数量的原因)。

      现在回到您的问题,如果您选择 work_mem 到如此高的值,排序操作可能会占用您的大部分 RAM,这会导致从交换页面进出页面(请记住,有很多其他需要一些(甚至大量)RAM的进程和PostgreSQL部分。基于磁盘的排序操作比操作系统完成的页面交换更有效。正如其他一些回复所指出的那样,已换出的数据库服务器并且不断地执行会非常缓慢。

      另外一点是,对于如此高的work_mem 值,单个查询(有意或无意地)可能或多或少地使整个数据库服务器无响应。

      【讨论】:

        【解决方案3】:

        交换的数据库服务器是死数据库服务器。

        在 RAM 中 postgres 使用快速排序,在磁盘上它使用另一种更适合硬盘的算法。对换出的内存使用快速排序会非常慢。

        【讨论】:

        • '交换的数据库服务器是死数据库服务器。'说得好:)
        【解决方案4】:

        操作系统在处理交换方面是通用的,此外,进程可以使用的地址空间是有限的,这在 32 位系统上并没有那么大(Windows 32 位平台上的 2Gb,可以增强到 3Gb),但你是对的,你可以让操作系统通过虚拟内存来处理这个问题。

        PostgreSQL 不是“通用的”,一旦涉及磁盘访问,它会比操作系统更了解如何构造数据,因此一旦内存耗尽,让数据库切换到显式文件处理将比让操作系统处理更有好处它。

        【讨论】:

          猜你喜欢
          • 2018-08-30
          • 2014-05-12
          • 1970-01-01
          • 2010-12-08
          • 1970-01-01
          • 2021-12-27
          • 2022-11-18
          • 2018-05-01
          • 2015-02-23
          相关资源
          最近更新 更多