Optimización de PostgreSQL (postgresql.conf): Guía Completa de Ajuste de Rendimiento

Introducción

PostgreSQL es reconocido por sus características avanzadas y cumplimiento de estándares, pero su configuración predeterminada es intencionalmente conservadora para asegurar que funcione en hardware mínimo. Para entornos de producción, estos valores predeterminados pueden limitar severamente el rendimiento, impidiendo que PostgreSQL utilice efectivamente los recursos del sistema disponibles.

Un servidor PostgreSQL bien ajustado puede ofrecer un rendimiento dramáticamente mejor, manejando mayores volúmenes de transacciones, reduciendo la latencia de consultas y maximizando la utilización del hardware. La diferencia entre configuraciones predeterminadas y optimizadas puede ser la diferencia entre soportar cientos versus miles de usuarios concurrentes, o tiempos de consulta medidos en segundos versus milisegundos.

Esta guía completa se enfoca en optimizar el archivo de configuración postgresql.conf, cubriendo configuraciones de memoria, planificación de consultas, registro de escritura anticipada, gestión de conexiones, ajuste de autovacuum y optimizaciones específicas de carga de trabajo. Ya sea que gestiones una pequeña base de datos de aplicación o un almacén de datos empresarial, esta guía proporciona estrategias de ajuste expertas.

Visión General de la Arquitectura de PostgreSQL

Comprender estos componentes ayuda con la optimización:

  • Shared Buffers: Caché de memoria principal de PostgreSQL
  • Work Memory: Memoria por operación para ordenamientos y hashes
  • Maintenance Work Memory: Memoria para operaciones de mantenimiento (VACUUM, CREATE INDEX)
  • WAL (Write-Ahead Log): Registro de transacciones para durabilidad y recuperación
  • Autovacuum: Proceso en segundo plano para limpiar versiones antiguas de filas
  • Query Planner: Determina estrategias óptimas de ejecución de consultas

Prerrequisitos

Antes de optimizar PostgreSQL:

  • PostgreSQL instalado y ejecutándose
  • Acceso root o sudo al servidor
  • Comprensión de características de carga de trabajo
  • Métricas de rendimiento base documentadas
  • Copia de seguridad de configuración creada
  • Herramientas de monitoreo disponibles

Creando Copia de Seguridad de Configuración

# Respaldar postgresql.conf
# Ubuntu/Debian
sudo cp /etc/postgresql/16/main/postgresql.conf /etc/postgresql/16/main/postgresql.conf.backup

# CentOS/Rocky
sudo cp /var/lib/pgsql/16/data/postgresql.conf /var/lib/pgsql/16/data/postgresql.conf.backup

# Respaldar configuración completa del directorio de datos
sudo tar -czf /backup/postgresql_config_$(date +%Y%m%d).tar.gz /etc/postgresql/

# Documentar configuraciones actuales
sudo -u postgres psql -c "SELECT name, setting, unit FROM pg_settings ORDER BY name;" > /backup/pg_settings_before_$(date +%Y%m%d).txt

Recopilando Información del Sistema

# Núcleos de CPU
nproc

# Memoria total
free -h

# Información del disco
df -h

# Verificar tipo de disco (SSD vs HDD)
lsblk -d -o name,rota

# Versión de PostgreSQL
sudo -u postgres psql -c "SELECT version();"

# Ubicación actual del archivo de configuración
sudo -u postgres psql -c "SHOW config_file;"

Ubicación del Archivo de Configuración

Ubicaciones del archivo de configuración de PostgreSQL:

Ubuntu/Debian:

  • Configuración: /etc/postgresql/16/main/postgresql.conf
  • Datos: /var/lib/postgresql/16/main/
  • HBA: /etc/postgresql/16/main/pg_hba.conf

CentOS/Rocky Linux:

  • Configuración: /var/lib/pgsql/16/data/postgresql.conf
  • Datos: /var/lib/pgsql/16/data/
  • HBA: /var/lib/pgsql/16/data/pg_hba.conf

Encontrar configuración activa:

# Mostrar ubicación del archivo de configuración
sudo -u postgres psql -c "SHOW config_file;"

# Mostrar directorio de datos
sudo -u postgres psql -c "SHOW data_directory;"

# Listar todos los archivos de configuración
sudo -u postgres psql -c "SELECT * FROM pg_file_settings;"

