Descripción de la memoria compartida de PostgreSQL
PostgreSQL usa la memoria que se puede clasificar como:
- Memoria local : asignada a cada proceso
- Memoria compartida : usada por todos los procesos
Memoria local
Cada proceso de PostgreSQL requiere memoria para el procesamiento de consultas. Los siguientes parámetros de servidor permiten definir el uso de memoria:
work_mem define la memoria necesaria para ordenar las tuplas para las operaciones ORDER BY y DISTINCT. Este parámetro determina la cantidad de memoria disponible para las operaciones de ordenación internas y las tablas hash. Si tiene una gran cantidad de memoria disponible y su carga de trabajo incluye consultas con ordenación compleja, aumentar el valor de este parámetro podría mejorar el rendimiento al permitir escaneos más amplios en memoria antes de volcarse en el disco.
Sin embargo, una consulta compleja podría tener muchas operaciones de ordenación y hash que se ejecutan simultáneamente. Cada operación usa tanta memoria como este valor permite antes de empezar a escribir en archivos temporales basados en disco. En un sistema ocupado, por lo tanto, el uso total de memoria es muchas veces el de un parámetro work_mem individual.
Para ajustar este valor, use Ram total * 0,25 / max_connections como valor inicial.
maintenance_work_mem es la memoria requerida por vacuum y reindex. Este parámetro determina la cantidad de memoria disponible para las operaciones de ordenación internas y las tablas hash. El valor predeterminado es de 64 KB, pero aumentar este valor mejora el rendimiento para el vaciado de la base de datos.
autovacuum_work_mem establece la memoria máxima que usará cada proceso de autovacuum.
temp_buffers define la memoria para almacenar tablas temporales. Este parámetro establece el número máximo de búferes temporales usados por cada sesión de base de datos.
effective_cache_size define la cantidad de memoria disponible para el almacenamiento en caché del disco por parte del sistema operativo y dentro de la base de datos. El planificador de consultas de PostgreSQL determina si esta memoria está fijada en RAM. Los escaneos de índice es más probable que se utilicen con valores más altos, de lo contrario, se utilizan escaneos secuenciales si el valor es bajo.
Establezca effective_cache_size en 50% de la RAM total de la máquina.
Memoria compartida
La memoria compartida se asigna al inicio. La memoria compartida se usa para:
shared_buffers define los búferes de memoria compartidos utilizados por el servidor. PostgreSQL carga páginas de tablas e índices desde el almacenamiento persistente a un grupo de búferes compartido y, a continuación, trabaja en ellas en memoria. Este grupo de búferes compartidos es el componente principal de la memoria compartida usada por el servidor. El valor predeterminado es 128 MB (según el nivel de proceso). Si decide asignar más memoria, debe reiniciar el servidor.
wal_buffers define el número de búferes de páginas de disco en memoria compartida para el registro de escritura previa (WAL) antes de escribirlo en el almacenamiento persistente.
En resumen, los parámetros de servidor importantes relacionados con la memoria que podría querer optimizar son:
- shared_buffers
- work_mem
- tamaño_efectivo_de_caché