Compartir a través de


Uso de recursos / Memoria

autovacuum_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático.
Tipo de datos entero
Valor predeterminado -1
Valores permitidos -1-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación autovacuum_work_mem

commit_timestamp_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Especifica la cantidad de memoria que se usará para almacenar en caché el contenido de pg_commit_ts. La unidad es 8 kb.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 0-131072
Parameter type (Tipo de parámetro) estático
Documentación commit_timestamp_buffers

tipo_de_memoria_compartida_dinámica

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida dinámica usada.
Tipo de datos enumeración
Valor predeterminado posix
Valores permitidos posix
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida_dinámica

hash_mem_multiplier

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Múltiplo de work_mem que se utiliza para las tablas hash.
Tipo de datos numérico
Valor predeterminado 2
Valores permitidos 1-1000
Parameter type (Tipo de parámetro) dinámico
Documentación hash_mem_multiplier

huge_pages

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Habilita o deshabilita el uso de páginas de memoria enormes. Esta configuración no es aplicable a los servidores que tienen menos de 4 núcleos virtuales.
Tipo de datos enumeración
Valor predeterminado try
Valores permitidos on,off,try
Parameter type (Tipo de parámetro) estático
Documentación huge_pages

Descripción

Las páginas enormes son una característica que permite administrar la memoria en bloques más grandes. Normalmente, puede administrar bloques de hasta 2 MB, en lugar de las páginas estándar de 4 KB.

El uso de páginas enormes puede ofrecer ventajas de rendimiento que descargan eficazmente la CPU:

  • Reducen la sobrecarga asociada a tareas de administración de memoria, como menos errores de búfer de aspecto de traducción (TLB).
  • Reducen el tiempo necesario para la administración de memoria.

En concreto, en PostgreSQL, solo puede usar páginas enormes para el área de memoria compartida. Se asigna una parte significativa del área de memoria compartida para los búferes compartidos.

Otra ventaja es que las páginas enormes impiden el intercambio del área de memoria compartida fuera del disco, lo que estabiliza aún más el rendimiento.

Recomendaciones

  • En el caso de los servidores que tienen recursos de memoria significativos, evite deshabilitar páginas enormes. Deshabilitar páginas enormes podría poner en peligro el rendimiento.
  • Si comienza con un servidor más pequeño que no admite páginas enormes, pero prevé escalar verticalmente a un servidor que sí, mantenga la huge_pages configuración en TRY para una transición sin problemas y un rendimiento óptimo.

Notas específicas de Azure

En el caso de los servidores con cuatro o más núcleos virtuales, las páginas grandes se asignan automáticamente desde el sistema operativo subyacente. La característica no está disponible para servidores con menos de cuatro núcleos virtuales. El número de páginas enormes se ajusta automáticamente si se cambia cualquier configuración de memoria compartida, incluidas las modificaciones a shared_buffers.

tamaño_de_página_grande

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Tamaño de página enorme que se debe solicitar.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0
Parameter type (Tipo de parámetro) solo lectura
Documentación tamaño_de_página_grande

logical_decoding_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para la descodificación lógica.
Tipo de datos entero
Valor predeterminado 65536
Valores permitidos 64-2147483647
Parameter type (Tipo de parámetro) dinámico
Documentación logical_decoding_work_mem

memoria_de_trabajo_de_mantenimiento

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 1024-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación maintenance_work_mem

Descripción

maintenance_work_mem es un parámetro de configuración en PostgreSQL. Controla la cantidad de memoria asignada para las operaciones de mantenimiento, como VACUUM, CREATE INDEX, y ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservado para tareas que mantienen y optimizan la estructura de la base de datos.

![NOTA] Establecer maintenance_work_mem en valores demasiado agresivos podría provocar periódicamente errores de memoria insuficiente en el sistema. Es muy importante comprender la cantidad de memoria disponible en el servidor y el número de operaciones simultáneas que podrían asignar memoria para las tareas descritas anteriormente, antes de realizar cambios en este parámetro.

Puntos clave

  • Límite de memoria de vacío: Si desea acelerar la limpieza de tuplas inactivas aumentando maintenance_work_mem, tenga en cuenta que VACUUM tiene una limitación integrada para recopilar identificadores de tupla no enviados. Solo puede usar hasta 1 GB de memoria para este proceso.
  • Separación de memoria para autovacuum: Puede usar la configuración autovacuum_work_mem para controlar de forma independiente la memoria que utilizan las operaciones de autovacío. Esta configuración actúa como un subconjunto de maintenance_work_mem. Usted puede decidir cuánta memoria utiliza el autovacuum sin afectar la asignación de memoria para otras tareas de mantenimiento y operaciones de definición de datos.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor maintenance_work_mem se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores de la selección de producto en el proceso que admita el servidor flexible no tendrán ningún efecto en el valor predeterminado del parámetro de servidor maintenance_work_mem de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro maintenance_work_mem según los valores de la siguiente fórmula.

La fórmula usada para calcular el valor de maintenance_work_mem es (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria memoria_de_trabajo_de_mantenimiento
2 GiB 99,328 KiB
4 GiB 157 696 KiB
8 GiB 216 064 KiB
16 GiB 274,432 KiB
32 GiB 332 800 KiB
48 GiB 367,616 KiB
64 GiB 392,192 KiB
80 GiB 410 624 KiB
128 GiB 450 560 KiB
160 GiB 468 992 KiB
192 GiB 484,352 KiB
256 GiB 508,928 KiB
384 GiB 542 720 KiB
432 GiB 552 960 KiB
672 GiB 590,848 KiB

max_prepared_transactions

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de transacciones preparadas simultáneamente. Al ejecutar un servidor de réplica, debe establecer este parámetro en el mismo valor o superior que en el servidor principal.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0-262143
Parameter type (Tipo de parámetro) estático
Documentación max_prepared_transactions

max_stack_depth

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la profundidad máxima de la pila, en kilobytes.
Tipo de datos entero
Valor predeterminado 2048
Valores permitidos 2048
Parameter type (Tipo de parámetro) solo lectura
Documentación max_stack_depth

min_dynamic_shared_memory

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Cantidad de memoria compartida dinámica reservada en el inicio.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0
Parameter type (Tipo de parámetro) solo lectura
Documentación memoria_compartida_dinámica_mínima

multixact_member_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Especifica la cantidad de memoria compartida que se va a usar para almacenar en caché el contenido de pg_multixact/members. La unidad es 8 kb.
Tipo de datos entero
Valor predeterminado 32
Valores permitidos 16-131072
Parameter type (Tipo de parámetro) estático
Documentación multixact_member_buffers

multixact_offset_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Especifica la cantidad de memoria compartida que se usará para almacenar en caché el contenido de pg_multixact/offsets. La unidad es 8 kb.
Tipo de datos entero
Valor predeterminado 16
Valores permitidos 16-131072
Parameter type (Tipo de parámetro) estático
Documentación multixact_offset_buffers

notify_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Especifica la cantidad de memoria compartida que se usará para almacenar en caché el contenido de pg_notify. La unidad es 8 kb.
Tipo de datos entero
Valor predeterminado 16
Valores permitidos 16-131072
Parameter type (Tipo de parámetro) estático
Documentación notify_buffers

serializable_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Especifica la cantidad de memoria compartida que se usará para almacenar en caché el contenido de pg_serial. La unidad es 8 kb.
Tipo de datos entero
Valor predeterminado 32
Valores permitidos 16-131072
Parameter type (Tipo de parámetro) estático
Documentación serializable_buffers

shared_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número de búferes de memoria compartidos utilizados por el servidor. La unidad es 8 kb. Los valores permitidos están dentro del intervalo del 10 % - 75 % de la memoria disponible.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 16-1073741823
Parameter type (Tipo de parámetro) estático
Documentación shared_buffers

Descripción

El parámetro de configuración shared_buffers determina la cantidad de memoria del sistema asignada a la base de datos PostgreSQL para almacenar en búfer los datos. Actúa como un grupo de memoria centralizado que es accesible para todos los procesos de base de datos.

Cuando se necesitan datos, el proceso de base de datos comprueba primero el búfer compartido. Si los datos necesarios están presentes, se recuperan rápidamente y se omiten más lecturas de disco que consumen mucho tiempo. Los búferes compartidos sirven como intermediario entre los procesos de base de datos y el disco, y reducen eficazmente el número de operaciones de E/S necesarias.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor shared_buffers se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores a la selección de productos en el cálculo que soporta el servidor flexible no afectan en absoluto al valor por defecto del parámetro de servidor shared_buffers de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro shared_buffers según los valores de las siguientes fórmulas.

En el caso de las máquinas virtuales con hasta 2 GiB de memoria, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 16384.

En el caso de las máquinas virtuales con más de 2 GiB, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 32768.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria shared_buffers
2 GiB 32768
4 GiB 131 072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memoria_compartida

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal.
Tipo de datos enumeración
Valor predeterminado mmap
Valores permitidos mmap
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida

subtransaction_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Especifica la cantidad de memoria compartida que se usará para almacenar en caché el contenido de pg_subtrans. La unidad es 8 kb.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 0-131072
Parameter type (Tipo de parámetro) estático
Documentación subtransaction_buffers

temp_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de búferes temporales que usa cada sesión de base de datos.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 100-1073741823
Parameter type (Tipo de parámetro) dinámico
Documentación temp_buffers

transaction_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Especifica la cantidad de memoria compartida que se usará para almacenar en caché el contenido de pg_xact. La unidad es 8 kb.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 0-131072
Parameter type (Tipo de parámetro) estático
Documentación transaction_buffers

límite_de_uso_del_buffer_de_vacío

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el tamaño del grupo de búferes para VACUUM, ANALYZE y vaciado automático.
Tipo de datos entero
Valor predeterminado 2048
Valores permitidos 0-16777216
Parameter type (Tipo de parámetro) dinámico
Documentación límite_de_uso_del_buffer_de_vacío

work_mem (memoria de trabajo)

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la cantidad de memoria que se va a usar en las operaciones de ordenación internas y las tablas hash antes de escribir en los archivos de disco temporales.
Tipo de datos entero
Valor predeterminado 4096
Valores permitidos 4096-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación work_mem

Descripción

El parámetro work_mem de PostgreSQL controla la cantidad de memoria asignada para determinadas operaciones internas dentro del área de memoria privada de cada sesión de base de datos. Algunos ejemplos de estas operaciones son la ordenación y el hash.

A diferencia de los búferes compartidos, que se encuentran en el área de memoria compartida, work_mem se asigna en un espacio de memoria privada por sesión o por consulta. Al establecer un tamaño work_mem adecuado, puede mejorar significativamente la eficacia de estas operaciones y reducir la necesidad de escribir datos temporales en el disco.

Puntos clave

  • Memoria de conexión privada: work_mem forma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida que shared_buffers usa.
  • Uso específico de la consulta: no todas las sesiones o consultas usan work_mem. Es poco probable que las consultas simples como SELECT 1 requieran work_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos de work_mem.
  • Operaciones paralelas: En el caso de las consultas que abarcan varios back-end paralelos, cada back-end podría usar potencialmente uno o varios fragmentos de work_mem.

Supervisión y ajuste de la memoria de trabajo

Es esencial supervisar continuamente el rendimiento del sistema y ajustar work_mem según sea necesario, principalmente si los tiempos de ejecución de consultas relacionados con las operaciones de ordenación o hash son lentos. Estas son las maneras de supervisar el rendimiento mediante herramientas disponibles en Azure Portal:

  • Información de rendimiento de consultas: Compruebe las consultas principales por archivos temporales pestaña para identificar las consultas que generan archivos temporales. Esta situación sugiere una posible necesidad de aumentar work_mem.
  • Guías de solución de problemas: Use la pestaña Archivos temporales altos de las guías de solución de problemas para identificar consultas problemáticas.
Ajuste pormenorizados

Aunque gestiona el parámetro work_mem, es a veces más eficaz adoptar un enfoque de ajuste pormenorizado en lugar de establecer un valor global. Este enfoque garantiza que asigne memoria con criterio en función de las necesidades específicas de los procesos y los usuarios. También minimiza el riesgo de encontrar problemas de memoria insuficiente. Así es como puede hacerlo:

  • nivel de usuario: Si un usuario específico participa principalmente en tareas de agregación o informes, que consumen mucha memoria, considere la posibilidad de personalizar el valor work_mem para ese usuario. Use el comando ALTER ROLE para mejorar el rendimiento de las operaciones del usuario.

  • Nivel de función/procedimiento: Si funciones o procedimientos específicos generan archivos temporales sustanciales, aumentar el valor work_mem en el nivel de función o procedimiento específico puede ser beneficioso. Use el comando ALTER FUNCTION o ALTER PROCEDURE para asignar específicamente más memoria a estas operaciones.

  • Nivel de base de datos: Modifique work_mem en el nivel de base de datos si solo las bases de datos específicas generan un gran número de archivos temporales.

  • Nivel global: Si un análisis del sistema revela que la mayoría de las consultas generan archivos temporales pequeños, mientras que solo algunos crean archivos grandes, puede ser prudente aumentar globalmente el valor work_mem. Esta acción facilita la mayoría de las consultas para procesar en memoria, por lo que puede evitar operaciones basadas en disco y mejorar la eficacia. Sin embargo, tenga cuidado y supervise siempre el uso de memoria en el servidor para asegurarse de que puede controlar el aumento de work_mem valor.

Determinación del valor mínimo de work_mem para las operaciones de ordenación

Para buscar el valor mínimo work_mem para una consulta específica, especialmente uno que genera archivos de disco temporales durante el proceso de ordenación, comience considerando el tamaño de archivo temporal generado durante la ejecución de la consulta. Por ejemplo, si una consulta genera un archivo temporal de 20 MB:

  1. Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
  2. Establezca un valor work_mem inicial ligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como: SET work_mem TO '25MB'.
  3. Ejecute EXPLAIN ANALYZE en la consulta problemática en la misma sesión.
  4. Revise la salida de "Sort Method: quicksort Memory: xkB". Si indica "external merge Disk: xkB", aumente el valor de work_mem de forma incremental y vuelva a probar hasta que "quicksort Memory" aparezca. La apariencia de "quicksort Memory" indica que la consulta ahora funciona en memoria.
  5. Después de determinar el valor a través de este método, puede aplicarlo globalmente o en niveles más granulares (como se ha descrito anteriormente) para satisfacer sus necesidades operativas.

autovacuum_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático.
Tipo de datos entero
Valor predeterminado -1
Valores permitidos -1-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación autovacuum_work_mem

tipo_de_memoria_compartida_dinámica

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida dinámica usada.
Tipo de datos enumeración
Valor predeterminado posix
Valores permitidos posix
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida_dinámica

hash_mem_multiplier

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Múltiplo de work_mem que se utiliza para las tablas hash.
Tipo de datos numérico
Valor predeterminado 2
Valores permitidos 1-1000
Parameter type (Tipo de parámetro) dinámico
Documentación hash_mem_multiplier

huge_pages

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Habilita o deshabilita el uso de páginas de memoria enormes. Esta configuración no es aplicable a los servidores que tienen menos de 4 núcleos virtuales.
Tipo de datos enumeración
Valor predeterminado try
Valores permitidos on,off,try
Parameter type (Tipo de parámetro) estático
Documentación páginas_grandes

Descripción

Las páginas enormes son una característica que permite administrar la memoria en bloques más grandes. Normalmente, puede administrar bloques de hasta 2 MB, en lugar de las páginas estándar de 4 KB.

El uso de páginas enormes puede ofrecer ventajas de rendimiento que descargan eficazmente la CPU:

  • Reducen la sobrecarga asociada a tareas de administración de memoria, como menos errores de búfer de aspecto de traducción (TLB).
  • Reducen el tiempo necesario para la administración de memoria.

En concreto, en PostgreSQL, solo puede usar páginas enormes para el área de memoria compartida. Se asigna una parte significativa del área de memoria compartida para los búferes compartidos.

Otra ventaja es que las páginas enormes impiden el intercambio del área de memoria compartida fuera del disco, lo que estabiliza aún más el rendimiento.

Recomendaciones

  • En el caso de los servidores que tienen recursos de memoria significativos, evite deshabilitar páginas enormes. Deshabilitar páginas enormes podría poner en peligro el rendimiento.
  • Si comienza con un servidor más pequeño que no admite páginas enormes, pero prevé escalar verticalmente a un servidor que sí, mantenga la huge_pages configuración en TRY para una transición sin problemas y un rendimiento óptimo.

Notas específicas de Azure

En el caso de los servidores con cuatro o más núcleos virtuales, las páginas grandes se asignan automáticamente desde el sistema operativo subyacente. La característica no está disponible para servidores con menos de cuatro núcleos virtuales. El número de páginas enormes se ajusta automáticamente si se cambia cualquier configuración de memoria compartida, incluidas las modificaciones a shared_buffers.

tamaño_de_página_grande

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Tamaño de página enorme que se debe solicitar.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0
Parameter type (Tipo de parámetro) solo lectura
Documentación tamaño_de_página_grande

logical_decoding_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para la descodificación lógica.
Tipo de datos entero
Valor predeterminado 65536
Valores permitidos 64-2147483647
Parameter type (Tipo de parámetro) dinámico
Documentación logical_decoding_work_mem

memoria_de_trabajo_de_mantenimiento

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 1024-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación maintenance_work_mem

Descripción

maintenance_work_mem es un parámetro de configuración en PostgreSQL. Controla la cantidad de memoria asignada para las operaciones de mantenimiento, como VACUUM, CREATE INDEX, y ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservado para tareas que mantienen y optimizan la estructura de la base de datos.

![NOTA] Establecer maintenance_work_mem en valores demasiado agresivos podría provocar periódicamente errores de memoria insuficiente en el sistema. Es muy importante comprender la cantidad de memoria disponible en el servidor y el número de operaciones simultáneas que podrían asignar memoria para las tareas descritas anteriormente, antes de realizar cambios en este parámetro.

Puntos clave

  • Límite de memoria de vacío: Si desea acelerar la limpieza de tuplas inactivas aumentando maintenance_work_mem, tenga en cuenta que VACUUM tiene una limitación integrada para recopilar identificadores de tupla no enviados. Solo puede usar hasta 1 GB de memoria para este proceso.
  • Separación de memoria para autovacuum: Puede usar la configuración autovacuum_work_mem para controlar de forma independiente la memoria que utilizan las operaciones de autovacío. Esta configuración actúa como un subconjunto de maintenance_work_mem. Usted puede decidir cuánta memoria utiliza el autovacuum sin afectar la asignación de memoria para otras tareas de mantenimiento y operaciones de definición de datos.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor maintenance_work_mem se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores de la selección de producto en el proceso que admita el servidor flexible no tendrán ningún efecto en el valor predeterminado del parámetro de servidor maintenance_work_mem de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro maintenance_work_mem según los valores de la siguiente fórmula.

La fórmula usada para calcular el valor de maintenance_work_mem es (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria memoria_de_trabajo_de_mantenimiento
2 GiB 99,328 KiB
4 GiB 157 696 KiB
8 GiB 216 064 KiB
16 GiB 274,432 KiB
32 GiB 332 800 KiB
48 GiB 367,616 KiB
64 GiB 392,192 KiB
80 GiB 410 624 KiB
128 GiB 450 560 KiB
160 GiB 468 992 KiB
192 GiB 484,352 KiB
256 GiB 508,928 KiB
384 GiB 542 720 KiB
432 GiB 552 960 KiB
672 GiB 590,848 KiB

max_prepared_transactions

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de transacciones preparadas simultáneamente. Al ejecutar un servidor de réplica, debe establecer este parámetro en el mismo valor o superior que en el servidor principal.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0-262143
Parameter type (Tipo de parámetro) estático
Documentación max_prepared_transactions (máximo de transacciones preparadas)

max_stack_depth

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la profundidad máxima de la pila, en kilobytes.
Tipo de datos entero
Valor predeterminado 2048
Valores permitidos 2048
Parameter type (Tipo de parámetro) solo lectura
Documentación profundidad máxima de pila

memoria_compartida_dinámica_mínima

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Cantidad de memoria compartida dinámica reservada en el inicio.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0
Parameter type (Tipo de parámetro) solo lectura
Documentación memoria_compartida_dinámica_mínima

shared_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número de búferes de memoria compartidos utilizados por el servidor. La unidad es 8 kb. Los valores permitidos están dentro del intervalo del 10 % - 75 % de la memoria disponible.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 16-1073741823
Parameter type (Tipo de parámetro) estático
Documentación shared_buffers

Descripción

El parámetro de configuración shared_buffers determina la cantidad de memoria del sistema asignada a la base de datos PostgreSQL para almacenar en búfer los datos. Actúa como un grupo de memoria centralizado que es accesible para todos los procesos de base de datos.

Cuando se necesitan datos, el proceso de base de datos comprueba primero el búfer compartido. Si los datos necesarios están presentes, se recuperan rápidamente y se omiten más lecturas de disco que consumen mucho tiempo. Los búferes compartidos sirven como intermediario entre los procesos de base de datos y el disco, y reducen eficazmente el número de operaciones de E/S necesarias.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor shared_buffers se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores a la selección de productos en el cálculo que soporta el servidor flexible no afectan en absoluto al valor por defecto del parámetro de servidor shared_buffers de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro shared_buffers según los valores de las siguientes fórmulas.

En el caso de las máquinas virtuales con hasta 2 GiB de memoria, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 16384.

En el caso de las máquinas virtuales con más de 2 GiB, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 32768.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria shared_buffers
2 GiB 32768
4 GiB 131 072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memoria_compartida

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal.
Tipo de datos enumeración
Valor predeterminado mmap
Valores permitidos mmap
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida

temp_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de búferes temporales que usa cada sesión de base de datos.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 100-1073741823
Parameter type (Tipo de parámetro) dinámico
Documentación temp_buffers

límite_de_uso_del_buffer_de_vacío

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el tamaño del grupo de búferes para VACUUM, ANALYZE y vaciado automático.
Tipo de datos entero
Valor predeterminado 256
Valores permitidos 0-16777216
Parameter type (Tipo de parámetro) dinámico
Documentación límite_de_uso_del_buffer_de_vacío

work_mem (memoria de trabajo)

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la cantidad de memoria que se va a usar en las operaciones de ordenación internas y las tablas hash antes de escribir en los archivos de disco temporales.
Tipo de datos entero
Valor predeterminado 4096
Valores permitidos 4096-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación work_mem

Descripción

El parámetro work_mem de PostgreSQL controla la cantidad de memoria asignada para determinadas operaciones internas dentro del área de memoria privada de cada sesión de base de datos. Algunos ejemplos de estas operaciones son la ordenación y el hash.

A diferencia de los búferes compartidos, que se encuentran en el área de memoria compartida, work_mem se asigna en un espacio de memoria privada por sesión o por consulta. Al establecer un tamaño work_mem adecuado, puede mejorar significativamente la eficacia de estas operaciones y reducir la necesidad de escribir datos temporales en el disco.

Puntos clave

  • Memoria de conexión privada: work_mem forma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida que shared_buffers usa.
  • Uso específico de la consulta: no todas las sesiones o consultas usan work_mem. Es poco probable que las consultas simples como SELECT 1 requieran work_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos de work_mem.
  • Operaciones paralelas: En el caso de las consultas que abarcan varios back-end paralelos, cada back-end podría usar potencialmente uno o varios fragmentos de work_mem.

Supervisión y ajuste de la memoria de trabajo

Es esencial supervisar continuamente el rendimiento del sistema y ajustar work_mem según sea necesario, principalmente si los tiempos de ejecución de consultas relacionados con las operaciones de ordenación o hash son lentos. Estas son las maneras de supervisar el rendimiento mediante herramientas disponibles en Azure Portal:

  • Información de rendimiento de consultas: Compruebe las consultas principales por archivos temporales pestaña para identificar las consultas que generan archivos temporales. Esta situación sugiere una posible necesidad de aumentar work_mem.
  • Guías de solución de problemas: Use la pestaña Archivos temporales altos de las guías de solución de problemas para identificar consultas problemáticas.
Ajuste pormenorizados

Aunque gestiona el parámetro work_mem, es a veces más eficaz adoptar un enfoque de ajuste pormenorizado en lugar de establecer un valor global. Este enfoque garantiza que asigne memoria con criterio en función de las necesidades específicas de los procesos y los usuarios. También minimiza el riesgo de encontrar problemas de memoria insuficiente. Así es como puede hacerlo:

  • nivel de usuario: Si un usuario específico participa principalmente en tareas de agregación o informes, que consumen mucha memoria, considere la posibilidad de personalizar el valor work_mem para ese usuario. Use el comando ALTER ROLE para mejorar el rendimiento de las operaciones del usuario.

  • Nivel de función/procedimiento: Si funciones o procedimientos específicos generan archivos temporales sustanciales, aumentar el valor work_mem en el nivel de función o procedimiento específico puede ser beneficioso. Use el comando ALTER FUNCTION o ALTER PROCEDURE para asignar específicamente más memoria a estas operaciones.

  • Nivel de base de datos: Modifique work_mem en el nivel de base de datos si solo las bases de datos específicas generan un gran número de archivos temporales.

  • Nivel global: Si un análisis del sistema revela que la mayoría de las consultas generan archivos temporales pequeños, mientras que solo algunos crean archivos grandes, puede ser prudente aumentar globalmente el valor work_mem. Esta acción facilita la mayoría de las consultas para procesar en memoria, por lo que puede evitar operaciones basadas en disco y mejorar la eficacia. Sin embargo, tenga cuidado y supervise siempre el uso de memoria en el servidor para asegurarse de que puede controlar el aumento de work_mem valor.

Determinación del valor mínimo de work_mem para las operaciones de ordenación

Para buscar el valor mínimo work_mem para una consulta específica, especialmente uno que genera archivos de disco temporales durante el proceso de ordenación, comience considerando el tamaño de archivo temporal generado durante la ejecución de la consulta. Por ejemplo, si una consulta genera un archivo temporal de 20 MB:

  1. Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
  2. Establezca un valor work_mem inicial ligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como: SET work_mem TO '25MB'.
  3. Ejecute EXPLAIN ANALYZE en la consulta problemática en la misma sesión.
  4. Revise la salida de "Sort Method: quicksort Memory: xkB". Si indica "external merge Disk: xkB", aumente el valor de work_mem de forma incremental y vuelva a probar hasta que "quicksort Memory" aparezca. La apariencia de "quicksort Memory" indica que la consulta ahora funciona en memoria.
  5. Después de determinar el valor a través de este método, puede aplicarlo globalmente o en niveles más granulares (como se ha descrito anteriormente) para satisfacer sus necesidades operativas.

autovacuum_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático.
Tipo de datos entero
Valor predeterminado -1
Valores permitidos -1-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación autovacuum_work_mem

tipo_de_memoria_compartida_dinámica

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida dinámica usada.
Tipo de datos enumeración
Valor predeterminado posix
Valores permitidos posix
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida_dinámica

hash_mem_multiplier

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Múltiplo de work_mem que se utiliza para las tablas hash.
Tipo de datos numérico
Valor predeterminado 2
Valores permitidos 1-1000
Parameter type (Tipo de parámetro) dinámico
Documentación hash_mem_multiplier

huge_pages

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Habilita o deshabilita el uso de páginas de memoria enormes. Esta configuración no es aplicable a los servidores que tienen menos de 4 núcleos virtuales.
Tipo de datos enumeración
Valor predeterminado try
Valores permitidos on,off,try
Parameter type (Tipo de parámetro) estático
Documentación páginas_grandes

Descripción

Las páginas enormes son una característica que permite administrar la memoria en bloques más grandes. Normalmente, puede administrar bloques de hasta 2 MB, en lugar de las páginas estándar de 4 KB.

El uso de páginas enormes puede ofrecer ventajas de rendimiento que descargan eficazmente la CPU:

  • Reducen la sobrecarga asociada a tareas de administración de memoria, como menos errores de búfer de aspecto de traducción (TLB).
  • Reducen el tiempo necesario para la administración de memoria.

En concreto, en PostgreSQL, solo puede usar páginas enormes para el área de memoria compartida. Se asigna una parte significativa del área de memoria compartida para los búferes compartidos.

Otra ventaja es que las páginas enormes impiden el intercambio del área de memoria compartida fuera del disco, lo que estabiliza aún más el rendimiento.

Recomendaciones

  • En el caso de los servidores que tienen recursos de memoria significativos, evite deshabilitar páginas enormes. Deshabilitar páginas enormes podría poner en peligro el rendimiento.
  • Si comienza con un servidor más pequeño que no admite páginas enormes, pero prevé escalar verticalmente a un servidor que sí, mantenga la huge_pages configuración en TRY para una transición sin problemas y un rendimiento óptimo.

Notas específicas de Azure

En el caso de los servidores con cuatro o más núcleos virtuales, las páginas grandes se asignan automáticamente desde el sistema operativo subyacente. La característica no está disponible para servidores con menos de cuatro núcleos virtuales. El número de páginas enormes se ajusta automáticamente si se cambia cualquier configuración de memoria compartida, incluidas las modificaciones a shared_buffers.

tamaño_de_página_grande

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Tamaño de página enorme que se debe solicitar.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0
Parameter type (Tipo de parámetro) solo lectura
Documentación tamaño_de_página_grande

logical_decoding_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para la descodificación lógica.
Tipo de datos entero
Valor predeterminado 65536
Valores permitidos 64-2147483647
Parameter type (Tipo de parámetro) dinámico
Documentación logical_decoding_work_mem

memoria_de_trabajo_de_mantenimiento

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 1024-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación maintenance_work_mem

Descripción

maintenance_work_mem es un parámetro de configuración en PostgreSQL. Controla la cantidad de memoria asignada para las operaciones de mantenimiento, como VACUUM, CREATE INDEX, y ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservado para tareas que mantienen y optimizan la estructura de la base de datos.

![NOTA] Establecer maintenance_work_mem en valores demasiado agresivos podría provocar periódicamente errores de memoria insuficiente en el sistema. Es muy importante comprender la cantidad de memoria disponible en el servidor y el número de operaciones simultáneas que podrían asignar memoria para las tareas descritas anteriormente, antes de realizar cambios en este parámetro.

Puntos clave

  • Límite de memoria de vacío: Si desea acelerar la limpieza de tuplas inactivas aumentando maintenance_work_mem, tenga en cuenta que VACUUM tiene una limitación integrada para recopilar identificadores de tupla no enviados. Solo puede usar hasta 1 GB de memoria para este proceso.
  • Separación de memoria para autovacuum: Puede usar la configuración autovacuum_work_mem para controlar de forma independiente la memoria que utilizan las operaciones de autovacío. Esta configuración actúa como un subconjunto de maintenance_work_mem. Usted puede decidir cuánta memoria utiliza el autovacuum sin afectar la asignación de memoria para otras tareas de mantenimiento y operaciones de definición de datos.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor maintenance_work_mem se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores de la selección de producto en el proceso que admita el servidor flexible no tendrán ningún efecto en el valor predeterminado del parámetro de servidor maintenance_work_mem de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro maintenance_work_mem según los valores de la siguiente fórmula.

La fórmula usada para calcular el valor de maintenance_work_mem es (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria memoria_de_trabajo_de_mantenimiento
2 GiB 99,328 KiB
4 GiB 157 696 KiB
8 GiB 216 064 KiB
16 GiB 274,432 KiB
32 GiB 332 800 KiB
48 GiB 367,616 KiB
64 GiB 392,192 KiB
80 GiB 410 624 KiB
128 GiB 450 560 KiB
160 GiB 468 992 KiB
192 GiB 484,352 KiB
256 GiB 508,928 KiB
384 GiB 542 720 KiB
432 GiB 552 960 KiB
672 GiB 590,848 KiB

max_prepared_transactions (máximo de transacciones preparadas)

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de transacciones preparadas simultáneamente. Al ejecutar un servidor de réplica, debe establecer este parámetro en el mismo valor o superior que en el servidor principal.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0-262143
Parameter type (Tipo de parámetro) estático
Documentación máximo_transacciones_preparadas

max_stack_depth

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la profundidad máxima de la pila, en kilobytes.
Tipo de datos entero
Valor predeterminado 2048
Valores permitidos 2048
Parameter type (Tipo de parámetro) solo lectura
Documentación max_stack_depth

min_dynamic_shared_memory

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Cantidad de memoria compartida dinámica reservada en el inicio.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0
Parameter type (Tipo de parámetro) solo lectura
Documentación memoria_compartida_dinámica_mínima

shared_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número de búferes de memoria compartidos utilizados por el servidor. La unidad es 8 kb. Los valores permitidos están dentro del intervalo del 10 % - 75 % de la memoria disponible.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 16-1073741823
Parameter type (Tipo de parámetro) estático
Documentación shared_buffers

Descripción

El parámetro de configuración shared_buffers determina la cantidad de memoria del sistema asignada a la base de datos PostgreSQL para almacenar en búfer los datos. Actúa como un grupo de memoria centralizado que es accesible para todos los procesos de base de datos.

Cuando se necesitan datos, el proceso de base de datos comprueba primero el búfer compartido. Si los datos necesarios están presentes, se recuperan rápidamente y se omiten más lecturas de disco que consumen mucho tiempo. Los búferes compartidos sirven como intermediario entre los procesos de base de datos y el disco, y reducen eficazmente el número de operaciones de E/S necesarias.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor shared_buffers se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores a la selección de productos en el cálculo que soporta el servidor flexible no afectan en absoluto al valor por defecto del parámetro de servidor shared_buffers de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro shared_buffers según los valores de las siguientes fórmulas.

En el caso de las máquinas virtuales con hasta 2 GiB de memoria, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 16384.

En el caso de las máquinas virtuales con más de 2 GiB, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 32768.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria shared_buffers
2 GiB 32768
4 GiB 131 072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memoria_compartida

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal.
Tipo de datos enumeración
Valor predeterminado mmap
Valores permitidos mmap
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida

temp_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de búferes temporales que usa cada sesión de base de datos.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 100-1073741823
Parameter type (Tipo de parámetro) dinámico
Documentación temp_buffers

work_mem (memoria de trabajo)

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la cantidad de memoria que se va a usar en las operaciones de ordenación internas y las tablas hash antes de escribir en los archivos de disco temporales.
Tipo de datos entero
Valor predeterminado 4096
Valores permitidos 4096-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación work_mem

Descripción

El parámetro work_mem de PostgreSQL controla la cantidad de memoria asignada para determinadas operaciones internas dentro del área de memoria privada de cada sesión de base de datos. Algunos ejemplos de estas operaciones son la ordenación y el hash.

A diferencia de los búferes compartidos, que se encuentran en el área de memoria compartida, work_mem se asigna en un espacio de memoria privada por sesión o por consulta. Al establecer un tamaño work_mem adecuado, puede mejorar significativamente la eficacia de estas operaciones y reducir la necesidad de escribir datos temporales en el disco.

Puntos clave

  • Memoria de conexión privada: work_mem forma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida que shared_buffers usa.
  • Uso específico de la consulta: no todas las sesiones o consultas usan work_mem. Es poco probable que las consultas simples como SELECT 1 requieran work_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos de work_mem.
  • Operaciones paralelas: En el caso de las consultas que abarcan varios back-end paralelos, cada back-end podría usar potencialmente uno o varios fragmentos de work_mem.

Supervisión y ajuste de la memoria de trabajo

Es esencial supervisar continuamente el rendimiento del sistema y ajustar work_mem según sea necesario, principalmente si los tiempos de ejecución de consultas relacionados con las operaciones de ordenación o hash son lentos. Estas son las maneras de supervisar el rendimiento mediante herramientas disponibles en Azure Portal:

  • Información de rendimiento de consultas: Compruebe las consultas principales por archivos temporales pestaña para identificar las consultas que generan archivos temporales. Esta situación sugiere una posible necesidad de aumentar work_mem.
  • Guías de solución de problemas: Use la pestaña Archivos temporales altos de las guías de solución de problemas para identificar consultas problemáticas.
Ajuste pormenorizados

Aunque gestiona el parámetro work_mem, es a veces más eficaz adoptar un enfoque de ajuste pormenorizado en lugar de establecer un valor global. Este enfoque garantiza que asigne memoria con criterio en función de las necesidades específicas de los procesos y los usuarios. También minimiza el riesgo de encontrar problemas de memoria insuficiente. Así es como puede hacerlo:

  • nivel de usuario: Si un usuario específico participa principalmente en tareas de agregación o informes, que consumen mucha memoria, considere la posibilidad de personalizar el valor work_mem para ese usuario. Use el comando ALTER ROLE para mejorar el rendimiento de las operaciones del usuario.

  • Nivel de función/procedimiento: Si funciones o procedimientos específicos generan archivos temporales sustanciales, aumentar el valor work_mem en el nivel de función o procedimiento específico puede ser beneficioso. Use el comando ALTER FUNCTION o ALTER PROCEDURE para asignar específicamente más memoria a estas operaciones.

  • Nivel de base de datos: Modifique work_mem en el nivel de base de datos si solo las bases de datos específicas generan un gran número de archivos temporales.

  • Nivel global: Si un análisis del sistema revela que la mayoría de las consultas generan archivos temporales pequeños, mientras que solo algunos crean archivos grandes, puede ser prudente aumentar globalmente el valor work_mem. Esta acción facilita la mayoría de las consultas para procesar en memoria, por lo que puede evitar operaciones basadas en disco y mejorar la eficacia. Sin embargo, tenga cuidado y supervise siempre el uso de memoria en el servidor para asegurarse de que puede controlar el aumento de work_mem valor.

Determinación del valor mínimo de work_mem para las operaciones de ordenación

Para buscar el valor mínimo work_mem para una consulta específica, especialmente uno que genera archivos de disco temporales durante el proceso de ordenación, comience considerando el tamaño de archivo temporal generado durante la ejecución de la consulta. Por ejemplo, si una consulta genera un archivo temporal de 20 MB:

  1. Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
  2. Establezca un valor work_mem inicial ligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como: SET work_mem TO '25MB'.
  3. Ejecute EXPLAIN ANALYZE en la consulta problemática en la misma sesión.
  4. Revise la salida de "Sort Method: quicksort Memory: xkB". Si indica "external merge Disk: xkB", aumente el valor de work_mem de forma incremental y vuelva a probar hasta que "quicksort Memory" aparezca. La apariencia de "quicksort Memory" indica que la consulta ahora funciona en memoria.
  5. Después de determinar el valor a través de este método, puede aplicarlo globalmente o en niveles más granulares (como se ha descrito anteriormente) para satisfacer sus necesidades operativas.

autovacuum_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático.
Tipo de datos entero
Valor predeterminado -1
Valores permitidos -1-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación autovacuum_work_mem

tipo_de_memoria_compartida_dinámica

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida dinámica usada.
Tipo de datos enumeración
Valor predeterminado posix
Valores permitidos posix
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida_dinámica

hash_mem_multiplier

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Múltiplo de work_mem que se utiliza para las tablas hash.
Tipo de datos numérico
Valor predeterminado 1
Valores permitidos 1-1000
Parameter type (Tipo de parámetro) dinámico
Documentación hash_mem_multiplier

huge_pages

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Habilita o deshabilita el uso de páginas de memoria enormes. Esta configuración no es aplicable a los servidores que tienen menos de 4 núcleos virtuales.
Tipo de datos enumeración
Valor predeterminado try
Valores permitidos on,off,try
Parameter type (Tipo de parámetro) estático
Documentación huge_pages

Descripción

Las páginas enormes son una característica que permite administrar la memoria en bloques más grandes. Normalmente, puede administrar bloques de hasta 2 MB, en lugar de las páginas estándar de 4 KB.

El uso de páginas enormes puede ofrecer ventajas de rendimiento que descargan eficazmente la CPU:

  • Reducen la sobrecarga asociada a tareas de administración de memoria, como menos errores de búfer de aspecto de traducción (TLB).
  • Reducen el tiempo necesario para la administración de memoria.

En concreto, en PostgreSQL, solo puede usar páginas enormes para el área de memoria compartida. Se asigna una parte significativa del área de memoria compartida para los búferes compartidos.

Otra ventaja es que las páginas enormes impiden el intercambio del área de memoria compartida fuera del disco, lo que estabiliza aún más el rendimiento.

Recomendaciones

  • En el caso de los servidores que tienen recursos de memoria significativos, evite deshabilitar páginas enormes. Deshabilitar páginas enormes podría poner en peligro el rendimiento.
  • Si comienza con un servidor más pequeño que no admite páginas enormes, pero prevé escalar verticalmente a un servidor que sí, mantenga la huge_pages configuración en TRY para una transición sin problemas y un rendimiento óptimo.

Notas específicas de Azure

En el caso de los servidores con cuatro o más núcleos virtuales, las páginas grandes se asignan automáticamente desde el sistema operativo subyacente. La característica no está disponible para servidores con menos de cuatro núcleos virtuales. El número de páginas enormes se ajusta automáticamente si se cambia cualquier configuración de memoria compartida, incluidas las modificaciones a shared_buffers.

tamaño_de_página_grande

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Tamaño de página enorme que se debe solicitar.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0
Parameter type (Tipo de parámetro) solo lectura
Documentación tamaño_de_página_grande

logical_decoding_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para la descodificación lógica.
Tipo de datos entero
Valor predeterminado 65536
Valores permitidos 64-2147483647
Parameter type (Tipo de parámetro) dinámico
Documentación logical_decoding_work_mem

memoria_de_trabajo_de_mantenimiento

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 1024-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación maintenance_work_mem

Descripción

maintenance_work_mem es un parámetro de configuración en PostgreSQL. Controla la cantidad de memoria asignada para las operaciones de mantenimiento, como VACUUM, CREATE INDEX, y ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservado para tareas que mantienen y optimizan la estructura de la base de datos.

![NOTA] Establecer maintenance_work_mem en valores demasiado agresivos podría provocar periódicamente errores de memoria insuficiente en el sistema. Es muy importante comprender la cantidad de memoria disponible en el servidor y el número de operaciones simultáneas que podrían asignar memoria para las tareas descritas anteriormente, antes de realizar cambios en este parámetro.

Puntos clave

  • Límite de memoria de vacío: Si desea acelerar la limpieza de tuplas inactivas aumentando maintenance_work_mem, tenga en cuenta que VACUUM tiene una limitación integrada para recopilar identificadores de tupla no enviados. Solo puede usar hasta 1 GB de memoria para este proceso.
  • Separación de memoria para autovacuum: Puede usar la configuración autovacuum_work_mem para controlar de forma independiente la memoria que utilizan las operaciones de autovacío. Esta configuración actúa como un subconjunto de maintenance_work_mem. Usted puede decidir cuánta memoria utiliza el autovacuum sin afectar la asignación de memoria para otras tareas de mantenimiento y operaciones de definición de datos.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor maintenance_work_mem se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores de la selección de producto en el proceso que admita el servidor flexible no tendrán ningún efecto en el valor predeterminado del parámetro de servidor maintenance_work_mem de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro maintenance_work_mem según los valores de la siguiente fórmula.

La fórmula usada para calcular el valor de maintenance_work_mem es (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria memoria_de_trabajo_de_mantenimiento
2 GiB 99,328 KiB
4 GiB 157 696 KiB
8 GiB 216 064 KiB
16 GiB 274,432 KiB
32 GiB 332 800 KiB
48 GiB 367,616 KiB
64 GiB 392,192 KiB
80 GiB 410 624 KiB
128 GiB 450 560 KiB
160 GiB 468 992 KiB
192 GiB 484,352 KiB
256 GiB 508,928 KiB
384 GiB 542 720 KiB
432 GiB 552 960 KiB
672 GiB 590,848 KiB

max_prepared_transactions

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de transacciones preparadas simultáneamente. Al ejecutar un servidor de réplica, debe establecer este parámetro en el mismo valor o superior que en el servidor principal.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0-262143
Parameter type (Tipo de parámetro) estático
Documentación max_prepared_transactions

max_stack_depth

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la profundidad máxima de la pila, en kilobytes.
Tipo de datos entero
Valor predeterminado 2048
Valores permitidos 2048
Parameter type (Tipo de parámetro) solo lectura
Documentación max_stack_depth

min_dynamic_shared_memory

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Cantidad de memoria compartida dinámica reservada en el inicio.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0
Parameter type (Tipo de parámetro) solo lectura
Documentación memoria_compartida_dinámica_mínima

shared_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número de búferes de memoria compartidos utilizados por el servidor. La unidad es 8 kb. Los valores permitidos están dentro del intervalo del 10 % - 75 % de la memoria disponible.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 16-1073741823
Parameter type (Tipo de parámetro) estático
Documentación shared_buffers

Descripción

El parámetro de configuración shared_buffers determina la cantidad de memoria del sistema asignada a la base de datos PostgreSQL para almacenar en búfer los datos. Actúa como un grupo de memoria centralizado que es accesible para todos los procesos de base de datos.

Cuando se necesitan datos, el proceso de base de datos comprueba primero el búfer compartido. Si los datos necesarios están presentes, se recuperan rápidamente y se omiten más lecturas de disco que consumen mucho tiempo. Los búferes compartidos sirven como intermediario entre los procesos de base de datos y el disco, y reducen eficazmente el número de operaciones de E/S necesarias.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor shared_buffers se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores a la selección de productos en el cálculo que soporta el servidor flexible no afectan en absoluto al valor por defecto del parámetro de servidor shared_buffers de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro shared_buffers según los valores de las siguientes fórmulas.

En el caso de las máquinas virtuales con hasta 2 GiB de memoria, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 16384.

En el caso de las máquinas virtuales con más de 2 GiB, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 32768.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria shared_buffers
2 GiB 32768
4 GiB 131 072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memoria_compartida

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal.
Tipo de datos enumeración
Valor predeterminado mmap
Valores permitidos mmap
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida

temp_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de búferes temporales que usa cada sesión de base de datos.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 100-1073741823
Parameter type (Tipo de parámetro) dinámico
Documentación temp_buffers

work_mem (memoria de trabajo)

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la cantidad de memoria que se va a usar en las operaciones de ordenación internas y las tablas hash antes de escribir en los archivos de disco temporales.
Tipo de datos entero
Valor predeterminado 4096
Valores permitidos 4096-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación work_mem

Descripción

El parámetro work_mem de PostgreSQL controla la cantidad de memoria asignada para determinadas operaciones internas dentro del área de memoria privada de cada sesión de base de datos. Algunos ejemplos de estas operaciones son la ordenación y el hash.

A diferencia de los búferes compartidos, que se encuentran en el área de memoria compartida, work_mem se asigna en un espacio de memoria privada por sesión o por consulta. Al establecer un tamaño work_mem adecuado, puede mejorar significativamente la eficacia de estas operaciones y reducir la necesidad de escribir datos temporales en el disco.

Puntos clave

  • Memoria de conexión privada: work_mem forma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida que shared_buffers usa.
  • Uso específico de la consulta: no todas las sesiones o consultas usan work_mem. Es poco probable que las consultas simples como SELECT 1 requieran work_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos de work_mem.
  • Operaciones paralelas: En el caso de las consultas que abarcan varios back-end paralelos, cada back-end podría usar potencialmente uno o varios fragmentos de work_mem.

Supervisión y ajuste de la memoria de trabajo

Es esencial supervisar continuamente el rendimiento del sistema y ajustar work_mem según sea necesario, principalmente si los tiempos de ejecución de consultas relacionados con las operaciones de ordenación o hash son lentos. Estas son las maneras de supervisar el rendimiento mediante herramientas disponibles en Azure Portal:

  • Información de rendimiento de consultas: Compruebe las consultas principales por archivos temporales pestaña para identificar las consultas que generan archivos temporales. Esta situación sugiere una posible necesidad de aumentar work_mem.
  • Guías de solución de problemas: Use la pestaña Archivos temporales altos de las guías de solución de problemas para identificar consultas problemáticas.
Ajuste pormenorizados

Aunque gestiona el parámetro work_mem, es a veces más eficaz adoptar un enfoque de ajuste pormenorizado en lugar de establecer un valor global. Este enfoque garantiza que asigne memoria con criterio en función de las necesidades específicas de los procesos y los usuarios. También minimiza el riesgo de encontrar problemas de memoria insuficiente. Así es como puede hacerlo:

  • nivel de usuario: Si un usuario específico participa principalmente en tareas de agregación o informes, que consumen mucha memoria, considere la posibilidad de personalizar el valor work_mem para ese usuario. Use el comando ALTER ROLE para mejorar el rendimiento de las operaciones del usuario.

  • Nivel de función/procedimiento: Si funciones o procedimientos específicos generan archivos temporales sustanciales, aumentar el valor work_mem en el nivel de función o procedimiento específico puede ser beneficioso. Use el comando ALTER FUNCTION o ALTER PROCEDURE para asignar específicamente más memoria a estas operaciones.

  • Nivel de base de datos: Modifique work_mem en el nivel de base de datos si solo las bases de datos específicas generan un gran número de archivos temporales.

  • Nivel global: Si un análisis del sistema revela que la mayoría de las consultas generan archivos temporales pequeños, mientras que solo algunos crean archivos grandes, puede ser prudente aumentar globalmente el valor work_mem. Esta acción facilita la mayoría de las consultas para procesar en memoria, por lo que puede evitar operaciones basadas en disco y mejorar la eficacia. Sin embargo, tenga cuidado y supervise siempre el uso de memoria en el servidor para asegurarse de que puede controlar el aumento de work_mem valor.

Determinación del valor mínimo de work_mem para las operaciones de ordenación

Para buscar el valor mínimo work_mem para una consulta específica, especialmente uno que genera archivos de disco temporales durante el proceso de ordenación, comience considerando el tamaño de archivo temporal generado durante la ejecución de la consulta. Por ejemplo, si una consulta genera un archivo temporal de 20 MB:

  1. Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
  2. Establezca un valor work_mem inicial ligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como: SET work_mem TO '25MB'.
  3. Ejecute EXPLAIN ANALYZE en la consulta problemática en la misma sesión.
  4. Revise la salida de "Sort Method: quicksort Memory: xkB". Si indica "external merge Disk: xkB", aumente el valor de work_mem de forma incremental y vuelva a probar hasta que "quicksort Memory" aparezca. La apariencia de "quicksort Memory" indica que la consulta ahora funciona en memoria.
  5. Después de determinar el valor a través de este método, puede aplicarlo globalmente o en niveles más granulares (como se ha descrito anteriormente) para satisfacer sus necesidades operativas.

autovacuum_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático.
Tipo de datos entero
Valor predeterminado -1
Valores permitidos -1-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación autovacuum_work_mem

tipo_de_memoria_compartida_dinámica

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida dinámica usada.
Tipo de datos enumeración
Valor predeterminado posix
Valores permitidos posix
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida_dinámica

hash_mem_multiplier

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Múltiplo de work_mem que se utiliza para las tablas hash.
Tipo de datos numérico
Valor predeterminado 1
Valores permitidos 1-1000
Parameter type (Tipo de parámetro) dinámico
Documentación hash_mem_multiplier

huge_pages

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Habilita o deshabilita el uso de páginas de memoria enormes. Esta configuración no es aplicable a los servidores que tienen menos de 4 núcleos virtuales.
Tipo de datos enumeración
Valor predeterminado try
Valores permitidos on,off,try
Parameter type (Tipo de parámetro) estático
Documentación páginas grandes

Descripción

Las páginas enormes son una característica que permite administrar la memoria en bloques más grandes. Normalmente, puede administrar bloques de hasta 2 MB, en lugar de las páginas estándar de 4 KB.

El uso de páginas enormes puede ofrecer ventajas de rendimiento que descargan eficazmente la CPU:

  • Reducen la sobrecarga asociada a tareas de administración de memoria, como menos errores de búfer de aspecto de traducción (TLB).
  • Reducen el tiempo necesario para la administración de memoria.

En concreto, en PostgreSQL, solo puede usar páginas enormes para el área de memoria compartida. Se asigna una parte significativa del área de memoria compartida para los búferes compartidos.

Otra ventaja es que las páginas enormes impiden el intercambio del área de memoria compartida fuera del disco, lo que estabiliza aún más el rendimiento.

Recomendaciones

  • En el caso de los servidores que tienen recursos de memoria significativos, evite deshabilitar páginas enormes. Deshabilitar páginas enormes podría poner en peligro el rendimiento.
  • Si comienza con un servidor más pequeño que no admite páginas enormes, pero prevé escalar verticalmente a un servidor que sí, mantenga la huge_pages configuración en TRY para una transición sin problemas y un rendimiento óptimo.

Notas específicas de Azure

En el caso de los servidores con cuatro o más núcleos virtuales, las páginas grandes se asignan automáticamente desde el sistema operativo subyacente. La característica no está disponible para servidores con menos de cuatro núcleos virtuales. El número de páginas enormes se ajusta automáticamente si se cambia cualquier configuración de memoria compartida, incluidas las modificaciones a shared_buffers.

logical_decoding_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para la descodificación lógica.
Tipo de datos entero
Valor predeterminado 65536
Valores permitidos 64-2147483647
Parameter type (Tipo de parámetro) dinámico
Documentación logical_decoding_work_mem

memoria_de_trabajo_de_mantenimiento

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 1024-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación maintenance_work_mem

Descripción

maintenance_work_mem es un parámetro de configuración en PostgreSQL. Controla la cantidad de memoria asignada para las operaciones de mantenimiento, como VACUUM, CREATE INDEX, y ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservado para tareas que mantienen y optimizan la estructura de la base de datos.

![NOTA] Establecer maintenance_work_mem en valores demasiado agresivos podría provocar periódicamente errores de memoria insuficiente en el sistema. Es muy importante comprender la cantidad de memoria disponible en el servidor y el número de operaciones simultáneas que podrían asignar memoria para las tareas descritas anteriormente, antes de realizar cambios en este parámetro.

Puntos clave

  • Límite de memoria de vacío: Si desea acelerar la limpieza de tuplas inactivas aumentando maintenance_work_mem, tenga en cuenta que VACUUM tiene una limitación integrada para recopilar identificadores de tupla no enviados. Solo puede usar hasta 1 GB de memoria para este proceso.
  • Separación de memoria para autovacuum: Puede usar la configuración autovacuum_work_mem para controlar de forma independiente la memoria que utilizan las operaciones de autovacío. Esta configuración actúa como un subconjunto de maintenance_work_mem. Usted puede decidir cuánta memoria utiliza el autovacuum sin afectar la asignación de memoria para otras tareas de mantenimiento y operaciones de definición de datos.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor maintenance_work_mem se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores de la selección de producto en el proceso que admita el servidor flexible no tendrán ningún efecto en el valor predeterminado del parámetro de servidor maintenance_work_mem de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro maintenance_work_mem según los valores de la siguiente fórmula.

La fórmula usada para calcular el valor de maintenance_work_mem es (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria memoria_de_trabajo_de_mantenimiento
2 GiB 99,328 KiB
4 GiB 157 696 KiB
8 GiB 216 064 KiB
16 GiB 274,432 KiB
32 GiB 332 800 KiB
48 GiB 367,616 KiB
64 GiB 392,192 KiB
80 GiB 410 624 KiB
128 GiB 450 560 KiB
160 GiB 468 992 KiB
192 GiB 484,352 KiB
256 GiB 508,928 KiB
384 GiB 542 720 KiB
432 GiB 552 960 KiB
672 GiB 590,848 KiB

max_prepared_transactions

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de transacciones preparadas simultáneamente. Al ejecutar un servidor de réplica, debe establecer este parámetro en el mismo valor o superior que en el servidor principal.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0-262143
Parameter type (Tipo de parámetro) estático
Documentación max_prepared_transactions

max_stack_depth

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la profundidad máxima de la pila, en kilobytes.
Tipo de datos entero
Valor predeterminado 2048
Valores permitidos 2048
Parameter type (Tipo de parámetro) solo lectura
Documentación max_stack_depth

shared_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número de búferes de memoria compartidos utilizados por el servidor. La unidad es 8 kb. Los valores permitidos están dentro del intervalo del 10 % - 75 % de la memoria disponible.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 16-1073741823
Parameter type (Tipo de parámetro) estático
Documentación shared_buffers

Descripción

El parámetro de configuración shared_buffers determina la cantidad de memoria del sistema asignada a la base de datos PostgreSQL para almacenar en búfer los datos. Actúa como un grupo de memoria centralizado que es accesible para todos los procesos de base de datos.

Cuando se necesitan datos, el proceso de base de datos comprueba primero el búfer compartido. Si los datos necesarios están presentes, se recuperan rápidamente y se omiten más lecturas de disco que consumen mucho tiempo. Los búferes compartidos sirven como intermediario entre los procesos de base de datos y el disco, y reducen eficazmente el número de operaciones de E/S necesarias.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor shared_buffers se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores a la selección de productos en el cálculo que soporta el servidor flexible no afectan en absoluto al valor por defecto del parámetro de servidor shared_buffers de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro shared_buffers según los valores de las siguientes fórmulas.

En el caso de las máquinas virtuales con hasta 2 GiB de memoria, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 16384.

En el caso de las máquinas virtuales con más de 2 GiB, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 32768.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria shared_buffers
2 GiB 32768
4 GiB 131 072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memoria_compartida

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal.
Tipo de datos enumeración
Valor predeterminado mmap
Valores permitidos mmap
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida

temp_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de búferes temporales que usa cada sesión de base de datos.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 100-1073741823
Parameter type (Tipo de parámetro) dinámico
Documentación temp_buffers

work_mem (memoria de trabajo)

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la cantidad de memoria que se va a usar en las operaciones de ordenación internas y las tablas hash antes de escribir en los archivos de disco temporales.
Tipo de datos entero
Valor predeterminado 4096
Valores permitidos 4096-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación work_mem

Descripción

El parámetro work_mem de PostgreSQL controla la cantidad de memoria asignada para determinadas operaciones internas dentro del área de memoria privada de cada sesión de base de datos. Algunos ejemplos de estas operaciones son la ordenación y el hash.

A diferencia de los búferes compartidos, que se encuentran en el área de memoria compartida, work_mem se asigna en un espacio de memoria privada por sesión o por consulta. Al establecer un tamaño work_mem adecuado, puede mejorar significativamente la eficacia de estas operaciones y reducir la necesidad de escribir datos temporales en el disco.

Puntos clave

  • Memoria de conexión privada: work_mem forma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida que shared_buffers usa.
  • Uso específico de la consulta: no todas las sesiones o consultas usan work_mem. Es poco probable que las consultas simples como SELECT 1 requieran work_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos de work_mem.
  • Operaciones paralelas: En el caso de las consultas que abarcan varios back-end paralelos, cada back-end podría usar potencialmente uno o varios fragmentos de work_mem.

Supervisión y ajuste de la memoria de trabajo

Es esencial supervisar continuamente el rendimiento del sistema y ajustar work_mem según sea necesario, principalmente si los tiempos de ejecución de consultas relacionados con las operaciones de ordenación o hash son lentos. Estas son las maneras de supervisar el rendimiento mediante herramientas disponibles en Azure Portal:

  • Información de rendimiento de consultas: Compruebe las consultas principales por archivos temporales pestaña para identificar las consultas que generan archivos temporales. Esta situación sugiere una posible necesidad de aumentar work_mem.
  • Guías de solución de problemas: Use la pestaña Archivos temporales altos de las guías de solución de problemas para identificar consultas problemáticas.
Ajuste pormenorizados

Aunque gestiona el parámetro work_mem, es a veces más eficaz adoptar un enfoque de ajuste pormenorizado en lugar de establecer un valor global. Este enfoque garantiza que asigne memoria con criterio en función de las necesidades específicas de los procesos y los usuarios. También minimiza el riesgo de encontrar problemas de memoria insuficiente. Así es como puede hacerlo:

  • nivel de usuario: Si un usuario específico participa principalmente en tareas de agregación o informes, que consumen mucha memoria, considere la posibilidad de personalizar el valor work_mem para ese usuario. Use el comando ALTER ROLE para mejorar el rendimiento de las operaciones del usuario.

  • Nivel de función/procedimiento: Si funciones o procedimientos específicos generan archivos temporales sustanciales, aumentar el valor work_mem en el nivel de función o procedimiento específico puede ser beneficioso. Use el comando ALTER FUNCTION o ALTER PROCEDURE para asignar específicamente más memoria a estas operaciones.

  • Nivel de base de datos: Modifique work_mem en el nivel de base de datos si solo las bases de datos específicas generan un gran número de archivos temporales.

  • Nivel global: Si un análisis del sistema revela que la mayoría de las consultas generan archivos temporales pequeños, mientras que solo algunos crean archivos grandes, puede ser prudente aumentar globalmente el valor work_mem. Esta acción facilita la mayoría de las consultas para procesar en memoria, por lo que puede evitar operaciones basadas en disco y mejorar la eficacia. Sin embargo, tenga cuidado y supervise siempre el uso de memoria en el servidor para asegurarse de que puede controlar el aumento de work_mem valor.

Determinación del valor mínimo de work_mem para las operaciones de ordenación

Para buscar el valor mínimo work_mem para una consulta específica, especialmente uno que genera archivos de disco temporales durante el proceso de ordenación, comience considerando el tamaño de archivo temporal generado durante la ejecución de la consulta. Por ejemplo, si una consulta genera un archivo temporal de 20 MB:

  1. Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
  2. Establezca un valor work_mem inicial ligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como: SET work_mem TO '25MB'.
  3. Ejecute EXPLAIN ANALYZE en la consulta problemática en la misma sesión.
  4. Revise la salida de "Sort Method: quicksort Memory: xkB". Si indica "external merge Disk: xkB", aumente el valor de work_mem de forma incremental y vuelva a probar hasta que "quicksort Memory" aparezca. La apariencia de "quicksort Memory" indica que la consulta ahora funciona en memoria.
  5. Después de determinar el valor a través de este método, puede aplicarlo globalmente o en niveles más granulares (como se ha descrito anteriormente) para satisfacer sus necesidades operativas.

autovacuum_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático.
Tipo de datos entero
Valor predeterminado -1
Valores permitidos -1-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación autovacuum_work_mem

tipo_de_memoria_compartida_dinámica

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida dinámica usada.
Tipo de datos enumeración
Valor predeterminado posix
Valores permitidos posix
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida_dinámica

hash_mem_multiplier

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Múltiplo de work_mem que se utiliza para las tablas hash.
Tipo de datos numérico
Valor predeterminado 1
Valores permitidos 1-1000
Parameter type (Tipo de parámetro) dinámico
Documentación hash_mem_multiplier

huge_pages

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Habilita o deshabilita el uso de páginas de memoria enormes. Esta configuración no es aplicable a los servidores que tienen menos de 4 núcleos virtuales.
Tipo de datos enumeración
Valor predeterminado try
Valores permitidos on,off,try
Parameter type (Tipo de parámetro) estático
Documentación huge_pages

Descripción

Las páginas enormes son una característica que permite administrar la memoria en bloques más grandes. Normalmente, puede administrar bloques de hasta 2 MB, en lugar de las páginas estándar de 4 KB.

El uso de páginas enormes puede ofrecer ventajas de rendimiento que descargan eficazmente la CPU:

  • Reducen la sobrecarga asociada a tareas de administración de memoria, como menos errores de búfer de aspecto de traducción (TLB).
  • Reducen el tiempo necesario para la administración de memoria.

En concreto, en PostgreSQL, solo puede usar páginas enormes para el área de memoria compartida. Se asigna una parte significativa del área de memoria compartida para los búferes compartidos.

Otra ventaja es que las páginas enormes impiden el intercambio del área de memoria compartida fuera del disco, lo que estabiliza aún más el rendimiento.

Recomendaciones

  • En el caso de los servidores que tienen recursos de memoria significativos, evite deshabilitar páginas enormes. Deshabilitar páginas enormes podría poner en peligro el rendimiento.
  • Si comienza con un servidor más pequeño que no admite páginas enormes, pero prevé escalar verticalmente a un servidor que sí, mantenga la huge_pages configuración en TRY para una transición sin problemas y un rendimiento óptimo.

Notas específicas de Azure

En el caso de los servidores con cuatro o más núcleos virtuales, las páginas grandes se asignan automáticamente desde el sistema operativo subyacente. La característica no está disponible para servidores con menos de cuatro núcleos virtuales. El número de páginas enormes se ajusta automáticamente si se cambia cualquier configuración de memoria compartida, incluidas las modificaciones a shared_buffers.

memoria_de_trabajo_de_mantenimiento

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 1024-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación maintenance_work_mem

Descripción

maintenance_work_mem es un parámetro de configuración en PostgreSQL. Controla la cantidad de memoria asignada para las operaciones de mantenimiento, como VACUUM, CREATE INDEX, y ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservado para tareas que mantienen y optimizan la estructura de la base de datos.

![NOTA] Establecer maintenance_work_mem en valores demasiado agresivos podría provocar periódicamente errores de memoria insuficiente en el sistema. Es muy importante comprender la cantidad de memoria disponible en el servidor y el número de operaciones simultáneas que podrían asignar memoria para las tareas descritas anteriormente, antes de realizar cambios en este parámetro.

Puntos clave

  • Límite de memoria de vacío: Si desea acelerar la limpieza de tuplas inactivas aumentando maintenance_work_mem, tenga en cuenta que VACUUM tiene una limitación integrada para recopilar identificadores de tupla no enviados. Solo puede usar hasta 1 GB de memoria para este proceso.
  • Separación de memoria para autovacuum: Puede usar la configuración autovacuum_work_mem para controlar de forma independiente la memoria que utilizan las operaciones de autovacío. Esta configuración actúa como un subconjunto de maintenance_work_mem. Usted puede decidir cuánta memoria utiliza el autovacuum sin afectar la asignación de memoria para otras tareas de mantenimiento y operaciones de definición de datos.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor maintenance_work_mem se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores de la selección de producto en el proceso que admita el servidor flexible no tendrán ningún efecto en el valor predeterminado del parámetro de servidor maintenance_work_mem de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro maintenance_work_mem según los valores de la siguiente fórmula.

La fórmula usada para calcular el valor de maintenance_work_mem es (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria memoria_de_trabajo_de_mantenimiento
2 GiB 99,328 KiB
4 GiB 157 696 KiB
8 GiB 216 064 KiB
16 GiB 274,432 KiB
32 GiB 332 800 KiB
48 GiB 367,616 KiB
64 GiB 392,192 KiB
80 GiB 410 624 KiB
128 GiB 450 560 KiB
160 GiB 468 992 KiB
192 GiB 484,352 KiB
256 GiB 508,928 KiB
384 GiB 542 720 KiB
432 GiB 552 960 KiB
672 GiB 590,848 KiB

max_prepared_transactions

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de transacciones preparadas simultáneamente. Al ejecutar un servidor de réplica, debe establecer este parámetro en el mismo valor o superior que en el servidor principal.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0-262143
Parameter type (Tipo de parámetro) estático
Documentación max_prepared_transactions

max_stack_depth

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la profundidad máxima de la pila, en kilobytes.
Tipo de datos entero
Valor predeterminado 2048
Valores permitidos 2048
Parameter type (Tipo de parámetro) solo lectura
Documentación max_stack_depth

shared_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número de búferes de memoria compartidos utilizados por el servidor. La unidad es 8 kb. Los valores permitidos están dentro del intervalo del 10 % - 75 % de la memoria disponible.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 16-1073741823
Parameter type (Tipo de parámetro) estático
Documentación shared_buffers

Descripción

El parámetro de configuración shared_buffers determina la cantidad de memoria del sistema asignada a la base de datos PostgreSQL para almacenar en búfer los datos. Actúa como un grupo de memoria centralizado que es accesible para todos los procesos de base de datos.

Cuando se necesitan datos, el proceso de base de datos comprueba primero el búfer compartido. Si los datos necesarios están presentes, se recuperan rápidamente y se omiten más lecturas de disco que consumen mucho tiempo. Los búferes compartidos sirven como intermediario entre los procesos de base de datos y el disco, y reducen eficazmente el número de operaciones de E/S necesarias.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor shared_buffers se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores a la selección de productos en el cálculo que soporta el servidor flexible no afectan en absoluto al valor por defecto del parámetro de servidor shared_buffers de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro shared_buffers según los valores de las siguientes fórmulas.

En el caso de las máquinas virtuales con hasta 2 GiB de memoria, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 16384.

En el caso de las máquinas virtuales con más de 2 GiB, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 32768.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria shared_buffers
2 GiB 32768
4 GiB 131 072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memoria_compartida

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal.
Tipo de datos enumeración
Valor predeterminado mmap
Valores permitidos mmap
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida

temp_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de búferes temporales que usa cada sesión de base de datos.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 100-1073741823
Parameter type (Tipo de parámetro) dinámico
Documentación temp_buffers

work_mem (memoria de trabajo)

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la cantidad de memoria que se va a usar en las operaciones de ordenación internas y las tablas hash antes de escribir en los archivos de disco temporales.
Tipo de datos entero
Valor predeterminado 4096
Valores permitidos 4096-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación work_mem

Descripción

El parámetro work_mem de PostgreSQL controla la cantidad de memoria asignada para determinadas operaciones internas dentro del área de memoria privada de cada sesión de base de datos. Algunos ejemplos de estas operaciones son la ordenación y el hash.

A diferencia de los búferes compartidos, que se encuentran en el área de memoria compartida, work_mem se asigna en un espacio de memoria privada por sesión o por consulta. Al establecer un tamaño work_mem adecuado, puede mejorar significativamente la eficacia de estas operaciones y reducir la necesidad de escribir datos temporales en el disco.

Puntos clave

  • Memoria de conexión privada: work_mem forma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida que shared_buffers usa.
  • Uso específico de la consulta: no todas las sesiones o consultas usan work_mem. Es poco probable que las consultas simples como SELECT 1 requieran work_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos de work_mem.
  • Operaciones paralelas: En el caso de las consultas que abarcan varios back-end paralelos, cada back-end podría usar potencialmente uno o varios fragmentos de work_mem.

Supervisión y ajuste de la memoria de trabajo

Es esencial supervisar continuamente el rendimiento del sistema y ajustar work_mem según sea necesario, principalmente si los tiempos de ejecución de consultas relacionados con las operaciones de ordenación o hash son lentos. Estas son las maneras de supervisar el rendimiento mediante herramientas disponibles en Azure Portal:

  • Información de rendimiento de consultas: Compruebe las consultas principales por archivos temporales pestaña para identificar las consultas que generan archivos temporales. Esta situación sugiere una posible necesidad de aumentar work_mem.
  • Guías de solución de problemas: Use la pestaña Archivos temporales altos de las guías de solución de problemas para identificar consultas problemáticas.
Ajuste pormenorizados

Aunque gestiona el parámetro work_mem, es a veces más eficaz adoptar un enfoque de ajuste pormenorizado en lugar de establecer un valor global. Este enfoque garantiza que asigne memoria con criterio en función de las necesidades específicas de los procesos y los usuarios. También minimiza el riesgo de encontrar problemas de memoria insuficiente. Así es como puede hacerlo:

  • nivel de usuario: Si un usuario específico participa principalmente en tareas de agregación o informes, que consumen mucha memoria, considere la posibilidad de personalizar el valor work_mem para ese usuario. Use el comando ALTER ROLE para mejorar el rendimiento de las operaciones del usuario.

  • Nivel de función/procedimiento: Si funciones o procedimientos específicos generan archivos temporales sustanciales, aumentar el valor work_mem en el nivel de función o procedimiento específico puede ser beneficioso. Use el comando ALTER FUNCTION o ALTER PROCEDURE para asignar específicamente más memoria a estas operaciones.

  • Nivel de base de datos: Modifique work_mem en el nivel de base de datos si solo las bases de datos específicas generan un gran número de archivos temporales.

  • Nivel global: Si un análisis del sistema revela que la mayoría de las consultas generan archivos temporales pequeños, mientras que solo algunos crean archivos grandes, puede ser prudente aumentar globalmente el valor work_mem. Esta acción facilita la mayoría de las consultas para procesar en memoria, por lo que puede evitar operaciones basadas en disco y mejorar la eficacia. Sin embargo, tenga cuidado y supervise siempre el uso de memoria en el servidor para asegurarse de que puede controlar el aumento de work_mem valor.

Determinación del valor mínimo de work_mem para las operaciones de ordenación

Para buscar el valor mínimo work_mem para una consulta específica, especialmente uno que genera archivos de disco temporales durante el proceso de ordenación, comience considerando el tamaño de archivo temporal generado durante la ejecución de la consulta. Por ejemplo, si una consulta genera un archivo temporal de 20 MB:

  1. Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
  2. Establezca un valor work_mem inicial ligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como: SET work_mem TO '25MB'.
  3. Ejecute EXPLAIN ANALYZE en la consulta problemática en la misma sesión.
  4. Revise la salida de "Sort Method: quicksort Memory: xkB". Si indica "external merge Disk: xkB", aumente el valor de work_mem de forma incremental y vuelva a probar hasta que "quicksort Memory" aparezca. La apariencia de "quicksort Memory" indica que la consulta ahora funciona en memoria.
  5. Después de determinar el valor a través de este método, puede aplicarlo globalmente o en niveles más granulares (como se ha descrito anteriormente) para satisfacer sus necesidades operativas.

autovacuum_work_mem

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático.
Tipo de datos entero
Valor predeterminado -1
Valores permitidos -1-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación autovacuum_work_mem

tipo_de_memoria_compartida_dinámica

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Selecciona la implementación de memoria compartida dinámica usada.
Tipo de datos enumeración
Valor predeterminado posix
Valores permitidos posix
Parameter type (Tipo de parámetro) solo lectura
Documentación tipo_de_memoria_compartida_dinámica

huge_pages

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Habilita o deshabilita el uso de páginas de memoria enormes. Esta configuración no es aplicable a los servidores que tienen menos de 4 núcleos virtuales.
Tipo de datos enumeración
Valor predeterminado try
Valores permitidos on,off,try
Parameter type (Tipo de parámetro) estático
Documentación huge_pages

Descripción

Las páginas enormes son una característica que permite administrar la memoria en bloques más grandes. Normalmente, puede administrar bloques de hasta 2 MB, en lugar de las páginas estándar de 4 KB.

El uso de páginas enormes puede ofrecer ventajas de rendimiento que descargan eficazmente la CPU:

  • Reducen la sobrecarga asociada a tareas de administración de memoria, como menos errores de búfer de aspecto de traducción (TLB).
  • Reducen el tiempo necesario para la administración de memoria.

En concreto, en PostgreSQL, solo puede usar páginas enormes para el área de memoria compartida. Se asigna una parte significativa del área de memoria compartida para los búferes compartidos.

Otra ventaja es que las páginas enormes impiden el intercambio del área de memoria compartida fuera del disco, lo que estabiliza aún más el rendimiento.

Recomendaciones

  • En el caso de los servidores que tienen recursos de memoria significativos, evite deshabilitar páginas enormes. Deshabilitar páginas enormes podría poner en peligro el rendimiento.
  • Si comienza con un servidor más pequeño que no admite páginas enormes, pero prevé escalar verticalmente a un servidor que sí, mantenga la huge_pages configuración en TRY para una transición sin problemas y un rendimiento óptimo.

Notas específicas de Azure

En el caso de los servidores con cuatro o más núcleos virtuales, las páginas grandes se asignan automáticamente desde el sistema operativo subyacente. La característica no está disponible para servidores con menos de cuatro núcleos virtuales. El número de páginas enormes se ajusta automáticamente si se cambia cualquier configuración de memoria compartida, incluidas las modificaciones a shared_buffers.

memoria_de_trabajo_de_mantenimiento

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 1024-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación maintenance_work_mem

Descripción

maintenance_work_mem es un parámetro de configuración en PostgreSQL. Controla la cantidad de memoria asignada para las operaciones de mantenimiento, como VACUUM, CREATE INDEX, y ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservado para tareas que mantienen y optimizan la estructura de la base de datos.

![NOTA] Establecer maintenance_work_mem en valores demasiado agresivos podría provocar periódicamente errores de memoria insuficiente en el sistema. Es muy importante comprender la cantidad de memoria disponible en el servidor y el número de operaciones simultáneas que podrían asignar memoria para las tareas descritas anteriormente, antes de realizar cambios en este parámetro.

Puntos clave

  • Límite de memoria de vacío: Si desea acelerar la limpieza de tuplas inactivas aumentando maintenance_work_mem, tenga en cuenta que VACUUM tiene una limitación integrada para recopilar identificadores de tupla no enviados. Solo puede usar hasta 1 GB de memoria para este proceso.
  • Separación de memoria para autovacuum: Puede usar la configuración autovacuum_work_mem para controlar de forma independiente la memoria que utilizan las operaciones de autovacío. Esta configuración actúa como un subconjunto de maintenance_work_mem. Usted puede decidir cuánta memoria utiliza el autovacuum sin afectar la asignación de memoria para otras tareas de mantenimiento y operaciones de definición de datos.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor maintenance_work_mem se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores de la selección de producto en el proceso que admita el servidor flexible no tendrán ningún efecto en el valor predeterminado del parámetro de servidor maintenance_work_mem de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro maintenance_work_mem según los valores de la siguiente fórmula.

La fórmula usada para calcular el valor de maintenance_work_mem es (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria memoria_de_trabajo_de_mantenimiento
2 GiB 99,328 KiB
4 GiB 157 696 KiB
8 GiB 216 064 KiB
16 GiB 274,432 KiB
32 GiB 332 800 KiB
48 GiB 367,616 KiB
64 GiB 392,192 KiB
80 GiB 410 624 KiB
128 GiB 450 560 KiB
160 GiB 468 992 KiB
192 GiB 484,352 KiB
256 GiB 508,928 KiB
384 GiB 542 720 KiB
432 GiB 552 960 KiB
672 GiB 590,848 KiB

max_prepared_transactions

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de transacciones preparadas simultáneamente. Al ejecutar un servidor de réplica, debe establecer este parámetro en el mismo valor o superior que en el servidor principal.
Tipo de datos entero
Valor predeterminado 0
Valores permitidos 0-262143
Parameter type (Tipo de parámetro) estático
Documentación max_prepared_transactions

max_stack_depth

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la profundidad máxima de la pila, en kilobytes.
Tipo de datos entero
Valor predeterminado 2048
Valores permitidos 2048
Parameter type (Tipo de parámetro) solo lectura
Documentación max_stack_depth

shared_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número de búferes de memoria compartidos utilizados por el servidor. La unidad es 8 kb. Los valores permitidos están dentro del intervalo del 10 % - 75 % de la memoria disponible.
Tipo de datos entero
Valor predeterminado Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor.
Valores permitidos 16-1073741823
Parameter type (Tipo de parámetro) estático
Documentación shared_buffers

Descripción

El parámetro de configuración shared_buffers determina la cantidad de memoria del sistema asignada a la base de datos PostgreSQL para almacenar en búfer los datos. Actúa como un grupo de memoria centralizado que es accesible para todos los procesos de base de datos.

Cuando se necesitan datos, el proceso de base de datos comprueba primero el búfer compartido. Si los datos necesarios están presentes, se recuperan rápidamente y se omiten más lecturas de disco que consumen mucho tiempo. Los búferes compartidos sirven como intermediario entre los procesos de base de datos y el disco, y reducen eficazmente el número de operaciones de E/S necesarias.

Notas específicas de Azure

El valor predeterminado para el parámetro de servidor shared_buffers se calcula al aprovisionar la instancia del servidor flexible de Azure Database for PostgreSQL, en función del nombre del producto que seleccione para su proceso. Los cambios posteriores a la selección de productos en el cálculo que soporta el servidor flexible no afectan en absoluto al valor por defecto del parámetro de servidor shared_buffers de esa instancia.

Cada vez que cambie el producto asignado a una instancia, también debe ajustar el valor del parámetro shared_buffers según los valores de las siguientes fórmulas.

En el caso de las máquinas virtuales con hasta 2 GiB de memoria, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 16384.

En el caso de las máquinas virtuales con más de 2 GiB, la fórmula utilizada para calcular el valor de shared_buffers es memoryGib * 32768.

Basándose en la fórmula anterior, la siguiente tabla enumera los valores en los que se establecería este parámetro de servidor en función de la cantidad de memoria aprovisionada:

Tamaño de memoria shared_buffers
2 GiB 32768
4 GiB 131 072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

temp_buffers

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece el número máximo de búferes temporales que usa cada sesión de base de datos.
Tipo de datos entero
Valor predeterminado 1024
Valores permitidos 100-1073741823
Parameter type (Tipo de parámetro) dinámico
Documentación temp_buffers

work_mem (memoria de trabajo)

Atributo Valor
Categoría Uso de recursos / Memoria
Descripción Establece la cantidad de memoria que se va a usar en las operaciones de ordenación internas y las tablas hash antes de escribir en los archivos de disco temporales.
Tipo de datos entero
Valor predeterminado 4096
Valores permitidos 4096-2097151
Parameter type (Tipo de parámetro) dinámico
Documentación work_mem

Descripción

El parámetro work_mem de PostgreSQL controla la cantidad de memoria asignada para determinadas operaciones internas dentro del área de memoria privada de cada sesión de base de datos. Algunos ejemplos de estas operaciones son la ordenación y el hash.

A diferencia de los búferes compartidos, que se encuentran en el área de memoria compartida, work_mem se asigna en un espacio de memoria privada por sesión o por consulta. Al establecer un tamaño work_mem adecuado, puede mejorar significativamente la eficacia de estas operaciones y reducir la necesidad de escribir datos temporales en el disco.

Puntos clave

  • Memoria de conexión privada: work_mem forma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida que shared_buffers usa.
  • Uso específico de la consulta: no todas las sesiones o consultas usan work_mem. Es poco probable que las consultas simples como SELECT 1 requieran work_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos de work_mem.
  • Operaciones paralelas: En el caso de las consultas que abarcan varios back-end paralelos, cada back-end podría usar potencialmente uno o varios fragmentos de work_mem.

Supervisión y ajuste de la memoria de trabajo

Es esencial supervisar continuamente el rendimiento del sistema y ajustar work_mem según sea necesario, principalmente si los tiempos de ejecución de consultas relacionados con las operaciones de ordenación o hash son lentos. Estas son las maneras de supervisar el rendimiento mediante herramientas disponibles en Azure Portal:

  • Información de rendimiento de consultas: Compruebe las consultas principales por archivos temporales pestaña para identificar las consultas que generan archivos temporales. Esta situación sugiere una posible necesidad de aumentar work_mem.
  • Guías de solución de problemas: Use la pestaña Archivos temporales altos de las guías de solución de problemas para identificar consultas problemáticas.
Ajuste pormenorizados

Aunque gestiona el parámetro work_mem, es a veces más eficaz adoptar un enfoque de ajuste pormenorizado en lugar de establecer un valor global. Este enfoque garantiza que asigne memoria con criterio en función de las necesidades específicas de los procesos y los usuarios. También minimiza el riesgo de encontrar problemas de memoria insuficiente. Así es como puede hacerlo:

  • nivel de usuario: Si un usuario específico participa principalmente en tareas de agregación o informes, que consumen mucha memoria, considere la posibilidad de personalizar el valor work_mem para ese usuario. Use el comando ALTER ROLE para mejorar el rendimiento de las operaciones del usuario.

  • Nivel de función/procedimiento: Si funciones o procedimientos específicos generan archivos temporales sustanciales, aumentar el valor work_mem en el nivel de función o procedimiento específico puede ser beneficioso. Use el comando ALTER FUNCTION o ALTER PROCEDURE para asignar específicamente más memoria a estas operaciones.

  • Nivel de base de datos: Modifique work_mem en el nivel de base de datos si solo las bases de datos específicas generan un gran número de archivos temporales.

  • Nivel global: Si un análisis del sistema revela que la mayoría de las consultas generan archivos temporales pequeños, mientras que solo algunos crean archivos grandes, puede ser prudente aumentar globalmente el valor work_mem. Esta acción facilita la mayoría de las consultas para procesar en memoria, por lo que puede evitar operaciones basadas en disco y mejorar la eficacia. Sin embargo, tenga cuidado y supervise siempre el uso de memoria en el servidor para asegurarse de que puede controlar el aumento de work_mem valor.

Determinación del valor mínimo de work_mem para las operaciones de ordenación

Para buscar el valor mínimo work_mem para una consulta específica, especialmente uno que genera archivos de disco temporales durante el proceso de ordenación, comience considerando el tamaño de archivo temporal generado durante la ejecución de la consulta. Por ejemplo, si una consulta genera un archivo temporal de 20 MB:

  1. Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
  2. Establezca un valor work_mem inicial ligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como: SET work_mem TO '25MB'.
  3. Ejecute EXPLAIN ANALYZE en la consulta problemática en la misma sesión.
  4. Revise la salida de "Sort Method: quicksort Memory: xkB". Si indica "external merge Disk: xkB", aumente el valor de work_mem de forma incremental y vuelva a probar hasta que "quicksort Memory" aparezca. La apariencia de "quicksort Memory" indica que la consulta ahora funciona en memoria.
  5. Después de determinar el valor a través de este método, puede aplicarlo globalmente o en niveles más granulares (como se ha descrito anteriormente) para satisfacer sus necesidades operativas.