Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo fornece resoluções para solucionar problemas de falta de memória relacionados ao recurso de metadados otimizados para memória tempdb.
Sintomas
Depois de habilitar o recurso de metadados otimizados para memória tempdb (HkTempDB), você poderá ver o erro 701 indicando exceções por falta de memória para tempdb alocações e falhas do Serviço SQL Server. Além disso, você pode notar que o gestor MEMORYCLERK_XTP de memória para OLTP In-Memory (Hekaton) está crescendo de forma gradual ou rápida e não diminui. À medida que a memória XTP cresce sem um limite superior, você vê a seguinte mensagem de erro no SQL Server:
Não permitir alocações de página para o banco de dados 'tempdb' devido à memória insuficiente no pool de recursos 'default'. Consulte “
http://go.microsoft.com/fwlink/?LinkId=510837” para obter mais informações.
Ao executar uma consulta na DMVdm_os_memory_clerks, você pode ver que a memória alocada para páginas está alta para o gerente de memória MEMORYCLERK_XTP. Por exemplo:
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
Diagnosticar o problema
Para coletar dados para diagnosticar o problema, siga estas etapas:
Colete um rastreamento leve ou um evento estendido (XEvent) para entender a carga de trabalho
tempdbe verificar se ela possui transações explícitas de longa execução com instruções DDL em tabelas temporárias.Colete a saída dos seguintes DMVs para analisar mais detalhadamente.
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 e resolução
Ao usar as DMVs para identificar a causa, você pode ver diferentes cenários do problema. Esses cenários podem ser divididos nas duas categorias a seguir. Para resolver o problema, você pode usar a resolução correspondente para cada cenário. Para obter mais informações sobre como aliviar o problema, consulte Etapas de mitigação para manter a memória de metadados tempdb com otimização de memória sob controle.
Aumento gradual no consumo de memória XTP
Cenário 1
A DMV tempdb.sys.dm_xtp_system_memory_consumers ou tempdb.sys.dm_db_xtp_memory_consumers mostra uma grande diferença entre bytes alocados e bytes usados.
Resolução: para resolver o problema, você pode executar os seguintes comandos no SQL Server 2019 CU13, SQL Server 2022 CU1 ou em uma versão posterior que tenha um novo procedimento
sys.sp_xtp_force_gcpara liberar bytes alocados, mas não utilizados.Observação
A partir do SQL Server 2022 CU1, você precisa executar o procedimento armazenado apenas uma 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_gcCenário 2
A DMV
tempdb.sys.dm_xtp_system_memory_consumersmostra valores altos para bytes alocados e usados nos tipos de consumidores de memóriaVARHEAPeLOOKASIDE.Resolução: verifique se há transações explícitas de longa execução envolvendo instruções DDL em tabelas temporárias e resolva do lado do aplicativo, mantendo as transações curtas.
Observação
Para reproduzir esse problema em um ambiente de teste, você pode criar uma transação explícita usando instruções DDL (Data Definition Language) em tabelas temporárias e deixá-la aberta por um longo tempo quando outra atividade ocorrer.
Cenário 3
A DMV
tempdb.sys.dm_db_xtp_memory_consumersmostra valores altos para bytes alocados e usados em um alocador de objeto grande (LOB) ou heap de tabela em queObject_ID,XTP_Object_IDeIndex_IDsãoNULL.Resolução: aplique o SQL Server 2019 CU16 para o problema 14535149.
Cenário 4
O crescente consumo de memória de banco de dados XTP "VARHEAP\Storage internal heap" leva ao erro de falta de memória 41805.
Resolução: O problema 14087445 já foi identificado e resolvido no SQL Server 17 CU25 e em versões posteriores, e está sendo analisado para ser portado para o SQL Server 2019.
Pico repentino ou aumento rápido no consumo de memória XTP
Cenário 5
A DMV
tempdb.sys.dm_db_xtp_memory_consumersmostra valores altos para bytes alocados ou usados em um heap de tabela em queObject_IDnão éNULL. A causa mais comum desse problema é uma transação de longa execução e explicitamente aberta com instruções DDL em tabelas temporárias. Por exemplo:BEGIN TRAN CREATE TABLE #T(sn int) … … COMMITUma transação explicitamente aberta com instruções DDL em tabelas temporárias não permitirá que o heap de tabela e o heap lookaside sejam liberados para transações subsequentes usando
tempdbmetadados.Resolução: verifique se há transações explícitas de longa execução envolvendo instruções DDL em tabelas temporárias e resolva do lado do aplicativo, mantendo as transações curtas.
Etapas de mitigação para manter a memória de metadados tempdb com otimização de memória sob controle
Para evitar ou resolver transações de longa duração que usam instruções DDL em tabelas temporárias, a orientação geral é manter as transações curtas.
Aumente a memória máxima do servidor para que haja memória suficiente para operar, na presença de cargas de trabalho pesadas de tempdb.
Execute
sys.sp_xtp_force_gcperiodicamente.Para proteger o servidor de possíveis condições de falta de memória, você pode associar tempdb a um pool de recursos do Administrador de Recursos. Por exemplo, crie um pool de recursos usando
MAX_MEMORY_PERCENT = 30. Em seguida, use o seguinte comando ALTER SERVER CONFIGURATION para associar o pool de recursos a metadados tempdb com otimização de memória.ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON (RESOURCE_POOL = '<PoolName>');Essa alteração requer uma reinicialização para entrar em vigor, mesmo que os metadados com otimização
tempdbde memória já estejam habilitados. Para saber mais, veja:Aviso
Depois de associar o HktempDB a um pool, o pool pode atingir sua configuração máxima, e qualquer consulta que use
tempdbpode falhar com erros de memória insuficiente. Por exemplo:Não permitir alocações de página para o banco de dados 'tempdb' devido à memória insuficiente no pool de recursos 'HkTempDB'. Consulte “
http://go.microsoft.com/fwlink/?LinkId=510837” para obter mais informações. O XTP falhou na alocação de páginas devido à pressão de memória: FAIL_PAGE_ALLOCATION 8Em determinadas circunstâncias, o serviço SQL Server pode ser interrompido se ocorrer um erro de memória insuficiente. Para reduzir a chance de isso acontecer, defina o pool de memória para um valor alto.
O recurso de metadados com otimização
tempdbde memória não dá suporte a todas as cargas de trabalho. Por exemplo, o uso de transações explícitas com instruções DDL em tabelas temporárias que são executadas por um longo tempo levará aos cenários descritos. Se você tiver essas transações em sua carga de trabalho e não puder controlar sua duração, talvez esse recurso não seja apropriado para seu ambiente. Você deve testar extensivamente antes de usarHkTempDBo .
Mais informações
Essas seções fornecem mais detalhes sobre alguns dos componentes de memória envolvidos em metadados com otimização tempdb de memória.
Alocador de memória Lookaside
Lookaside no OLTP In-Memory é um alocador de memória local de thread para ajudar a obter processamento rápido de transações. Cada objeto thread contém uma coleção de alocadores de memória lookside. Cada lookaside associado a cada thread tem um limite superior predefinido de quanta memória ele pode alocar. Quando o limite é atingido, o thread aloca memória de um pool de memória compartilhada de transbordamento (VARHEAP). A DMV sys.dm_xtp_system_memory_consumers agrega dados para cada tipo lookaside (memory_consumer_type_desc = 'LOOKASIDE') e o pool de memória compartilhada (memory_consumer_type_desc = 'VARHEAP' e memory_consumer_desc = 'Lookaside heap').
Consumidores no nível do sistema: tempdb.sys.dm_xtp_system_memory_consumers
Cerca de 25 tipos de consumidores de memória lookaside são o limite superior. Quando os threads precisam de mais memória desses lookasides, a memória transborda e fica satisfeita com o heap lookside. Valores altos para bytes usados podem ser um indicador de carga de trabalho pesada tempdb constante e/ou transação aberta de longa duração que usa objetos temporários.
-- 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 no nível do banco de dados: tempdb.sys.dm_db_xtp_memory_consumers
O alocador LOB é usado para dados LOB/Off-row em tabelas do sistema.
O heap da tabela é usado para linhas de tabelas do sistema.
Valores altos para bytes usados podem ser um indicador de carga de trabalho constantemente pesada tempdb e/ou de uma transação de longa duração aberta que utiliza objetos temporários.