Configuración de Memoria

Shared Buffers

Parámetro de memoria más crítico para PostgreSQL:

# postgresql.conf

# Shared buffers (caché principal)
# Recomendación: 25% de RAM para servidor dedicado
# Recomendación: 15-20% de RAM para servidor compartido
# Valor práctico máximo: 8-16GB (debido a arquitectura de PostgreSQL)

# Para servidor dedicado de 16GB RAM:
shared_buffers = 4GB

# Para servidor dedicado de 32GB RAM:
shared_buffers = 8GB

# Para servidor dedicado de 64GB RAM:
shared_buffers = 16GB

# Para servidor dedicado de 128GB RAM:
shared_buffers = 16GB  # Límite en 16GB, usar effective_cache_size en su lugar

Directrices de Shared Buffers:

RAM TotalServidor DedicadoServidor Compartido
4GB1GB768MB
8GB2GB1.5GB
16GB4GB3GB
32GB8GB6GB
64GB16GB12GB
128GB16GB16GB

Effective Cache Size

Indica al planificador cuánta memoria está disponible para caché:

# Effective cache size (NO memoria asignada, solo sugerencia al planificador)
# Recomendación: 50-75% de RAM para servidor dedicado
# Esto debe incluir shared_buffers + caché del SO

# Para servidor dedicado de 16GB RAM:
effective_cache_size = 12GB

# Para servidor dedicado de 32GB RAM:
effective_cache_size = 24GB

# Para servidor dedicado de 64GB RAM:
effective_cache_size = 48GB

Work Memory

Memoria para operaciones de ordenamiento y hash:

# Work memory (por operación, por conexión)
# Usado para ordenamientos, hashes, joins
# Cálculo: (RAM - shared_buffers) / (max_connections * 2-3)

# Para carga de trabajo OLTP típica:
work_mem = 16MB

# Para carga de trabajo de reportes/análisis:
work_mem = 64MB

# Para almacén de datos:
work_mem = 256MB

# Tener cuidado: uso total de memoria = work_mem * operaciones * conexiones

Cálculo de Work Memory:

Para 32GB RAM, 8GB shared_buffers, 100 conexiones:

Disponible: 32GB - 8GB = 24GB
Presupuesto por conexión: 24GB / 100 = 240MB
work_mem seguro: 240MB / 3 operaciones = 80MB
Recomendado: 64MB (dejar margen de seguridad)

Maintenance Work Memory

Memoria para operaciones de mantenimiento:

# Maintenance work memory (VACUUM, CREATE INDEX, ALTER TABLE)
# Puede establecerse más alto que work_mem
# Recomendación: 5-10% de RAM, máx 2GB por operación

# Para servidor de 16GB RAM:
maintenance_work_mem = 1GB

# Para servidor de 32GB RAM:
maintenance_work_mem = 2GB

# Para servidor de 64GB RAM:
maintenance_work_mem = 2GB  # PostgreSQL alcanza límite de efectividad alrededor de 2GB

# Memoria de trabajo de autovacuum (si no se establece, usa maintenance_work_mem)
autovacuum_work_mem = -1  # Usar valor de maintenance_work_mem
# O establecer específicamente para workers de autovacuum:
# autovacuum_work_mem = 512MB

Huge Pages

Usar páginas grandes para mejor gestión de memoria:

# Configuración de páginas grandes
# Mejora rendimiento reduciendo fallos de TLB
huge_pages = try  # try, on, off

# Opciones:
# try = usar si está disponible (recomendado)
# on = requerir páginas grandes
# off = no usar páginas grandes

Configurar páginas grandes en Linux:

# Calcular páginas grandes requeridas
# Fórmula: (shared_buffers + otra memoria compartida) / 2MB

# Para 8GB shared_buffers:
# Páginas requeridas: 8GB / 2MB = 4096 páginas + 10% sobrecarga = 4500 páginas

# Establecer páginas grandes
sudo sysctl -w vm.nr_hugepages=4500

# Hacer permanente
echo "vm.nr_hugepages=4500" | sudo tee -a /etc/sysctl.conf

# Aplicar cambios
sudo sysctl -p

# Verificar
cat /proc/meminfo | grep -i huge

Configuración de Write-Ahead Log (WAL)

WAL Buffers

# WAL buffers (búfer de registro de transacciones)
# Predeterminado: -1 (auto-ajustado a 3% de shared_buffers)
# Usualmente el auto-ajuste es óptimo

