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.
En este artículo se proporcionan soluciones para resolver problemas de falta de memoria relacionados con la característica de metadatos optimizada para memoria tempdb.
Síntomas
Después de habilitar la característica de metadatos optimizados para memoria (HkTempDB), es posible que vea el error 701, que indica excepciones de memoria insuficiente para asignaciones y fallos del servicio SQL Server. Además, es posible que vea que el responsable de memoria MEMORYCLERK_XTP para OLTP en memoria (Hekaton) está creciendo gradual o rápidamente y no se reduce nuevamente. A medida que la memoria XTP crece sin un límite superior, verá el siguiente mensaje de error en SQL Server:
No permitir asignaciones de páginas para la base de datos "tempdb" debido a una memoria insuficiente en el grupo de recursos "default". Vea '
http://go.microsoft.com/fwlink/?LinkId=510837' para obtener más información.
Al ejecutar una consulta en el DMVdm_os_memory_clerks, puede ver que la memoria de páginas asignada es alta para el MEMORYCLERK_XTPadministrador de memoria. Por ejemplo:
SELECT type, memory_node_id, pages_kb
FROM sys.dm_os_memory_clerks
WHERE type = 'MEMORYCLERK_XTP'
Resultado:
type memory_node_id pages_kb
------------------------------------------------------------ -------------- --------------------
MEMORYCLERK_XTP 0 60104496
MEMORYCLERK_XTP 64 0
Diagnóstico del problema
Para recopilar datos para diagnosticar el problema, siga estos pasos:
Recopile un seguimiento ligero o un evento extendido (XEvent) para comprender
tempdbla carga de trabajo y averigüe si la carga de trabajo tiene transacciones explícitas de larga duración con instrucciones DDL en tablas temporales.Recopile la salida de las siguientes DMV para un análisis más detallado.
SELECT * FROM sys.dm_os_memory_clerks SELECT * FROM sys.dm_exec_requests SELECT * FROM sys.dm_exec_sessions -- from tempdb SELECT * FROM tempdb.sys.dm_xtp_system_memory_consumers SELECT * FROM tempdb.sys.dm_db_xtp_memory_consumers SELECT * FROM tempdb.sys.dm_xtp_transaction_stats SELECT * FROM tempdb.sys.dm_xtp_gc_queue_stats SELECT * FROM tempdb.sys.dm_db_xtp_object_stats SELECT * FROM tempdb.sys.dm_db_xtp_transactions SELECT * FROM tempdb.sys.dm_tran_session_transactions SELECT * FROM tempdb.sys.dm_tran_database_transactions SELECT * FROM tempdb.sys.dm_tran_active_transactions
Causa y resolución
Al usar las DMV para verificar la causa, puede que puedas ver diferentes escenarios del problema. Estos escenarios se pueden dividir en las dos categorías siguientes. Para resolver el problema, puede usar la resolución correspondiente para cada escenario. Para obtener más información sobre cómo aliviar el problema, consulte Pasos de mitigación para mantener bajo control la memoria de metadatos optimizada de tempdb.
Aumento gradual del consumo de memoria XTP
Escenario 1
La DMV tempdb.sys.dm_xtp_system_memory_consumers o tempdb.sys.dm_db_xtp_memory_consumers muestra una gran diferencia entre bytes asignados y bytes usados.
Solución: para resolver el problema, puede ejecutar los siguientes comandos en SQL Server 2019 CU13, SQL Server 2022 CU1 o una versión posterior que tenga un nuevo procedimiento
sys.sp_xtp_force_gcpara liberar bytes asignados pero no utilizados.Nota:
A partir de SQL Server 2022 CU1, debe ejecutar el procedimiento almacenado solo una vez.
/* Yes, 2 times for both*/ EXEC sys.sp_xtp_force_gc 'tempdb' GO EXEC sys.sp_xtp_force_gc 'tempdb' GO EXEC sys.sp_xtp_force_gc GO EXEC sys.sp_xtp_force_gcEscenario 2
La DMV
tempdb.sys.dm_xtp_system_memory_consumersmuestra valores altos para bytes asignados y usados para los tipos de consumidor de memoriaVARHEAPyLOOKASIDE.Resolución: compruebe si hay transacciones explícitas de ejecución prolongada que implican instrucciones DDL en tablas temporales y resuelva desde la aplicación manteniendo las transacciones cortas.
Nota:
Para reproducir este problema en un entorno de prueba, puede crear una transacción explícita mediante instrucciones del lenguaje de definición de datos (DDL) en tablas temporales y dejarla abierta durante mucho tiempo cuando se produzca otra actividad.
Escenario 3
La DMV
tempdb.sys.dm_db_xtp_memory_consumersmuestra valores altos para bytes asignados y usados en un asignador de objetos grandes (LOB) o pila de tabla, dondeObject_ID,XTP_Object_ID, yIndex_IDsonNULL.Solución: aplique SQL Server 2019 CU16 para el problema 14535149.
Escenario 4
El consumidor de memoria de la base de datos XTP, en continuo crecimiento, "VARHEAP\Storage internal heap", conduce a un error de memoria insuficiente 41805.
Solución: el problema 14087445 ya identificado y resuelto en SQL Server 17 CU25 y versiones posteriores se está examinando para su portabilidad a SQL Server 2019.
Aumento repentino o rápido en el consumo de memoria XTP
Escenario 5
La DMV
tempdb.sys.dm_db_xtp_memory_consumersmuestra valores altos para bytes asignados o usados en un montón de tabla dondeObject_IDnoNULLes . La causa más común de este problema es una transacción de larga duración abierta explícitamente con sentencias DDL en tablas temporales. Por ejemplo:BEGIN TRAN CREATE TABLE #T(sn int) … … COMMITUna transacción abierta explícitamente con instrucciones DDL en tablas temporales no permitirá que el montón de tablas y el montón de lookaside se libere para las transacciones posteriores mediante
tempdbmetadatos.Resolución: compruebe si hay transacciones explícitas de ejecución prolongada que implican instrucciones DDL en tablas temporales y resuelva desde la aplicación manteniendo las transacciones cortas.
Pasos de mitigación para controlar la memoria de los metadatos de tempdb optimizada para memoria.
Para evitar o resolver transacciones de larga duración que usan sentencias DDL en tablas temporales, la recomendación general es mantener las transacciones cortas.
Aumente memoria máxima del servidor para permitir suficiente memoria en presencia de cargas de trabajo intensivas en tempdb.
Ejecute
sys.sp_xtp_force_gcperiódicamente.Para proteger el servidor frente a posibles condiciones de memoria insuficientes, puede enlazar tempdb a un grupo de recursos de Resource Governor. Por ejemplo, cree un grupo de recursos mediante
MAX_MEMORY_PERCENT = 30. A continuación, use el siguiente comando ALTER SERVER CONFIGURATION para enlazar el grupo de recursos a metadatos tempdb optimizados para memoria.ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON (RESOURCE_POOL = '<PoolName>');Este cambio requiere un reinicio para surtir efecto, incluso si los metadatos optimizados
tempdbpara memoria ya están habilitados. Para más información, vea:Advertencia
Después de vincular HktempDB a un grupo, el grupo puede alcanzar su configuración máxima y las consultas que usen
tempdbpueden fallar con errores por falta de memoria. Por ejemplo:No permitir asignaciones de páginas para la base de datos "tempdb" debido a una memoria insuficiente en el grupo de recursos "HkTempDB". Vea '
http://go.microsoft.com/fwlink/?LinkId=510837' para obtener más información. Error en la asignación de páginas XTP debido a la presión de memoria: FAIL_PAGE_ALLOCATION 8En determinadas circunstancias, el servicio SQL Server podría detenerse si se produce un error de memoria insuficiente. Para reducir la posibilidad de que esto suceda, establezca el grupo de memoria
MAX_MEMORY_PERCENTen un nivel elevado.La característica de metadatos optimizados para la memoria
tempdbno admite todas las cargas de trabajo. Por ejemplo, el uso de transacciones explícitas con instrucciones DDL en tablas temporales que se ejecutan durante mucho tiempo dará lugar a los escenarios descritos. Si tiene estas transacciones en la carga de trabajo y no puede controlar su duración, quizás esta característica no sea adecuada para su entorno. Debe realizar pruebas exhaustivas antes de usarHkTempDB.
Más información
En estas secciones se proporcionan más detalles sobre algunos de los componentes de memoria implicados en los metadatos optimizados para memoria tempdb.
Asignador de memoria de Lookaside
El mecanismo Lookaside en OLTP en memoria es un asignador de memoria específico de subproceso diseñado para ayudar a lograr un procesamiento rápido de transacciones. Cada objeto de subproceso contiene una colección de asignadores de memoria tipo "lookaside". Cada lookaside asociado a cada hilo tiene un límite superior predefinido sobre la cantidad de memoria que puede asignar. Cuando se alcanza el límite, el subproceso asigna memoria de un grupo de memoria compartido de desbordamiento (VARHEAP). La DMV sys.dm_xtp_system_memory_consumers agrega datos para cada tipo de "lookaside" (memory_consumer_type_desc = 'LOOKASIDE') y el grupo de memoria compartida (memory_consumer_type_desc = 'VARHEAP' y memory_consumer_desc = 'Lookaside heap').
Consumidores a nivel de sistema: tempdb.sys.dm_xtp_system_memory_consumers
Alrededor de 25 tipos de consumidor de memoria lookaside son el límite superior. Cuando los subprocesos necesitan más memoria de esos lookasides, la memoria se derrama hacia y está satisfecho con el montón de lookaside. Los valores altos para bytes usados podrían ser un indicador de una carga de trabajo intensiva tempdb constante o una transacción abierta de larga duración que usa objetos temporales.
-- system memory consumers @ instance
SELECT memory_consumer_type_desc, memory_consumer_desc, allocated_bytes, used_bytes
FROM sys.dm_xtp_system_memory_consumers
memory_consumer_type_desc memory_consumer_desc allocated_bytes used_bytes
------------------------- ------------------------------------------ -------------------- --------------------
VARHEAP Lookaside heap 0 0
PGPOOL 256K page pool 0 0
PGPOOL 4K page pool 0 0
VARHEAP System heap 458752 448000
LOOKASIDE Transaction list element 0 0
LOOKASIDE Delta tracker cursor 0 0
LOOKASIDE Transaction delta tracker 0 0
LOOKASIDE Creation Statement Id Map Entry 0 0
LOOKASIDE Creation Statement Id Map 0 0
LOOKASIDE Log IO proxy 0 0
LOOKASIDE Log IO completion 0 0
LOOKASIDE Sequence object insert row 0 0
LOOKASIDE Sequence object map entry 0 0
LOOKASIDE Sequence object values map 0 0
LOOKASIDE Redo transaction map entry 0 0
LOOKASIDE Transaction recent rows 0 0
LOOKASIDE Heap cursor 0 0
LOOKASIDE Range cursor 0 0
LOOKASIDE Hash cursor 0 0
LOOKASIDE Transaction dependent ring buffer 0 0
LOOKASIDE Transaction save-point set entry 0 0
LOOKASIDE Transaction FK validation sets 0 0
LOOKASIDE Transaction partially-inserted rows set 0 0
LOOKASIDE Transaction constraint set 0 0
LOOKASIDE Transaction save-point set 0 0
LOOKASIDE Transaction write set 0 0
LOOKASIDE Transaction scan set 0 0
LOOKASIDE Transaction read set 0 0
LOOKASIDE Transaction 0 0
Consumidores a nivel de base de datos: tempdb.sys.dm_db_xtp_memory_consumers
El asignador de LOB se utiliza para los datos LOB/Off-row de las tablas del sistema.
El montón de tablas se usa para las filas de las tablas del sistema.
Los valores altos de bytes usados podrían ser un indicador de una carga de trabajo intensa y constante tempdb y/o de una transacción abierta de larga duración que utiliza objetos temporales.