跳转到主要内容

maintenance_work_mem

VACUUM、CREATE INDEX 与添加外键约束等维护命令的内存上限。
说明

Fact — 官方简述译文:设置维护操作可使用的最大内存。

身份

类型 , integer
上游 pg_settings 类型
Context , user
普通用户可在运行时修改
单位 , kB
原始单位
范围 , 642147483647
最后在档版本的原始上下限
枚举值 ,
非枚举类型记为 —
分类 , Resource Usage / Memory
上游分类
最后 boot 值 , 65536
64 MiB

生命周期

Fact
首次观测 PG9.0(研究下界)
在档版本 PG9.0–19 Beta 3
移除版本
引入提交 不作断言:早于 PG9.0 研究边界
提交日期
Discussion

默认值变迁

PG9.0–19 Beta 3 实测 boot 默认值
版本 原始 boot_val 单位 人类可读值
PG9.0–9.3 16384 kB 16 MiB
PG9.4–19 Beta 3 65536 kB 64 MiB

机制详解

maintenance_work_mem 用于 VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY 等维护操作。一个会话通常同一时间只执行一个此类操作,因此它一般可以显著高于 work_mem。

对于并行工具命令,PostgreSQL 将 maintenance_work_mem 视为整个工具命令的上限,而不是给每个并行维护工作进程完整分配一份;不过并行度仍可能显著增加 CPU 与 I/O 消耗。

Autovacuum 是另一项并发风险:当 autovacuum_work_mem 为 -1 时,每个 autovacuum 工作进程都会继承 maintenance_work_mem,多个工作进程的总预算会远高于单次维护操作的数值。

调优建议

提示

Advice。 以下建议是工作负载起点,必须用真实测量验证。

场景 建议
OLTP 取值应足以让日常 vacuum 与索引维护高效完成,但必须显式预算多个 autovacuum worker 的并发。若交互延迟敏感且 maintenance_work_mem 很大,应为 autovacuum_work_mem 单独设置较低上限。
OLAP 较大取值通常有利于大表索引构建、清理与恢复。应安排重型维护窗口,并验证维护并发、查询内存和操作系统内存仍能共同容纳。
小规格 全局值保持克制,只在受控维护会话中临时调高;增加之前先检查 autovacuum 的继承关系。

Pigsty 取值

以下值来自固定 8 核、32 GiB、100 GiB SSD 夹具,并按 PG19 Beta 3 渲染当前 Pigsty 模板;这不表示 Pigsty 当前支持该历史或测试版本。

模板 有效值 与上游 boot 比较 源表达式
OLTP 2048MB 不同于 boot 值 {{ pg_maintenance_mem }}MB
OLAP 4096MB 不同于 boot 值 {{ pg_maintenance_mem }}MB
CRIT 2048MB 不同于 boot 值 {{ pg_maintenance_mem }}MB
TINY 2048MB 不同于 boot 值 {{ pg_maintenance_mem }}MB
注意

Advice — 待人工复核。 当前 Pigsty 模板投影事实:OLTP: PG9.0–19 Beta 3 = 2048MB (dcs);OLAP: PG9.0–19 Beta 3 = 4096MB (dcs);CRIT: PG9.0–19 Beta 3 = 2048MB (dcs);TINY: PG9.0–19 Beta 3 = 2048MB (dcs)。 建议(待人工复核)——编辑推断:更高的 OLAP 比例意在加速批量维护,而被 autovacuum 继承后的并发风险需要单独复核。

常见坑

  • 因为维护操作不频繁就认为大值无害,却让 autovacuum_work_mem 保持 -1。
  • 把上限按并行维护工作进程数相乘;PostgreSQL 对整个工具命令应用该上限。
  • 为了单次恢复长期保留很大的集群全局值,而不是使用作用域内 SET。
  • 期望单纯增加内存解决由锁或存储 I/O 主导的维护瓶颈。

autovacuum_work_mem · autovacuum_max_workers · max_parallel_maintenance_workers · vacuum_buffer_usage_limit · work_mem

参考资料