wal_buffers = -1

# O establecer explícitamente para cargas de trabajo de alta escritura:
# wal_buffers = 16MB

Configuraciones de WAL Writer

# WAL writer delay (milisegundos)
# Con qué frecuencia el writer de WAL vacía al disco
wal_writer_delay = 200ms

# WAL writer flush after (bytes)
wal_writer_flush_after = 1MB

Checkpoints

Los checkpoints escriben búferes sucios al disco:

# Tiempo máximo entre checkpoints
checkpoint_timeout = 15min  # Predeterminado: 5min, aumentar para mejor rendimiento

# Objetivo de finalización de checkpoint
# Fracción de checkpoint_timeout para completar checkpoint
# 0.9 = distribuir checkpoint sobre 90% del intervalo
checkpoint_completion_target = 0.9

# Tamaño mínimo de WAL a mantener
min_wal_size = 1GB  # Predeterminado: 80MB

# Tamaño máximo de WAL antes de forzar checkpoint
max_wal_size = 4GB  # Predeterminado: 1GB

# Umbral de advertencia para frecuencia de checkpoint
checkpoint_warning = 300s

Ajuste de Checkpoint:

Para cargas de trabajo de alta escritura:

checkpoint_timeout = 30min
max_wal_size = 8GB
min_wal_size = 2GB
checkpoint_completion_target = 0.9

Archivado WAL

# Archivado WAL para respaldo y replicación
wal_level = replica  # minimal, replica, logical

# Modo de archivo
archive_mode = on

# Comando de archivo
archive_command = 'test ! -f /mnt/wal_archive/%f && cp %p /mnt/wal_archive/%f'

# Tiempo de espera de archivo (forzar cambio de segmento WAL)
archive_timeout = 300  # 5 minutos

Configuración del Planificador de Consultas

Parámetros de Costo para HDD

# Parámetros de costo para discos duros tradicionales
random_page_cost = 4.0      # Costo de I/O aleatorio vs secuencial
seq_page_cost = 1.0         # Costo de página secuencial
cpu_tuple_cost = 0.01       # Costo de procesar cada fila
cpu_index_tuple_cost = 0.005 # Costo de procesar cada entrada de índice
cpu_operator_cost = 0.0025  # Costo de procesar cada operador

Parámetros de Costo para SSD

# Parámetros de costo para almacenamiento SSD
random_page_cost = 1.1      # SSD tiene penalización mínima de acceso aleatorio
seq_page_cost = 1.0
cpu_tuple_cost = 0.01
cpu_index_tuple_cost = 0.005
cpu_operator_cost = 0.0025

# Concurrencia de I/O efectiva (número de operaciones de I/O concurrentes)
effective_io_concurrency = 200  # Para SSD (HDD: 2)

Configuraciones de Consulta Paralela

# Workers paralelos máximos por consulta
max_parallel_workers_per_gather = 4  # Para 4-8 núcleos
# max_parallel_workers_per_gather = 8  # Para 16+ núcleos

# Workers en segundo plano máximos
max_worker_processes = 8

# Workers paralelos máximos (todos los tipos)
max_parallel_workers = 8

# Tamaño mínimo de tabla para consulta paralela
min_parallel_table_scan_size = 8MB
min_parallel_index_scan_size = 512kB

# Parámetros de costo de workers paralelos
parallel_tuple_cost = 0.1
parallel_setup_cost = 1000.0

Objetivo de Estadísticas

# Objetivo de estadísticas predeterminado (100-1000)
# Mayor = mejores estimaciones, ANALYZE más lento
default_statistics_target = 100  # Predeterminado

# Para consultas complejas o tablas grandes:
# default_statistics_target = 500

# O establecer por columna:
# ALTER TABLE table_name ALTER COLUMN column_name SET STATISTICS 500;

Configuraciones de Conexión

Límites de Conexión

# Conexiones máximas
# Equilibrio entre capacidad y uso de recursos
max_connections = 100  # Predeterminado, aumentar para alto tráfico

# Para aplicaciones web:
# max_connections = 200

# Para pooling de conexiones (PgBouncer):
# max_connections = 50  # Menor con pooler

# Conexiones reservadas de superusuario
superuser_reserved_connections = 3

Cálculo de Conexiones:

