【问题标题】:Limiting the total memory usage of PostgreSQL限制 PostgreSQL 的总内存使用量
【发布时间】:2021-09-25 21:03:30
【问题描述】:

我知道使用postgresql.conf 可以限制 PostgreSQL 特定部分的内存使用量,例如共享内存或工作内存,但是有没有办法限制 PostgreSQL 服务器的总内存使用量?我没有找到可以做到这一点的配置属性...

顺便说一句,我需要在 Windows Server 2008 机器上运行它。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    “总”内存是什么意思?这是您分配给各个池的总和。

    所以,简而言之...不要将各种池/缓冲区设置得太大,这就是您的总内存限制。

    【讨论】:

    • 我明白了...我希望有一些限制我可以设置并放心 PostgreSQL 永远不会通过它,但我想这将不得不这样做。在设置这些内存限制时,我应该注意哪些陷阱?
    • work_mem 是单个排序或其他内存密集型操作(散列操作等)可用的最大内存。每个查询可以有 o、1 或更多这些操作。假设您的平均查询有 2 个或更少的排序等,您可以大致了解使用频繁的机器可能看到的最大内存是 max_connections * work_mem * 2,给予或接受。单个 postgresql 后端只使用大约 6MB,所以除非你有一个非常高的 max_connections 单个后端,没有排序等,不要加起来太多。
    • 请注意,有时少即是多,所以不要盲目地增加所有这些数字,因为如果设置得太高,实际上会降低性能。
    • 没有关于存在哪些池、它们如何重叠、它们的默认值是什么或其他有用的信息。 -1.
    【解决方案2】:

    PostgreSQL 没有您可以设置的任何全局限制。相反,您配置shared_buffers(通常大约是您打算为 PostgreSQL 授予的总 RAM 的 25% - 50%),max_connections(您需要多少并行客户端连接,尽量保持尽可能低,也许使用 PgPool或 pgbouncer)和work_mem;实际内存使用量大致为shared_buffers + max_connections * work_mem * N,其中N 取决于您的平均查询复杂度。如果你只做简单的选择,N 将是 1。如果你做很多排序的子查询和复杂的多表连接,你应该假设 N 介于 4 和 10 之间。work_mem 的默认值是 4 MB 和你不应该减少它,除非你知道你不能拥有那么多。根据我的经验,如果您需要将 work_mem 设置为高于 16-32 MB,您可能应该改进您的查询。

    如果您有大量并行序列化 事务,您可能需要将max_connections 推送到人为的高数字,以允许获取足够的行锁以获得高性能。 (PostgreSQL 根据max_connections 缩放锁的数量,如果您的事务需要大量锁,默认缩放可能不够,PostgreSQL 将开始将行锁转换为表级锁,这将导致更多序列化事务回滚。但是,不要盲目地将max_connections 扩展得太高,因为 PostgreSQL 会不断为其配置支持的最大锁计数保留内存。如果您需要超过 400 万个并行锁,预计会出现性能问题——也就是说,重叠事务读取或写入总共 400 万行。请注意,对大表进行顺序表扫描必须读取大量行,因此您需要适当的索引!

    请注意,如果您需要节省内存,将 shared_bufferswork_mem 设置为较低的值将允许 PostgreSQL 在您需要的限制内工作,但性能会受到影响。我认为可能的最小值是shared_buffers = 128 KBwork_mem = 64 KB。但是,由于 PostgreSQL 将每个后端子进程作为单独的操作系统级别进程运行,因此在任何情况下,您通常最终都会花费至少 1-4 MB 每个后端,因此如果您希望每个连接低于 4 MB,您确实希望限制并行客户端连接。例如,pgbouncer 将是一个不错的选择。在实践中,我不建议将shared_buffers 设置为小于 12 MB 或将work_mem 设置为小于 1 MB。如果您真的负担不起,您可能需要创建一个完全不使用 SQL 数据库的完全定制设计。或尝试使用例如SQLite。

    【讨论】:

    • 另外,如果您运行的是 PostgreSQL 版本 12 或更低版本,增加 work_mem 可能会导致触发可能导致无限内存使用的错误,有关详细信息,请参阅dba.stackexchange.com/a/285423/29183
    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多