DBAtlas · Atlas de operaciones de bases de datos

Revisar los ajustes de memoria (shared_buffers, work_mem, maintenance_work_mem)

PostgreSQLParámetros

Comando

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;

Qué hace

Muestra los parámetros relacionados con la memoria con su valor, su origen (default/archivo de configuración) y su contexto de cambio (postmaster = reinicio); techos aproximados de memoria para work_mem y autovacuum; y el volumen de archivos temporales por base de datos.

Cuándo usarlo

Al montar un servidor nuevo, tras añadir RAM, tras un evento del OOM killer o cuando se observa mucho uso de archivos temporales.

Precaución

work_mem no se asigna por conexión sino por NODO de sort/hash (multiplicado por hash_mem_multiplier en los hashes) y por separado para cada parallel worker; una consulta compleja puede usar varias veces work_mem, así que el producto calculado es una advertencia aproximada, no un límite superior. Puntos de partida típicos: shared_buffers ~25% de la RAM (requiere reinicio), effective_cache_size ~50-75% (solo una pista para el planificador, no asigna nada), maintenance_work_mem 512MB-2GB. Con autovacuum_work_mem = -1, cada autovacuum worker puede usar maintenance_work_mem. Si temp_bytes es alto, suba work_mem por rol o consulta, no globalmente. Con shared_buffers grandes en Linux, considere huge_pages.

Abrir en DBAtlas →

Relacionado