Estimación de uso total de memoria:

shared_buffers + (max_connections * (work_mem * 2 + sobrecarga))

Ejemplo para 32GB RAM:
8GB shared + (200 * (16MB * 2 + 10MB))
= 8GB + (200 * 42MB)
= 8GB + 8.4GB = 16.4GB

Recomendación de Pooling de Conexiones

Usar PgBouncer o pgpool-II:

# Con pooler de conexiones, reducir max_connections
max_connections = 50

# El pooler maneja 1000s de conexiones de cliente
# PostgreSQL maneja 50 conexiones backend

Configuración de Autovacuum

Crítico para salud y rendimiento de PostgreSQL:

Configuraciones Básicas de Autovacuum

# Habilitar autovacuum (siempre debe estar ON)
autovacuum = on

# Número de procesos worker de autovacuum
autovacuum_max_workers = 3  # Para carga de trabajo típica
# autovacuum_max_workers = 6  # Para carga de trabajo de alta escritura

# Retraso entre ejecuciones de autovacuum
autovacuum_naptime = 1min  # Con qué frecuencia verificar trabajo

# Tiempo mínimo entre vacuums en la misma tabla
autovacuum_vacuum_insert_threshold = 1000

Umbrales de Autovacuum

# Umbral de vacuum = threshold + scale_factor * tuples

# Umbral de vacuum (tuplas muertas mínimas)
autovacuum_vacuum_threshold = 50

# Factor de escala de vacuum (porcentaje de tamaño de tabla)
autovacuum_vacuum_scale_factor = 0.2  # 20% de la tabla

# Ejemplo: tabla de 1M filas se activa en: 50 + (0.2 * 1,000,000) = 200,050 tuplas muertas

# Para tablas grandes, reducir factor de escala:
# autovacuum_vacuum_scale_factor = 0.05  # 5%

# Umbral de analyze
autovacuum_analyze_threshold = 50
autovacuum_analyze_scale_factor = 0.1  # 10% de la tabla

Configuraciones de Costo de Autovacuum

# Retraso de costo de autovacuum (limitación)
# Menor = vacuum más rápido, mayor carga de I/O
autovacuum_vacuum_cost_delay = 2ms  # Predeterminado: 20ms

# Límite de costo de vacuum (antes de dormir)
autovacuum_vacuum_cost_limit = 200  # Predeterminado: -1 (usar vacuum_cost_limit)

# Para autovacuum agresivo (hardware moderno):
# autovacuum_vacuum_cost_delay = 0  # Sin retraso
# autovacuum_vacuum_cost_limit = -1  # Sin límite

Configuraciones de Congelamiento

# Umbrales de congelamiento de autovacuum
# Previene envolvimiento de ID de transacción

# Edad mínima de congelamiento de vacuum
vacuum_freeze_min_age = 50000000

# Edad de congelamiento de tabla de vacuum
vacuum_freeze_table_age = 150000000

# Edad máxima de congelamiento de autovacuum (vacuum de emergencia)
autovacuum_freeze_max_age = 200000000

# Configuraciones de congelamiento multixact
vacuum_multixact_freeze_min_age = 5000000
vacuum_multixact_freeze_table_age = 150000000
autovacuum_multixact_freeze_max_age = 400000000

Configuración de Background Writer

# Configuraciones de background writer
bgwriter_delay = 200ms          # Dormir entre rondas
bgwriter_lru_maxpages = 100     # Páginas máximas a escribir por ronda
bgwriter_lru_multiplier = 2.0   # Multiplicador para siguiente ronda

# Vaciar después de escribir esto
bgwriter_flush_after = 512kB

# Límite de I/O de background writer
# 0 = ilimitado (recomendado para SSD)
# bgwriter_lru_maxpages = 1000

Configuración de Registro

Verbosidad de Registro

# Recolector de registros
logging_collector = on

# Directorio y nombre de archivo de registro
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

# Rotación de archivo de registro
log_rotation_age = 1d
log_rotation_size = 100MB
log_truncate_on_rotation = on

# Qué registrar
log_min_duration_statement = 1000  # Registrar consultas > 1 segundo
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = off
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_lock_waits = on
log_statement = 'ddl'  # none, ddl, mod, all
log_temp_files = 0  # Registrar todos los archivos temporales

# Detalle de error
log_min_messages = warning
log_min_error_statement = error

Registro de Consultas Lentas

# Registrar consultas lentas
log_min_duration_statement = 1000  # milisegundos

# Registrar consultas que tomen > 1 segundo
# O 0 para registrar todas las consultas (solo desarrollo)
# O -1 para deshabilitar

Configuraciones Específicas de Carga de Trabajo

OLTP de Alta Transacción

# Optimizado para muchas transacciones cortas
shared_buffers = 8GB
effective_cache_size = 24GB
work_mem = 16MB
maintenance_work_mem = 1GB

max_connections = 200
max_parallel_workers_per_gather = 2

# Checkpoints rápidos
checkpoint_timeout = 15min
max_wal_size = 4GB
checkpoint_completion_target = 0.9

# Configuraciones SSD
random_page_cost = 1.1
effective_io_concurrency = 200

# Autovacuum agresivo
autovacuum_max_workers = 4
autovacuum_vacuum_cost_delay = 2ms

Almacén de Datos / Análisis

# Optimizado para consultas complejas en grandes conjuntos de datos
shared_buffers = 16GB
effective_cache_size = 48GB
work_mem = 256MB
maintenance_work_mem = 2GB

max_connections = 50
max_parallel_workers_per_gather = 8
max_parallel_workers = 16

# Checkpoints menos frecuentes
checkpoint_timeout = 30min
max_wal_size = 8GB

# Optimización de consulta paralela
min_parallel_table_scan_size = 8MB
parallel_tuple_cost = 0.01
parallel_setup_cost = 100.0

# Estadísticas
default_statistics_target = 500

Carga de Trabajo Mixta

# Configuración equilibrada
shared_buffers = 8GB
effective_cache_size = 24GB
work_mem = 32MB
maintenance_work_mem = 1GB

max_connections = 150
max_parallel_workers_per_gather = 4

checkpoint_timeout = 20min
max_wal_size = 4GB
checkpoint_completion_target = 0.9

random_page_cost = 1.1
effective_io_concurrency = 200

autovacuum_max_workers = 3

Servidor Pequeño (4GB RAM)

# Entorno con restricción de recursos
shared_buffers = 1GB
effective_cache_size = 3GB
work_mem = 4MB
maintenance_work_mem = 256MB

max_connections = 50
max_parallel_workers_per_gather = 2

checkpoint_timeout = 10min
max_wal_size = 1GB

autovacuum_max_workers = 2

Monitoreo y Ajuste

Métricas Clave a Monitorear

-- Relación de aciertos de caché de búfer (debería ser > 99%)
SELECT
    sum(heap_blks_read) as heap_read,
    sum(heap_blks_hit) as heap_hit,
    sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) * 100 AS cache_hit_ratio
FROM pg_statio_user_tables;

-- Uso de conexiones
SELECT
    max_conn,
    used,
    res_for_super,
    max_conn - used - res_for_super AS available
FROM
    (SELECT count(*) used FROM pg_stat_activity) t1,
    (SELECT setting::int max_conn FROM pg_settings WHERE name = 'max_connections') t2,
    (SELECT setting::int res_for_super FROM pg_settings WHERE name = 'superuser_reserved_connections') t3;

-- Estadísticas de checkpoint
SELECT * FROM pg_stat_bgwriter;

-- Hinchazón de tabla
SELECT
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size,
    n_live_tup,
    n_dead_tup,
    round(n_dead_tup * 100.0 / NULLIF(n_live_tup + n_dead_tup, 0), 2) AS dead_ratio
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC
LIMIT 10;

-- Consultas de larga duración
SELECT
    pid,
    now() - query_start AS duration,
    state,
    query
FROM pg_stat_activity
WHERE state != 'idle'
AND now() - query_start > interval '5 minutes'
ORDER BY duration DESC;

Herramientas de Ajuste

# PGTune - Generador de configuración
# https://pgtune.leopard.in.ua/

# pg_stat_statements - Estadísticas de consultas
sudo -u postgres psql -d database -c "CREATE EXTENSION pg_stat_statements;"

# Verificar extensión
SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;

# pg_buffercache - Inspección de caché de búfer
sudo -u postgres psql -c "CREATE EXTENSION pg_buffercache;"

# pgBadger - Analizador de registros
pgbadger /var/log/postgresql/postgresql-*.log -o report.html

Aplicando Cambios de Configuración

Probando Configuración

