Partilhar via


Resolver problemas de falta de memória

Aplica-se a:SQL Server

In-Memory OLTP usa mais memória e de maneiras diferentes do SQL Server. É possível que a quantidade de memória instalada e alocada para In-Memory OLTP se torne inadequada para as suas necessidades crescentes. Se assim for, você pode ficar sem memória. Este tópico aborda como se recuperar de uma situação de OOM. Consulte Monitor e Solucionar Problemas de Uso de Memória para obter orientações que podem ajudá-lo a evitar muitos cenários de OOM.

Abordado neste tópico

Tópico Visão geral
Resolver falhas de restauração do banco de dados devido ao OOM O que fazer se você receber a mensagem de erro "Falha na operação de restauração do banco de dados '<databaseName>' devido à memória insuficiente no pool de recursos '<resourcePoolName>'."
Resolver o impacto de pouca memória ou condições de falta de memória (OOM) nas tarefas O que fazer se você achar que problemas de memória insuficiente estão afetando negativamente o desempenho.
Resolver falhas de alocação de página devido a memória insuficiente quando houver memória suficiente disponível O que fazer se você receber a mensagem de erro "Não permitindo alocações de página para o banco de dados '<databaseName>' devido à memória insuficiente no pool de recursos '<resourcePoolName>'. ..." quando a memória disponível é suficiente para a operação.
Práticas Recomendadas usando In-Memory OLTP em um ambiente de máquina virtual O que ter em mente ao usar In-Memory OLTP em um ambiente virtualizado.

Resolver falhas de restauração do banco de dados devido ao OOM

Quando você tenta restaurar um banco de dados, você receberá a mensagem de erro: "Falha na operação de restauração para o banco de dados '<databaseName>' devido à memória insuficiente no pool de recursos '<resourcePoolName>'." Isso indica que o servidor não tem memória disponível suficiente para restaurar o banco de dados.

O servidor para o qual você restaura um banco de dados deve ter memória disponível suficiente para as tabelas com otimização de memória no backup do banco de dados, caso contrário, o banco de dados não ficará online e será marcado como suspeito.

Se o servidor tiver memória física suficiente, mas você ainda estiver vendo esse erro, pode ser que outros processos estejam usando muita memória ou um problema de configuração faça com que não haja memória suficiente para estar disponível para restauração. Para essa classe de problemas, use as seguintes medidas para disponibilizar mais memória para a operação de restauração:

  • Feche temporariamente os aplicativos em execução.
    Ao fechar um ou mais aplicativos em execução ou interromper serviços não necessários no momento, você torna a memória que eles estavam usando disponível para a operação de restauração. Você pode reiniciá-los após a restauração bem-sucedida.

  • Aumente o valor do MAX_MEMORY_PERCENT.
    Se o banco de dados estiver vinculado a um pool de recursos, o que é uma prática recomendada, a memória disponível para restauração será governada por MAX_MEMORY_PERCENT. Se o valor for muito baixo, a restauração falhará. Esse trecho de código altera MAX_MEMORY_PERCENT do pool de recursos PoolHk para 70% de memória instalada.

    Importante

    Se o servidor estiver sendo executado em uma VM e não estiver dedicado, defina o valor de MIN_MEMORY_PERCENT com o mesmo valor que MAX_MEMORY_PERCENT.
    Consulte o tópico Práticas recomendadas usando In-Memory OLTP em um ambiente VM para obter mais informações.

    -- disable resource governor  
    ALTER RESOURCE GOVERNOR DISABLE  
    
    -- change the value of MAX_MEMORY_PERCENT  
    ALTER RESOURCE POOL PoolHk  
    WITH  
         ( MAX_MEMORY_PERCENT = 70 )  
    GO  
    
    -- reconfigure the Resource Governor  
    --    RECONFIGURE enables resource governor  
    ALTER RESOURCE GOVERNOR RECONFIGURE  
    GO  
    
    

    Para obter informações sobre valores máximos para MAX_MEMORY_PERCENT consulte a seção de tópico Porcentagem de memória disponível para tabelas e índices com otimização de memória.

  • Aumente memória máxima do servidor.
    Para obter informações sobre configurar a máxima memória do servidor , consulte o tópico Opções de Configuração de Memória do Servidor.

Atenuar o impacto de insuficiência de memória ou condições de esgotamento de memória sobre a carga de trabalho

Obviamente, é melhor não entrar numa situação de pouca memória ou OOM (Out of Memory). Um bom planeamento e monitorização podem ajudar a evitar situações de OOM. Ainda assim, o melhor planejamento nem sempre prevê o que realmente acontece e você pode acabar com pouca memória ou OOM. Há duas etapas para se recuperar do OOM:

  1. Abra um DAC (Conexão de Administrador Dedicado)

  2. Tome medidas corretivas

Abra um DAC (Conexão de Administrador Dedicado)

O SQL Server fornece uma conexão de administrador (DAC) dedicada. O DAC permite que um administrador acesse uma instância em execução do Mecanismo de Banco de Dados do SQL Server para solucionar problemas no servidor, mesmo quando o servidor não responde a outras conexões de cliente. O DAC está disponível por meio do utilitário sqlcmd e do SQL Server Management Studio.

Para obter orientação sobre como usar o DAC por meio do SSMS ou sqlcmd, consulte Conexão de diagnóstico para administradores de banco de dados.

Tomar medidas corretivas

Para resolver sua condição OOM, você precisa liberar memória existente reduzindo o uso ou disponibilizar mais memória para suas tabelas na memória.

Libere a memória existente

Exclua linhas de tabela otimizadas para memória não essencial e aguarde a coleta de lixo

Você pode remover linhas não essenciais de uma tabela otimizada para memória. O coletor de lixo retorna a memória usada por essas linhas para a memória disponível. O mecanismo OLTP na memória coleta linhas de lixo agressivamente. No entanto, uma transação de longa duração pode impedir a coleta de lixo. Por exemplo, se tiveres uma transação que dura 5 minutos, todas as versões de linhas criadas devido a operações de atualização/exclusão enquanto a transação estava ativa não poderão ser recolhidas como lixo.

Mover uma ou mais linhas para uma tabela baseada em disco

Os seguintes artigos do TechNet fornecem orientação sobre como mover linhas de uma tabela com otimização de memória para uma tabela baseada em disco.

Aumentar a memória disponível

Aumente o valor de "MAX_MEMORY_PERCENT" no pool de recursos

Se você não criou um pool de recursos nomeado para suas tabelas na memória, deverá fazer isso e vincular seus bancos de dados OLTP In-Memory a ele. Consulte o tópico Vincular um banco de dados com tabelas Memory-Optimized a um pool de recursos para obter orientação sobre como criar e vincular seus bancos de dados OLTP In-Memory a um pool de recursos.

Se o banco de dados OLTP In-Memory estiver vinculado a um pool de recursos, você poderá aumentar a porcentagem de memória que o pool pode acessar. Consulte o subtópico Alterar MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT em um pool existente para obter orientação sobre como alterar o valor de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT para um pool de recursos.

Aumente o valor do MAX_MEMORY_PERCENT.
Esse trecho de código altera MAX_MEMORY_PERCENT do pool de recursos PoolHk para 70% de memória instalada.

Importante

Se o servidor estiver sendo executado em uma VM e não estiver dedicado, defina o valor de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT com o mesmo valor.
Consulte o tópico Práticas recomendadas usando In-Memory OLTP em um ambiente VM para obter mais informações.

-- disable resource governor  
ALTER RESOURCE GOVERNOR DISABLE  
  
-- change the value of MAX_MEMORY_PERCENT  
ALTER RESOURCE POOL PoolHk  
WITH  
     ( MAX_MEMORY_PERCENT = 70 )  
GO  
  
-- reconfigure the Resource Governor to enabled it
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

Para obter informações sobre valores máximos para MAX_MEMORY_PERCENT consulte a seção de tópico Porcentagem de memória disponível para tabelas e índices com otimização de memória.

Instalar memória adicional

Em última análise, a melhor solução, se possível, é instalar memória física adicional. Se você fizer isso, lembre-se de que provavelmente também poderá aumentar o valor de MAX_MEMORY_PERCENT (consulte o subtópico Alterar MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT em um pool existente), já que o SQL Server provavelmente não precisará de mais memória, permitindo que você disponibilize a maioria, se não toda a memória recém-instalada para o pool de recursos.

Importante

Se o servidor estiver sendo executado em uma VM e não estiver dedicado, defina o valor de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT com o mesmo valor.
Consulte o tópico Práticas recomendadas usando In-Memory OLTP em um ambiente VM para obter mais informações.

Resolver falhas de alocação de página devido a memória insuficiente quando houver memória suficiente disponível

Se você receber a mensagem de erro, Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'https://go.microsoft.com/fwlink/?LinkId=330673' for more information. no log de erros quando a memória física disponível é suficiente para alocar a página, pode ser devido a um Administrador de Recursos desativado. Quando o Administrador de Recursos está desativado MEMORYBROKER_FOR_RESERVE induz pressão de memória artificial.

Para resolver isso, você precisa habilitar o Administrador de Recursos.

Consulte Ativar o Administrador de Recursos para obter informações sobre Limites e Restrições, bem como orientações sobre como ativá-lo usando o Pesquisador de Objetos, as propriedades do Administrador de Recursos ou Transact-SQL.

Práticas recomendadas usando In-Memory OLTP em um ambiente VM

A virtualização de servidores pode ajudá-lo a reduzir os custos operacionais e de capital de TI e a obter maior eficiência de TI com processos aprimorados de provisionamento, manutenção, disponibilidade e backup/recuperação de aplicativos. Com os recentes avanços tecnológicos, cargas de trabalho complexas de bancos de dados podem ser mais facilmente consolidadas usando virtualização. Este tópico aborda as práticas recomendadas para usar o SQL Server In-Memory OLTP em um ambiente virtualizado.

Pré-alocação de memória

Para memória em um ambiente virtualizado, melhor desempenho e suporte aprimorado são considerações essenciais. Você deve ser capaz de alocar memória rapidamente para máquinas virtuais, dependendo de seus requisitos (cargas de pico e fora de pico) e garantir que a memória não seja desperdiçada. O recurso Memória Dinâmica Hyper-V aumenta a agilidade na forma como a memória é alocada e gerenciada entre máquinas virtuais em execução em um host.

Algumas práticas recomendadas para virtualização e gerenciamento do SQL Server precisam ser modificadas ao virtualizar um banco de dados com tabelas com otimização de memória. Sem tabelas com otimização de memória, duas das práticas recomendadas são:

  • Se você usar min server memory, é melhor atribuir apenas a quantidade de memória necessária para que permaneça memória suficiente para outros processos (evitando assim a paginação).
  • Não defina o valor de pré-alocação de memória muito alto. Caso contrário, outros processos podem não obter memória suficiente no momento em que a exigem, e isso pode resultar em paginação de memória.

Se você seguir as práticas acima para um banco de dados com tabelas otimizadas para memória, uma tentativa de efetuar operações de restauração e recuperação pode resultar que o banco de dados fique no estado "Pendente de recuperação", mesmo que você tenha memória suficiente para recuperar o banco de dados. A razão para isso é que, ao iniciar, In-Memory OLTP carrega dados na memória de maneira mais agressiva do que a alocação dinâmica de memória aloca memória para o banco de dados.

Resolução

Para atenuar isso, pré-aloque memória suficiente para o banco de dados para recuperar ou reiniciar o banco de dados, não um valor mínimo que depende de memória dinâmica para fornecer a memória adicional quando necessário.

Ver também

Gerenciando memória para In-Memory OLTP
monitorar e solucionar problemas de uso de memória
vincular um banco de dados com tabelas Memory-Optimized a um pool de recursos
Guia de arquitetura de gerenciamento de memória
Opções de configuração do servidor de memória do servidor