首页 > 解决方案 > 了解 Postgres work_mem、maintenance_work_mem 和 temp_buffers 分配

问题描述

我想了解一些postgresql.conf 参数的配置。我想知道何时分配maintenance_work_mem、work_mem 和temp_buffers。

据我了解,

  1. maintenance_work_memory 在服务器启动时分配,此内存不能被任何其他进程使用。
  2. work_mem 在查询解析时被分配,规划器检查排序方法或哈希表的数量并相应地分配内存。排序操作可能不会使用完全分配的内存,但仍为该特定操作保留,并且不能被任何其他进程使用。
  3. temp_buffers 在每个会话开始时分配。

我已经浏览了文档,但没有得到任何正确的答案。

这种理解正确吗?

标签: postgresql

解决方案


维护工作内存是为 VACUUM、CREATE INDEX 和 ADD FOREIGN KEYS 分配的每个会话,它也依赖于并行工作程序,例如 autovacuum_max_workers = 3 和 maintenance_work_mem = 1 GB,那么 autovacuum 在创建索引时同样会消耗 1*3= 3GB 的内存.

现在,work_mem 也会根据您的排序/散列操作在每个会话中分配,但是我确信 Postgres 不会保留将来使用的任何内容并进行调整,您应该在分配此内存之前始终考虑您的并行连接数此参数消耗每个连接在集群中运行的内存 work_mem*sort 操作。

是的,确实 temp_buffers 可以在单个会话中更改,但只能在会话中第一次使用临时表之前更改。

http://rhaas.blogspot.com/2019/01/how-much-maintenanceworkmem-do-i-need.html作者:罗伯特·哈斯 https://www.depesz.com/2011/07/03/understanding-postgresql- Deprez https://www.interdb.jp/pg/pgsql02.htmlhttps://severalnines.com/database-blog/architecture-and-tuning-memory-postgresql-databases的conf-work_mem/非常有助于理解内存架构


推荐阅读