# Verificar sintaxis de configuración
sudo -u postgres postgres -C shared_buffers

# Probar archivo de configuración
sudo -u postgres postgres --config-file=/etc/postgresql/16/main/postgresql.conf -C shared_buffers

# Ver configuraciones actuales
sudo -u postgres psql -c "SHOW ALL;"

Aplicando Cambios

# Recargar configuración (no reinicia servidor)
sudo systemctl reload postgresql

# O desde dentro de psql
sudo -u postgres psql -c "SELECT pg_reload_conf();"

# Reinicio requerido para algunas configuraciones
sudo systemctl restart postgresql

# Verificar cambios
sudo -u postgres psql -c "SHOW shared_buffers;"
sudo -u postgres psql -c "SHOW effective_cache_size;"

# Verificar registros
sudo tail -f /var/log/postgresql/postgresql-16-main.log

Configuración Dinámica

Algunos parámetros pueden cambiarse sin reiniciar:

-- Cambiar dinámicamente (se pierde al reiniciar)
ALTER SYSTEM SET work_mem = '32MB';

-- Recargar configuración
SELECT pg_reload_conf();

-- Verificar
SHOW work_mem;

-- Configuraciones en vista pg_settings
SELECT name, setting, unit, context
FROM pg_settings
WHERE name = 'work_mem';

Ejemplo de Configuración Optimizada Completa

Configuración de producción para servidor de base de datos dedicado de 32GB RAM:

# postgresql.conf - Optimizado para 32GB RAM, SSD, Carga de Trabajo OLTP/Mixta

# Configuraciones de Memoria
shared_buffers = 8GB
effective_cache_size = 24GB
work_mem = 32MB
maintenance_work_mem = 2GB
huge_pages = try

# Configuraciones WAL
wal_buffers = -1
min_wal_size = 1GB
max_wal_size = 4GB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
wal_compression = on

# Planificador de Consultas
random_page_cost = 1.1
effective_io_concurrency = 200
default_statistics_target = 100

# Consulta Paralela
max_worker_processes = 8
max_parallel_workers = 8
max_parallel_workers_per_gather = 4
max_parallel_maintenance_workers = 4

# Configuraciones de Conexión
max_connections = 200
superuser_reserved_connections = 3

# Autovacuum
autovacuum = on
autovacuum_max_workers = 3
autovacuum_naptime = 1min
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
autovacuum_vacuum_cost_delay = 2ms

# Background Writer
bgwriter_delay = 200ms
bgwriter_lru_maxpages = 100
bgwriter_lru_multiplier = 2.0

# Registro
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_min_duration_statement = 1000
log_checkpoints = on
log_connections = on
log_disconnections = on
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_lock_waits = on

# Estadísticas
track_activities = on
track_counts = on
track_io_timing = on
track_functions = all

Conclusión

El ajuste de rendimiento de PostgreSQL es un proceso continuo que requiere monitoreo, análisis y ajustes iterativos. Esta guía ha proporcionado estrategias de configuración completas para optimizar PostgreSQL a través del archivo postgresql.conf.

Conclusiones Clave

  1. La Memoria es Crítica: Configurar correctamente shared_buffers y effective_cache_size
  2. Coincidir con el Hardware: Optimizar para SSD/HDD y recursos disponibles
  3. Monitorear Continuamente: Rastrear métricas antes y después de cambios
  4. Autovacuum Importa: Esencial para rendimiento a largo plazo
  5. Específico de Carga de Trabajo: Ajustar para tu caso de uso específico

Lista de Verificación de Optimización

  • ✓ Configurar shared_buffers (25% de RAM, máx 16GB)
  • ✓ Establecer effective_cache_size (75% de RAM)
  • ✓ Optimizar work_mem para carga de trabajo
  • ✓ Configurar maintenance_work_mem
  • ✓ Habilitar huge pages
  • ✓ Optimizar configuraciones WAL
  • ✓ Ajustar parámetros de checkpoint
  • ✓ Configurar para tipo de almacenamiento (SSD/HDD)
  • ✓ Habilitar consultas paralelas
  • ✓ Optimizar autovacuum
  • ✓ Configurar registro
  • ✓ Monitorear métricas clave

Recursos Adicionales

Recuerda: la optimización de rendimiento es un proceso empírico. Medir, cambiar un parámetro a la vez, medir nuevamente e iterar.