检查内存设置(shared_buffers、work_mem、maintenance_work_mem)
PostgreSQL参数命令
SELECT name,
current_setting(name) AS value,
source,
context
FROM pg_settings
WHERE name IN ('shared_buffers', 'effective_cache_size', 'work_mem', 'hash_mem_multiplier',
'maintenance_work_mem', 'autovacuum_work_mem', 'max_connections',
'max_parallel_workers_per_gather', 'huge_pages', 'temp_buffers', 'wal_buffers')
ORDER BY name;
-- Rough ceilings: work_mem x max_connections and the autovacuum memory ceiling
SELECT pg_size_pretty(pg_size_bytes(current_setting('work_mem'))
* current_setting('max_connections')::int) AS work_mem_x_max_connections,
pg_size_pretty(pg_size_bytes(current_setting('maintenance_work_mem'))
* current_setting('autovacuum_max_workers')::int) AS autovacuum_mem_ceiling;
-- Trace of operations that did not fit in work_mem: temp files per database
SELECT datname, temp_files, pg_size_pretty(temp_bytes) AS temp_size, stats_reset
FROM pg_stat_database
WHERE datname IS NOT NULL
ORDER BY temp_bytes DESC;作用
显示与内存相关的参数及其值、来源(默认/配置文件)和变更上下文(postmaster = 重启);work_mem 和 autovacuum 的粗略内存上限;以及每个数据库的临时文件量。
适用场景
在搭建新服务器、增加内存后、发生 OOM killer 事件后,或发现大量使用临时文件时。
注意
work_mem 不是按连接分配,而是按每个排序/哈希节点分配(哈希还要乘以 hash_mem_multiplier),并且每个并行 worker 单独分配;一个复杂查询可能使用数倍的 work_mem,因此计算出的乘积只是粗略警告,而不是上限。典型起始值:shared_buffers 约为内存的 25%(需要重启),effective_cache_size 约 50-75%(仅为规划器提示,不分配任何内存),maintenance_work_mem 512MB-2GB。autovacuum_work_mem = -1 时,每个 autovacuum worker 可使用 maintenance_work_mem。如果 temp_bytes 很高,请按角色或查询调高 work_mem,而不是全局调高。在 Linux 上使用较大的 shared_buffers 时,请考虑 huge_pages。