【发布时间】:2021-09-25 21:03:30
【问题描述】:
我知道使用postgresql.conf 可以限制 PostgreSQL 特定部分的内存使用量,例如共享内存或工作内存,但是有没有办法限制 PostgreSQL 服务器的总内存使用量?我没有找到可以做到这一点的配置属性...
顺便说一句,我需要在 Windows Server 2008 机器上运行它。
【问题讨论】:
标签: postgresql
我知道使用postgresql.conf 可以限制 PostgreSQL 特定部分的内存使用量,例如共享内存或工作内存,但是有没有办法限制 PostgreSQL 服务器的总内存使用量?我没有找到可以做到这一点的配置属性...
顺便说一句,我需要在 Windows Server 2008 机器上运行它。
【问题讨论】:
标签: postgresql
“总”内存是什么意思?这是您分配给各个池的总和。
所以,简而言之...不要将各种池/缓冲区设置得太大,这就是您的总内存限制。
【讨论】:
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_buffers 和 work_mem 设置为较低的值将允许 PostgreSQL 在您需要的限制内工作,但性能会受到影响。我认为可能的最小值是shared_buffers = 128 KB 和work_mem = 64 KB。但是,由于 PostgreSQL 将每个后端子进程作为单独的操作系统级别进程运行,因此在任何情况下,您通常最终都会花费至少 1-4 MB 每个后端,因此如果您希望每个连接低于 4 MB,您确实希望限制并行客户端连接。例如,pgbouncer 将是一个不错的选择。在实践中,我不建议将shared_buffers 设置为小于 12 MB 或将work_mem 设置为小于 1 MB。如果您真的负担不起,您可能需要创建一个完全不使用 SQL 数据库的完全定制设计。或尝试使用例如SQLite。
【讨论】: