Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
autovacuum_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | autovacuum_work_mem |
commit_timestamp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la memoria caché de marca de tiempo de confirmación. Especifique 0 para que este valor se determine como una fracción de shared_buffers. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parámetro | estático |
| Documentation | commit_timestamp_buffers |
tipo_de_memoria_compartida_dinámica
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida dinámica usada. |
| Tipo de dato | enumeration |
| Valor predeterminado | posix |
| Valores permitidos | posix |
| Tipo de parámetro | solo lectura |
| Documentation | dynamic_shared_memory_type |
hash_mem_multiplier
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Múltiplo de "work_mem" a utilizar para las tablas hash. |
| Tipo de dato | numérico |
| Valor predeterminado | 2 |
| Valores permitidos | 1-1000 |
| Tipo de parámetro | dynamic |
| Documentation | hash_mem_multiplier |
huge_pages (páginas enormes)
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Uso de páginas enormes en Linux o Windows. |
| Tipo de dato | enumeration |
| Valor predeterminado | try |
| Valores permitidos | on,off,try |
| Tipo de parámetro | estático |
| Documentation | páginas_grandes |
Description
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 la zona 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.
Recommendations
- 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_pagesconfiguración enTRYpara 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 enormes 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Tamaño de página enorme que se debe solicitar. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | huge_page_size |
io_combine_limit
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Límite del tamaño de las lecturas y escrituras de datos. |
| Tipo de dato | entero |
| Valor predeterminado | 16 |
| Valores permitidos | 1-128 |
| Tipo de parámetro | dynamic |
| Documentation | io_combine_limit |
io_max_combine_limit
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Límite global del servidor que limita io_combine_limit. |
| Tipo de dato | entero |
| Valor predeterminado | 16 |
| Valores permitidos | 1-128 |
| Tipo de parámetro | dynamic |
| Documentation | io_max_combine_limit |
io_max_concurrency
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Número máximo de E/S que un proceso puede ejecutar al mismo tiempo. |
| Tipo de dato | entero |
| Valor predeterminado | 64 |
| Valores permitidos | -1-1024 |
| Tipo de parámetro | estático |
| Documentation | io_max_concurrency |
método_io
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona el método para ejecutar E/S asincrónica. |
| Tipo de dato | enumeration |
| Valor predeterminado | worker |
| Valores permitidos | worker,sync |
| Tipo de parámetro | estático |
| Documentation | io_method |
io_workers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Número de procesos de trabajo de E/S para io_method=worker. |
| Tipo de dato | entero |
| Valor predeterminado | 3 |
| Valores permitidos | 1-32 |
| Tipo de parámetro | dynamic |
| Documentation | io_workers |
logical_decoding_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para la descodificación lógica. Cada búfer de reordenamiento interno puede usar esta cantidad de memoria antes de desbordarse en el disco. |
| Tipo de dato | entero |
| Valor predeterminado | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parámetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las operaciones de mantenimiento. Esto incluye operaciones como VACUUM y CREATE INDEX. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 1024-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | maintenance_work_mem |
Description
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 INDEXy ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservada para tareas que mantienen y optimizan la estructura de la base de datos.
![NOTA] Establecer
maintenance_work_memen 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 queVACUUMtiene 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
autovacuum_work_memconfiguración para controlar la memoria que usan las operaciones de autovacuum de forma independiente. Esta configuración actúa como un subconjunto demaintenance_work_mem. Puede decidir cuánta memoria usa el autovacío sin afectar a la asignación de almacenamiento 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 maintenance_work_mem parámetro según los valores de la fórmula siguiente.
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 | maintenance_work_mem |
|---|---|
| 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de transacciones preparadas simultáneamente. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parámetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la profundidad máxima de la pila, en kilobytes. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 2048 |
| Tipo de parámetro | solo lectura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Cantidad de memoria compartida dinámica reservada en el inicio. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | min_dynamic_shared_memory |
multixact_member_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la memoria caché del miembro MultiXact. |
| Tipo de dato | entero |
| Valor predeterminado | 32 |
| Valores permitidos | 16-131072 |
| Tipo de parámetro | estático |
| Documentation | multixact_member_buffers |
multixact_offset_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la memoria caché de desplazamiento de MultiXact. |
| Tipo de dato | entero |
| Valor predeterminado | 16 |
| Valores permitidos | 16-131072 |
| Tipo de parámetro | estático |
| Documentation | multixact_offset_buffers |
notify_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la caché de mensajes LISTEN/NOTIFY. |
| Tipo de dato | entero |
| Valor predeterminado | 16 |
| Valores permitidos | 16-131072 |
| Tipo de parámetro | estático |
| Documentation | notify_buffers |
serializable_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo dedicado de búferes utilizado para la caché de transacciones serializables. |
| Tipo de dato | entero |
| Valor predeterminado | 32 |
| Valores permitidos | 16-131072 |
| Tipo de parámetro | estático |
| Documentation | serializable_buffers |
shared_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número de búferes de memoria compartidos utilizados por el servidor. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 16-1073741823 |
| Tipo de parámetro | estático |
| Documentation | shared_buffers |
Description
El shared_buffers parámetro de configuración 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 reduce 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 en la selección de producto del sistema informático que admite el servidor flexible no tienen ningún efecto en el valor predeterminado para el 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 shared_buffers parámetro según los valores de las fórmulas siguientes.
Para 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 | 4 194 304 |
| 160 GiB | 5242880 |
| 192 GiB | 6291456 |
| 256 GiB | 8388608 |
| 384 GiB | 12582912 |
| 432 GiB | 14155776 |
| 672 GiB | 22020096 |
shared_memory_type
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal. |
| Tipo de dato | enumeration |
| Valor predeterminado | mmap |
| Valores permitidos | mmap |
| Tipo de parámetro | solo lectura |
| Documentation | tipo_memoria_compartida |
subtransaction_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del pool de búferes dedicado que se utiliza para la caché de subtransacciones. Especifique 0 para que este valor se determine como una fracción de shared_buffers. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parámetro | estático |
| Documentation | subtransaction_buffers |
temp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de búferes temporales utilizados por cada sesión. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parámetro | dynamic |
| Documentation | temp_buffers |
transaction_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la caché de estado de la transacción. Especifique 0 para que este valor se determine como una fracción de shared_buffers. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parámetro | estático |
| Documentation | transaction_buffers |
límite_de_uso_de_buffer_de_vacío
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes para VACUUM, ANALYZE y vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 0-16777216 |
| Tipo de parámetro | dynamic |
| Documentation | vacuum_buffer_usage_limit |
memoria_de_trabajo
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las áreas de trabajo de consulta. Esta gran cantidad de memoria se puede usar en cada operación de ordenación interna y tabla hash antes de cambiar a archivos de disco temporales. |
| Tipo de dato | entero |
| Valor predeterminado | 4096 |
| Valores permitidos | 4096-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | work_mem |
Description
El work_mem parámetro 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 adecuado work_mem , 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_memforma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida queshared_buffersusa. -
Uso específico de la consulta: no todas las sesiones o consultas usan
work_mem. Es poco probable que las consultas simples, comoSELECT 1, requieranwork_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos dework_mem. -
Operaciones paralelas: para 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 work_mem
Es esencial supervisar continuamente el rendimiento del sistema y ajustarlo 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 la pestaña Principales consultas por archivos temporales 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 en las guías de solución de problemas para identificar consultas problemáticas.
Ajuste granular
Aunque esté gestionando el parámetro work_mem, a menudo es 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 falta de memoria. 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
work_memvalor de ese usuario. Use elALTER ROLEcomando 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
work_memvalor en el nivel de función o procedimiento específico puede ser beneficioso. Use elALTER FUNCTIONcomando oALTER PROCEDUREpara asignar específicamente más memoria a estas operaciones.Nivel de base de datos: modifique
work_memen 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
work_memvalor. 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, siempre tenga cuidado y supervise el uso de memoria en el servidor para asegurarse de que puede controlar el mayorwork_memvalor.
Determinación del valor mínimo de work_mem para las operaciones de ordenación
Para buscar el valor mínimo work_mem de una consulta específica, especialmente una que genera archivos de disco temporales durante el proceso de ordenación, empiece por considerar 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:
- Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
- Establezca un valor inicial
work_memligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como:SET work_mem TO '25MB'. - Ejecute
EXPLAIN ANALYZEen la consulta problemática en la misma sesión. - Revise la salida de
"Sort Method: quicksort Memory: xkB". Si indica"external merge Disk: xkB", aumente el valor dework_memgradualmente y vuelva a probar hasta que"quicksort Memory"aparezca. La aparición de"quicksort Memory"señala que la consulta ahora opera en la memoria. - 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | autovacuum_work_mem |
commit_timestamp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la memoria caché de marca de tiempo de confirmación. Especifique 0 para que este valor se determine como una fracción de shared_buffers. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parámetro | estático |
| Documentation | commit_timestamp_buffers |
tipo_de_memoria_compartida_dinámica
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida dinámica usada. |
| Tipo de dato | enumeration |
| Valor predeterminado | posix |
| Valores permitidos | posix |
| Tipo de parámetro | solo lectura |
| Documentation | dynamic_shared_memory_type |
hash_mem_multiplier
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Múltiplo de "work_mem" a utilizar para las tablas hash. |
| Tipo de dato | numérico |
| Valor predeterminado | 2 |
| Valores permitidos | 1-1000 |
| Tipo de parámetro | dynamic |
| Documentation | hash_mem_multiplier |
huge_pages (páginas enormes)
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Uso de páginas enormes en Linux o Windows. |
| Tipo de dato | enumeration |
| Valor predeterminado | try |
| Valores permitidos | on,off,try |
| Tipo de parámetro | estático |
| Documentation | páginas_grandes |
Description
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 la zona 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.
Recommendations
- 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_pagesconfiguración enTRYpara 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 enormes 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Tamaño de página enorme que se debe solicitar. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | huge_page_size |
io_combine_limit
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Límite del tamaño de las lecturas y escrituras de datos. |
| Tipo de dato | entero |
| Valor predeterminado | 16 |
| Valores permitidos | 16 |
| Tipo de parámetro | solo lectura |
| Documentation | io_combine_limit |
logical_decoding_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para la descodificación lógica. Cada búfer de reordenamiento interno puede usar esta cantidad de memoria antes de desbordarse en el disco. |
| Tipo de dato | entero |
| Valor predeterminado | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parámetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las operaciones de mantenimiento. Esto incluye operaciones como VACUUM y CREATE INDEX. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 1024-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | maintenance_work_mem |
Description
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 INDEXy ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservada para tareas que mantienen y optimizan la estructura de la base de datos.
![NOTA] Establecer
maintenance_work_memen 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 queVACUUMtiene 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
autovacuum_work_memconfiguración para controlar la memoria que usan las operaciones de autovacuum de forma independiente. Esta configuración actúa como un subconjunto demaintenance_work_mem. Puede decidir cuánta memoria usa el autovacío sin afectar a la asignación de almacenamiento 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 maintenance_work_mem parámetro según los valores de la fórmula siguiente.
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 | maintenance_work_mem |
|---|---|
| 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de transacciones preparadas simultáneamente. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parámetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la profundidad máxima de la pila, en kilobytes. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 2048 |
| Tipo de parámetro | solo lectura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Cantidad de memoria compartida dinámica reservada en el inicio. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | min_dynamic_shared_memory |
multixact_member_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la memoria caché del miembro MultiXact. |
| Tipo de dato | entero |
| Valor predeterminado | 32 |
| Valores permitidos | 16-131072 |
| Tipo de parámetro | estático |
| Documentation | multixact_member_buffers |
multixact_offset_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la memoria caché de desplazamiento de MultiXact. |
| Tipo de dato | entero |
| Valor predeterminado | 16 |
| Valores permitidos | 16-131072 |
| Tipo de parámetro | estático |
| Documentation | multixact_offset_buffers |
notify_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la caché de mensajes LISTEN/NOTIFY. |
| Tipo de dato | entero |
| Valor predeterminado | 16 |
| Valores permitidos | 16-131072 |
| Tipo de parámetro | estático |
| Documentation | notify_buffers |
serializable_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo dedicado de búferes utilizado para la caché de transacciones serializables. |
| Tipo de dato | entero |
| Valor predeterminado | 32 |
| Valores permitidos | 16-131072 |
| Tipo de parámetro | estático |
| Documentation | serializable_buffers |
shared_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número de búferes de memoria compartidos utilizados por el servidor. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 16-1073741823 |
| Tipo de parámetro | estático |
| Documentation | shared_buffers |
Description
El shared_buffers parámetro de configuración 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 reduce 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 en la selección de producto del sistema informático que admite el servidor flexible no tienen ningún efecto en el valor predeterminado para el 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 shared_buffers parámetro según los valores de las fórmulas siguientes.
Para 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 | 4 194 304 |
| 160 GiB | 5242880 |
| 192 GiB | 6291456 |
| 256 GiB | 8388608 |
| 384 GiB | 12582912 |
| 432 GiB | 14155776 |
| 672 GiB | 22020096 |
shared_memory_type
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal. |
| Tipo de dato | enumeration |
| Valor predeterminado | mmap |
| Valores permitidos | mmap |
| Tipo de parámetro | solo lectura |
| Documentation | tipo_memoria_compartida |
subtransaction_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del pool de búferes dedicado que se utiliza para la caché de subtransacciones. Especifique 0 para que este valor se determine como una fracción de shared_buffers. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parámetro | estático |
| Documentation | subtransaction_buffers |
temp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de búferes temporales utilizados por cada sesión. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parámetro | dynamic |
| Documentation | temp_buffers |
transaction_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes dedicado que se usa para la caché de estado de la transacción. Especifique 0 para que este valor se determine como una fracción de shared_buffers. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parámetro | estático |
| Documentation | transaction_buffers |
límite_de_uso_de_buffer_de_vacío
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes para VACUUM, ANALYZE y vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 0-16777216 |
| Tipo de parámetro | dynamic |
| Documentation | vacuum_buffer_usage_limit |
memoria_de_trabajo
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las áreas de trabajo de consulta. Esta gran cantidad de memoria se puede usar en cada operación de ordenación interna y tabla hash antes de cambiar a archivos de disco temporales. |
| Tipo de dato | entero |
| Valor predeterminado | 4096 |
| Valores permitidos | 4096-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | work_mem |
Description
El work_mem parámetro 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 adecuado work_mem , 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_memforma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida queshared_buffersusa. -
Uso específico de la consulta: no todas las sesiones o consultas usan
work_mem. Es poco probable que las consultas simples, comoSELECT 1, requieranwork_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos dework_mem. -
Operaciones paralelas: para 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 work_mem
Es esencial supervisar continuamente el rendimiento del sistema y ajustarlo 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 la pestaña Principales consultas por archivos temporales 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 en las guías de solución de problemas para identificar consultas problemáticas.
Ajuste granular
Aunque esté gestionando el parámetro work_mem, a menudo es 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 falta de memoria. 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
work_memvalor de ese usuario. Use elALTER ROLEcomando 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
work_memvalor en el nivel de función o procedimiento específico puede ser beneficioso. Use elALTER FUNCTIONcomando oALTER PROCEDUREpara asignar específicamente más memoria a estas operaciones.Nivel de base de datos: modifique
work_memen 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
work_memvalor. 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, siempre tenga cuidado y supervise el uso de memoria en el servidor para asegurarse de que puede controlar el mayorwork_memvalor.
Determinación del valor mínimo de work_mem para las operaciones de ordenación
Para buscar el valor mínimo work_mem de una consulta específica, especialmente una que genera archivos de disco temporales durante el proceso de ordenación, empiece por considerar 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:
- Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
- Establezca un valor inicial
work_memligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como:SET work_mem TO '25MB'. - Ejecute
EXPLAIN ANALYZEen la consulta problemática en la misma sesión. - Revise la salida de
"Sort Method: quicksort Memory: xkB". Si indica"external merge Disk: xkB", aumente el valor dework_memgradualmente y vuelva a probar hasta que"quicksort Memory"aparezca. La aparición de"quicksort Memory"señala que la consulta ahora opera en la memoria. - 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | autovacuum_work_mem |
tipo_de_memoria_compartida_dinámica
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida dinámica usada. |
| Tipo de dato | enumeration |
| Valor predeterminado | posix |
| Valores permitidos | posix |
| Tipo de parámetro | solo lectura |
| Documentation | dynamic_shared_memory_type |
hash_mem_multiplier
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Múltiplo de work_mem que se utiliza para las tablas hash. |
| Tipo de dato | numérico |
| Valor predeterminado | 2 |
| Valores permitidos | 1-1000 |
| Tipo de parámetro | dynamic |
| Documentation | hash_mem_multiplier |
huge_pages (páginas enormes)
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | enumeration |
| Valor predeterminado | try |
| Valores permitidos | on,off,try |
| Tipo de parámetro | estático |
| Documentation | páginas_grandes |
Description
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 la zona 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.
Recommendations
- 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_pagesconfiguración enTRYpara 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 enormes 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Tamaño de página enorme que se debe solicitar. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | huge_page_size |
logical_decoding_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para la descodificación lógica. |
| Tipo de dato | entero |
| Valor predeterminado | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parámetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 1024-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | maintenance_work_mem |
Description
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 INDEXy ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservada para tareas que mantienen y optimizan la estructura de la base de datos.
![NOTA] Establecer
maintenance_work_memen 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 queVACUUMtiene 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
autovacuum_work_memconfiguración para controlar la memoria que usan las operaciones de autovacuum de forma independiente. Esta configuración actúa como un subconjunto demaintenance_work_mem. Puede decidir cuánta memoria usa el autovacío sin afectar a la asignación de almacenamiento 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 maintenance_work_mem parámetro según los valores de la fórmula siguiente.
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 | maintenance_work_mem |
|---|---|
| 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parámetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la profundidad máxima de la pila, en kilobytes. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 2048 |
| Tipo de parámetro | solo lectura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Cantidad de memoria compartida dinámica reservada en el inicio. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | min_dynamic_shared_memory |
shared_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 16-1073741823 |
| Tipo de parámetro | estático |
| Documentation | shared_buffers |
Description
El shared_buffers parámetro de configuración 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 reduce 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 en la selección de producto del sistema informático que admite el servidor flexible no tienen ningún efecto en el valor predeterminado para el 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 shared_buffers parámetro según los valores de las fórmulas siguientes.
Para 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 | 4 194 304 |
| 160 GiB | 5242880 |
| 192 GiB | 6291456 |
| 256 GiB | 8388608 |
| 384 GiB | 12582912 |
| 432 GiB | 14155776 |
| 672 GiB | 22020096 |
shared_memory_type
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal. |
| Tipo de dato | enumeration |
| Valor predeterminado | mmap |
| Valores permitidos | mmap |
| Tipo de parámetro | solo lectura |
| Documentation | tipo_memoria_compartida |
temp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de búferes temporales que usa cada sesión de base de datos. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parámetro | dynamic |
| Documentation | temp_buffers |
límite_de_uso_de_buffer_de_vacío
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el tamaño del grupo de búferes para VACUUM, ANALYZE y vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | 256 |
| Valores permitidos | 0-16777216 |
| Tipo de parámetro | dynamic |
| Documentation | vacuum_buffer_usage_limit |
memoria_de_trabajo
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 4096 |
| Valores permitidos | 4096-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | work_mem |
Description
El work_mem parámetro 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 adecuado work_mem , 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_memforma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida queshared_buffersusa. -
Uso específico de la consulta: no todas las sesiones o consultas usan
work_mem. Es poco probable que las consultas simples, comoSELECT 1, requieranwork_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos dework_mem. -
Operaciones paralelas: para 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 work_mem
Es esencial supervisar continuamente el rendimiento del sistema y ajustarlo 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 la pestaña Principales consultas por archivos temporales 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 en las guías de solución de problemas para identificar consultas problemáticas.
Ajuste granular
Aunque esté gestionando el parámetro work_mem, a menudo es 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 falta de memoria. 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
work_memvalor de ese usuario. Use elALTER ROLEcomando 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
work_memvalor en el nivel de función o procedimiento específico puede ser beneficioso. Use elALTER FUNCTIONcomando oALTER PROCEDUREpara asignar específicamente más memoria a estas operaciones.Nivel de base de datos: modifique
work_memen 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
work_memvalor. 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, siempre tenga cuidado y supervise el uso de memoria en el servidor para asegurarse de que puede controlar el mayorwork_memvalor.
Determinación del valor mínimo de work_mem para las operaciones de ordenación
Para buscar el valor mínimo work_mem de una consulta específica, especialmente una que genera archivos de disco temporales durante el proceso de ordenación, empiece por considerar 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:
- Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
- Establezca un valor inicial
work_memligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como:SET work_mem TO '25MB'. - Ejecute
EXPLAIN ANALYZEen la consulta problemática en la misma sesión. - Revise la salida de
"Sort Method: quicksort Memory: xkB". Si indica"external merge Disk: xkB", aumente el valor dework_memgradualmente y vuelva a probar hasta que"quicksort Memory"aparezca. La aparición de"quicksort Memory"señala que la consulta ahora opera en la memoria. - 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | autovacuum_work_mem |
tipo_de_memoria_compartida_dinámica
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida dinámica usada. |
| Tipo de dato | enumeration |
| Valor predeterminado | posix |
| Valores permitidos | posix |
| Tipo de parámetro | solo lectura |
| Documentation | dynamic_shared_memory_type |
hash_mem_multiplier
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Múltiplo de work_mem que se utiliza para las tablas hash. |
| Tipo de dato | numérico |
| Valor predeterminado | 2 |
| Valores permitidos | 1-1000 |
| Tipo de parámetro | dynamic |
| Documentation | hash_mem_multiplier |
huge_pages (páginas enormes)
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | enumeration |
| Valor predeterminado | try |
| Valores permitidos | on,off,try |
| Tipo de parámetro | estático |
| Documentation | páginas_grandes |
Description
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 la zona 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.
Recommendations
- 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_pagesconfiguración enTRYpara 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 enormes 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Tamaño de página enorme que se debe solicitar. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | huge_page_size |
logical_decoding_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para la descodificación lógica. |
| Tipo de dato | entero |
| Valor predeterminado | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parámetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 1024-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | maintenance_work_mem |
Description
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 INDEXy ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservada para tareas que mantienen y optimizan la estructura de la base de datos.
![NOTA] Establecer
maintenance_work_memen 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 queVACUUMtiene 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
autovacuum_work_memconfiguración para controlar la memoria que usan las operaciones de autovacuum de forma independiente. Esta configuración actúa como un subconjunto demaintenance_work_mem. Puede decidir cuánta memoria usa el autovacío sin afectar a la asignación de almacenamiento 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 maintenance_work_mem parámetro según los valores de la fórmula siguiente.
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 | maintenance_work_mem |
|---|---|
| 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parámetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la profundidad máxima de la pila, en kilobytes. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 2048 |
| Tipo de parámetro | solo lectura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Cantidad de memoria compartida dinámica reservada en el inicio. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | min_dynamic_shared_memory |
shared_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 16-1073741823 |
| Tipo de parámetro | estático |
| Documentation | shared_buffers |
Description
El shared_buffers parámetro de configuración 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 reduce 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 en la selección de producto del sistema informático que admite el servidor flexible no tienen ningún efecto en el valor predeterminado para el 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 shared_buffers parámetro según los valores de las fórmulas siguientes.
Para 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 | 4 194 304 |
| 160 GiB | 5242880 |
| 192 GiB | 6291456 |
| 256 GiB | 8388608 |
| 384 GiB | 12582912 |
| 432 GiB | 14155776 |
| 672 GiB | 22020096 |
shared_memory_type
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal. |
| Tipo de dato | enumeration |
| Valor predeterminado | mmap |
| Valores permitidos | mmap |
| Tipo de parámetro | solo lectura |
| Documentation | tipo_memoria_compartida |
temp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de búferes temporales que usa cada sesión de base de datos. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parámetro | dynamic |
| Documentation | temp_buffers |
memoria_de_trabajo
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 4096 |
| Valores permitidos | 4096-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | work_mem |
Description
El work_mem parámetro 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 adecuado work_mem , 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_memforma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida queshared_buffersusa. -
Uso específico de la consulta: no todas las sesiones o consultas usan
work_mem. Es poco probable que las consultas simples, comoSELECT 1, requieranwork_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos dework_mem. -
Operaciones paralelas: para 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 work_mem
Es esencial supervisar continuamente el rendimiento del sistema y ajustarlo 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 la pestaña Principales consultas por archivos temporales 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 en las guías de solución de problemas para identificar consultas problemáticas.
Ajuste granular
Aunque esté gestionando el parámetro work_mem, a menudo es 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 falta de memoria. 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
work_memvalor de ese usuario. Use elALTER ROLEcomando 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
work_memvalor en el nivel de función o procedimiento específico puede ser beneficioso. Use elALTER FUNCTIONcomando oALTER PROCEDUREpara asignar específicamente más memoria a estas operaciones.Nivel de base de datos: modifique
work_memen 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
work_memvalor. 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, siempre tenga cuidado y supervise el uso de memoria en el servidor para asegurarse de que puede controlar el mayorwork_memvalor.
Determinación del valor mínimo de work_mem para las operaciones de ordenación
Para buscar el valor mínimo work_mem de una consulta específica, especialmente una que genera archivos de disco temporales durante el proceso de ordenación, empiece por considerar 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:
- Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
- Establezca un valor inicial
work_memligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como:SET work_mem TO '25MB'. - Ejecute
EXPLAIN ANALYZEen la consulta problemática en la misma sesión. - Revise la salida de
"Sort Method: quicksort Memory: xkB". Si indica"external merge Disk: xkB", aumente el valor dework_memgradualmente y vuelva a probar hasta que"quicksort Memory"aparezca. La aparición de"quicksort Memory"señala que la consulta ahora opera en la memoria. - 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | autovacuum_work_mem |
tipo_de_memoria_compartida_dinámica
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida dinámica usada. |
| Tipo de dato | enumeration |
| Valor predeterminado | posix |
| Valores permitidos | posix |
| Tipo de parámetro | solo lectura |
| Documentation | dynamic_shared_memory_type |
hash_mem_multiplier
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Múltiplo de work_mem que se utiliza para las tablas hash. |
| Tipo de dato | numérico |
| Valor predeterminado | 1 |
| Valores permitidos | 1-1000 |
| Tipo de parámetro | dynamic |
| Documentation | hash_mem_multiplier |
huge_pages (páginas enormes)
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | enumeration |
| Valor predeterminado | try |
| Valores permitidos | on,off,try |
| Tipo de parámetro | estático |
| Documentation | páginas_grandes |
Description
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 la zona 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.
Recommendations
- 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_pagesconfiguración enTRYpara 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 enormes 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Tamaño de página enorme que se debe solicitar. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | huge_page_size |
logical_decoding_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para la descodificación lógica. |
| Tipo de dato | entero |
| Valor predeterminado | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parámetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 1024-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | maintenance_work_mem |
Description
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 INDEXy ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservada para tareas que mantienen y optimizan la estructura de la base de datos.
![NOTA] Establecer
maintenance_work_memen 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 queVACUUMtiene 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
autovacuum_work_memconfiguración para controlar la memoria que usan las operaciones de autovacuum de forma independiente. Esta configuración actúa como un subconjunto demaintenance_work_mem. Puede decidir cuánta memoria usa el autovacío sin afectar a la asignación de almacenamiento 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 maintenance_work_mem parámetro según los valores de la fórmula siguiente.
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 | maintenance_work_mem |
|---|---|
| 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parámetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la profundidad máxima de la pila, en kilobytes. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 2048 |
| Tipo de parámetro | solo lectura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Cantidad de memoria compartida dinámica reservada en el inicio. |
| Tipo de dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0 |
| Tipo de parámetro | solo lectura |
| Documentation | min_dynamic_shared_memory |
shared_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 16-1073741823 |
| Tipo de parámetro | estático |
| Documentation | shared_buffers |
Description
El shared_buffers parámetro de configuración 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 reduce 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 en la selección de producto del sistema informático que admite el servidor flexible no tienen ningún efecto en el valor predeterminado para el 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 shared_buffers parámetro según los valores de las fórmulas siguientes.
Para 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 | 4 194 304 |
| 160 GiB | 5242880 |
| 192 GiB | 6291456 |
| 256 GiB | 8388608 |
| 384 GiB | 12582912 |
| 432 GiB | 14155776 |
| 672 GiB | 22020096 |
shared_memory_type
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal. |
| Tipo de dato | enumeration |
| Valor predeterminado | mmap |
| Valores permitidos | mmap |
| Tipo de parámetro | solo lectura |
| Documentation | tipo_memoria_compartida |
temp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de búferes temporales que usa cada sesión de base de datos. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parámetro | dynamic |
| Documentation | temp_buffers |
memoria_de_trabajo
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 4096 |
| Valores permitidos | 4096-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | work_mem |
Description
El work_mem parámetro 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 adecuado work_mem , 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_memforma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida queshared_buffersusa. -
Uso específico de la consulta: no todas las sesiones o consultas usan
work_mem. Es poco probable que las consultas simples, comoSELECT 1, requieranwork_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos dework_mem. -
Operaciones paralelas: para 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 work_mem
Es esencial supervisar continuamente el rendimiento del sistema y ajustarlo 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 la pestaña Principales consultas por archivos temporales 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 en las guías de solución de problemas para identificar consultas problemáticas.
Ajuste granular
Aunque esté gestionando el parámetro work_mem, a menudo es 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 falta de memoria. 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
work_memvalor de ese usuario. Use elALTER ROLEcomando 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
work_memvalor en el nivel de función o procedimiento específico puede ser beneficioso. Use elALTER FUNCTIONcomando oALTER PROCEDUREpara asignar específicamente más memoria a estas operaciones.Nivel de base de datos: modifique
work_memen 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
work_memvalor. 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, siempre tenga cuidado y supervise el uso de memoria en el servidor para asegurarse de que puede controlar el mayorwork_memvalor.
Determinación del valor mínimo de work_mem para las operaciones de ordenación
Para buscar el valor mínimo work_mem de una consulta específica, especialmente una que genera archivos de disco temporales durante el proceso de ordenación, empiece por considerar 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:
- Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
- Establezca un valor inicial
work_memligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como:SET work_mem TO '25MB'. - Ejecute
EXPLAIN ANALYZEen la consulta problemática en la misma sesión. - Revise la salida de
"Sort Method: quicksort Memory: xkB". Si indica"external merge Disk: xkB", aumente el valor dework_memgradualmente y vuelva a probar hasta que"quicksort Memory"aparezca. La aparición de"quicksort Memory"señala que la consulta ahora opera en la memoria. - 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | autovacuum_work_mem |
tipo_de_memoria_compartida_dinámica
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida dinámica usada. |
| Tipo de dato | enumeration |
| Valor predeterminado | posix |
| Valores permitidos | posix |
| Tipo de parámetro | solo lectura |
| Documentation | dynamic_shared_memory_type |
hash_mem_multiplier
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Múltiplo de work_mem que se utiliza para las tablas hash. |
| Tipo de dato | numérico |
| Valor predeterminado | 1 |
| Valores permitidos | 1-1000 |
| Tipo de parámetro | dynamic |
| Documentation | hash_mem_multiplier |
huge_pages (páginas enormes)
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | enumeration |
| Valor predeterminado | try |
| Valores permitidos | on,off,try |
| Tipo de parámetro | estático |
| Documentation | páginas_grandes |
Description
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 la zona 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.
Recommendations
- 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_pagesconfiguración enTRYpara 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 enormes 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para la descodificación lógica. |
| Tipo de dato | entero |
| Valor predeterminado | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parámetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 1024-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | maintenance_work_mem |
Description
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 INDEXy ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservada para tareas que mantienen y optimizan la estructura de la base de datos.
![NOTA] Establecer
maintenance_work_memen 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 queVACUUMtiene 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
autovacuum_work_memconfiguración para controlar la memoria que usan las operaciones de autovacuum de forma independiente. Esta configuración actúa como un subconjunto demaintenance_work_mem. Puede decidir cuánta memoria usa el autovacío sin afectar a la asignación de almacenamiento 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 maintenance_work_mem parámetro según los valores de la fórmula siguiente.
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 | maintenance_work_mem |
|---|---|
| 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parámetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la profundidad máxima de la pila, en kilobytes. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 2048 |
| Tipo de parámetro | solo lectura |
| Documentation | max_stack_depth |
shared_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 16-1073741823 |
| Tipo de parámetro | estático |
| Documentation | shared_buffers |
Description
El shared_buffers parámetro de configuración 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 reduce 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 en la selección de producto del sistema informático que admite el servidor flexible no tienen ningún efecto en el valor predeterminado para el 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 shared_buffers parámetro según los valores de las fórmulas siguientes.
Para 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 | 4 194 304 |
| 160 GiB | 5242880 |
| 192 GiB | 6291456 |
| 256 GiB | 8388608 |
| 384 GiB | 12582912 |
| 432 GiB | 14155776 |
| 672 GiB | 22020096 |
shared_memory_type
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal. |
| Tipo de dato | enumeration |
| Valor predeterminado | mmap |
| Valores permitidos | mmap |
| Tipo de parámetro | solo lectura |
| Documentation | tipo_memoria_compartida |
temp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de búferes temporales que usa cada sesión de base de datos. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parámetro | dynamic |
| Documentation | temp_buffers |
memoria_de_trabajo
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 4096 |
| Valores permitidos | 4096-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | work_mem |
Description
El work_mem parámetro 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 adecuado work_mem , 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_memforma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida queshared_buffersusa. -
Uso específico de la consulta: no todas las sesiones o consultas usan
work_mem. Es poco probable que las consultas simples, comoSELECT 1, requieranwork_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos dework_mem. -
Operaciones paralelas: para 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 work_mem
Es esencial supervisar continuamente el rendimiento del sistema y ajustarlo 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 la pestaña Principales consultas por archivos temporales 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 en las guías de solución de problemas para identificar consultas problemáticas.
Ajuste granular
Aunque esté gestionando el parámetro work_mem, a menudo es 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 falta de memoria. 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
work_memvalor de ese usuario. Use elALTER ROLEcomando 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
work_memvalor en el nivel de función o procedimiento específico puede ser beneficioso. Use elALTER FUNCTIONcomando oALTER PROCEDUREpara asignar específicamente más memoria a estas operaciones.Nivel de base de datos: modifique
work_memen 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
work_memvalor. 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, siempre tenga cuidado y supervise el uso de memoria en el servidor para asegurarse de que puede controlar el mayorwork_memvalor.
Determinación del valor mínimo de work_mem para las operaciones de ordenación
Para buscar el valor mínimo work_mem de una consulta específica, especialmente una que genera archivos de disco temporales durante el proceso de ordenación, empiece por considerar 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:
- Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
- Establezca un valor inicial
work_memligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como:SET work_mem TO '25MB'. - Ejecute
EXPLAIN ANALYZEen la consulta problemática en la misma sesión. - Revise la salida de
"Sort Method: quicksort Memory: xkB". Si indica"external merge Disk: xkB", aumente el valor dework_memgradualmente y vuelva a probar hasta que"quicksort Memory"aparezca. La aparición de"quicksort Memory"señala que la consulta ahora opera en la memoria. - 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | autovacuum_work_mem |
tipo_de_memoria_compartida_dinámica
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida dinámica usada. |
| Tipo de dato | enumeration |
| Valor predeterminado | posix |
| Valores permitidos | posix |
| Tipo de parámetro | solo lectura |
| Documentation | dynamic_shared_memory_type |
hash_mem_multiplier
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Múltiplo de work_mem que se utiliza para las tablas hash. |
| Tipo de dato | numérico |
| Valor predeterminado | 1 |
| Valores permitidos | 1-1000 |
| Tipo de parámetro | dynamic |
| Documentation | hash_mem_multiplier |
huge_pages (páginas enormes)
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | enumeration |
| Valor predeterminado | try |
| Valores permitidos | on,off,try |
| Tipo de parámetro | estático |
| Documentation | páginas_grandes |
Description
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 la zona 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.
Recommendations
- 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_pagesconfiguración enTRYpara 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 enormes 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.
maintenance_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 1024-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | maintenance_work_mem |
Description
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 INDEXy ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservada para tareas que mantienen y optimizan la estructura de la base de datos.
![NOTA] Establecer
maintenance_work_memen 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 queVACUUMtiene 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
autovacuum_work_memconfiguración para controlar la memoria que usan las operaciones de autovacuum de forma independiente. Esta configuración actúa como un subconjunto demaintenance_work_mem. Puede decidir cuánta memoria usa el autovacío sin afectar a la asignación de almacenamiento 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 maintenance_work_mem parámetro según los valores de la fórmula siguiente.
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 | maintenance_work_mem |
|---|---|
| 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parámetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la profundidad máxima de la pila, en kilobytes. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 2048 |
| Tipo de parámetro | solo lectura |
| Documentation | max_stack_depth |
shared_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 16-1073741823 |
| Tipo de parámetro | estático |
| Documentation | shared_buffers |
Description
El shared_buffers parámetro de configuración 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 reduce 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 en la selección de producto del sistema informático que admite el servidor flexible no tienen ningún efecto en el valor predeterminado para el 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 shared_buffers parámetro según los valores de las fórmulas siguientes.
Para 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 | 4 194 304 |
| 160 GiB | 5242880 |
| 192 GiB | 6291456 |
| 256 GiB | 8388608 |
| 384 GiB | 12582912 |
| 432 GiB | 14155776 |
| 672 GiB | 22020096 |
shared_memory_type
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida que se usa para la región de memoria compartida principal. |
| Tipo de dato | enumeration |
| Valor predeterminado | mmap |
| Valores permitidos | mmap |
| Tipo de parámetro | solo lectura |
| Documentation | tipo_memoria_compartida |
temp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de búferes temporales que usa cada sesión de base de datos. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parámetro | dynamic |
| Documentation | temp_buffers |
memoria_de_trabajo
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 4096 |
| Valores permitidos | 4096-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | work_mem |
Description
El work_mem parámetro 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 adecuado work_mem , 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_memforma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida queshared_buffersusa. -
Uso específico de la consulta: no todas las sesiones o consultas usan
work_mem. Es poco probable que las consultas simples, comoSELECT 1, requieranwork_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos dework_mem. -
Operaciones paralelas: para 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 work_mem
Es esencial supervisar continuamente el rendimiento del sistema y ajustarlo 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 la pestaña Principales consultas por archivos temporales 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 en las guías de solución de problemas para identificar consultas problemáticas.
Ajuste granular
Aunque esté gestionando el parámetro work_mem, a menudo es 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 falta de memoria. 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
work_memvalor de ese usuario. Use elALTER ROLEcomando 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
work_memvalor en el nivel de función o procedimiento específico puede ser beneficioso. Use elALTER FUNCTIONcomando oALTER PROCEDUREpara asignar específicamente más memoria a estas operaciones.Nivel de base de datos: modifique
work_memen 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
work_memvalor. 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, siempre tenga cuidado y supervise el uso de memoria en el servidor para asegurarse de que puede controlar el mayorwork_memvalor.
Determinación del valor mínimo de work_mem para las operaciones de ordenación
Para buscar el valor mínimo work_mem de una consulta específica, especialmente una que genera archivos de disco temporales durante el proceso de ordenación, empiece por considerar 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:
- Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
- Establezca un valor inicial
work_memligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como:SET work_mem TO '25MB'. - Ejecute
EXPLAIN ANALYZEen la consulta problemática en la misma sesión. - Revise la salida de
"Sort Method: quicksort Memory: xkB". Si indica"external merge Disk: xkB", aumente el valor dework_memgradualmente y vuelva a probar hasta que"quicksort Memory"aparezca. La aparición de"quicksort Memory"señala que la consulta ahora opera en la memoria. - 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que va a usar cada proceso de trabajo de vaciado automático. |
| Tipo de dato | entero |
| Valor predeterminado | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | autovacuum_work_mem |
tipo_de_memoria_compartida_dinámica
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Selecciona la implementación de memoria compartida dinámica usada. |
| Tipo de dato | enumeration |
| Valor predeterminado | posix |
| Valores permitidos | posix |
| Tipo de parámetro | solo lectura |
| Documentation | dynamic_shared_memory_type |
huge_pages (páginas enormes)
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | enumeration |
| Valor predeterminado | try |
| Valores permitidos | on,off,try |
| Tipo de parámetro | estático |
| Documentation | páginas_grandes |
Description
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 la zona 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.
Recommendations
- 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_pagesconfiguración enTRYpara 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 enormes 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.
maintenance_work_mem
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la memoria máxima que se usará para las operaciones de mantenimiento como VACUUM, Create Index. |
| Tipo de dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 1024-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | maintenance_work_mem |
Description
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 INDEXy ALTER TABLE. A diferencia de work_mem, que afecta a la asignación de memoria para las operaciones de consulta, maintenance_work_mem está reservada para tareas que mantienen y optimizan la estructura de la base de datos.
![NOTA] Establecer
maintenance_work_memen 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 queVACUUMtiene 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
autovacuum_work_memconfiguración para controlar la memoria que usan las operaciones de autovacuum de forma independiente. Esta configuración actúa como un subconjunto demaintenance_work_mem. Puede decidir cuánta memoria usa el autovacío sin afectar a la asignación de almacenamiento 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 maintenance_work_mem parámetro según los valores de la fórmula siguiente.
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 | maintenance_work_mem |
|---|---|
| 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 | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parámetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece la profundidad máxima de la pila, en kilobytes. |
| Tipo de dato | entero |
| Valor predeterminado | 2048 |
| Valores permitidos | 2048 |
| Tipo de parámetro | solo lectura |
| Documentation | max_stack_depth |
shared_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | Depende de los recursos (núcleos virtuales, RAM o espacio en disco) asignados al servidor. |
| Valores permitidos | 16-1073741823 |
| Tipo de parámetro | estático |
| Documentation | shared_buffers |
Description
El shared_buffers parámetro de configuración 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 reduce 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 en la selección de producto del sistema informático que admite el servidor flexible no tienen ningún efecto en el valor predeterminado para el 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 shared_buffers parámetro según los valores de las fórmulas siguientes.
Para 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 | 4 194 304 |
| 160 GiB | 5242880 |
| 192 GiB | 6291456 |
| 256 GiB | 8388608 |
| 384 GiB | 12582912 |
| 432 GiB | 14155776 |
| 672 GiB | 22020096 |
temp_buffers
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | Establece el número máximo de búferes temporales que usa cada sesión de base de datos. |
| Tipo de dato | entero |
| Valor predeterminado | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parámetro | dynamic |
| Documentation | temp_buffers |
memoria_de_trabajo
| Atributo | Importancia |
|---|---|
| Categoría | Uso de recursos / Memoria |
| Description | 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 dato | entero |
| Valor predeterminado | 4096 |
| Valores permitidos | 4096-2097151 |
| Tipo de parámetro | dynamic |
| Documentation | work_mem |
Description
El work_mem parámetro 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 adecuado work_mem , 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_memforma parte de la memoria privada que usa cada sesión de base de datos. Esta memoria es distinta del área de memoria compartida queshared_buffersusa. -
Uso específico de la consulta: no todas las sesiones o consultas usan
work_mem. Es poco probable que las consultas simples, comoSELECT 1, requieranwork_mem. Sin embargo, las consultas complejas que implican operaciones como la ordenación o el hash pueden consumir uno o varios fragmentos dework_mem. -
Operaciones paralelas: para 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 work_mem
Es esencial supervisar continuamente el rendimiento del sistema y ajustarlo 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 la pestaña Principales consultas por archivos temporales 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 en las guías de solución de problemas para identificar consultas problemáticas.
Ajuste granular
Aunque esté gestionando el parámetro work_mem, a menudo es 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 falta de memoria. 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
work_memvalor de ese usuario. Use elALTER ROLEcomando 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
work_memvalor en el nivel de función o procedimiento específico puede ser beneficioso. Use elALTER FUNCTIONcomando oALTER PROCEDUREpara asignar específicamente más memoria a estas operaciones.Nivel de base de datos: modifique
work_memen 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
work_memvalor. 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, siempre tenga cuidado y supervise el uso de memoria en el servidor para asegurarse de que puede controlar el mayorwork_memvalor.
Determinación del valor mínimo de work_mem para las operaciones de ordenación
Para buscar el valor mínimo work_mem de una consulta específica, especialmente una que genera archivos de disco temporales durante el proceso de ordenación, empiece por considerar 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:
- Conéctese a la base de datos mediante psql o el cliente de PostgreSQL preferido.
- Establezca un valor inicial
work_memligeramente superior a 20 MB para tener en cuenta los encabezados adicionales al procesarlos en memoria. Use un comando como:SET work_mem TO '25MB'. - Ejecute
EXPLAIN ANALYZEen la consulta problemática en la misma sesión. - Revise la salida de
"Sort Method: quicksort Memory: xkB". Si indica"external merge Disk: xkB", aumente el valor dework_memgradualmente y vuelva a probar hasta que"quicksort Memory"aparezca. La aparición de"quicksort Memory"señala que la consulta ahora opera en la memoria. - 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.