Resolver problemas de memória insuficiente
Aplica-se a: SQL Server
O OLTP in-memory usa mais memória e de maneiras diferentes do SQL Server. É possível que a quantidade de memória que você instalou e atribuiu para o OLTP in-memory torne-se inadequada para suas necessidades de crescimento. Se for o caso, você pode ficar sem memória. Este tópico aborda como se recuperar de uma situação de OOM. Veja Monitorar e solucionar problemas de uso da memória para obter diretrizes que podem ajudá-lo a evitar várias situações de OOM.
Tópicos abordados
Tópico | Visão geral |
---|---|
Resolver falhas de restauração de banco de dados devido a OOM | O que fazer se você receber a mensagem de erro “Falha na operação de restauração do banco de dados ‘<databaseName>‘ devido a memória insuficiente no pool de recursos ‘<resourcePoolName>‘”. |
Resolver o impacto de pouca memória ou condições de OOM na carga de trabalho | O que fazer se você desconfiar que os problemas de pouca memória estão comprometendo o desempenho. |
Resolver falhas de alocação de página devido à memória insuficiente quando há memória suficiente disponível | O que fazer se você receber a mensagem de erro “Desautorizando as alocações de página do banco de dados '<databaseName>' devido a memória insuficiente no pool de recursos '<resourcePoolName>‘”. ...” quando a memória disponível é suficiente para a operação. |
Práticas recomendadas ao usar o OLTP in-memory em um ambiente de VM | O que deve ser levado em consideração ao usar o OLTP in-memory em um ambiente virtualizado. |
Resolver falhas de restauração de banco de dados devido a OOM
Ao tentar restaurar um banco de dados, você poderá receber a mensagem de erro: “Falha na operação de restauração do banco de dados '<databaseName>' devido a 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 restaurado em um banco de dados deve ter memória suficiente disponível para as tabelas com otimização de memória no backup de banco de dados; caso contrário, o banco de dados não será colocado online e será marcado como suspeito.
Se o servidor tiver memória física suficiente, mas você ainda estiver vendo este erro, é possível que outros processos estejam usando uma quantidade excessiva de memória ou um problema de configuração faz com que não haja memória suficiente disponível para a restauração. Para esta 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 desnecessários no momento, você disponibiliza a memória que eles estavam usando para a operação de restauração. Você poderá reiniciá-los após a restauração bem-sucedida.Aumente o valor de MAX_MEMORY_PERCENT.
Se o banco de dados for associado a um pool de recursos, o que é uma prática recomendada, a memória disponível para a restauração será controlada por MAX_MEMORY_PERCENT. Se o valor for muito baixo, a restauração falhará. Este snippet de código altera MAX_MEMORY_PERCENT para o pool de recursos PoolHk para 70% de memória instalada.Importante
Se o servidor estiver sendo executado em uma máquina virtual e não for dedicado, defina o valor de MIN_MEMORY_PERCENT para o mesmo valor de MAX_MEMORY_PERCENT.
Confira o tópico Práticas recomendadas ao usar o OLTP in-memory em um ambiente de 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 os valores máximos para MAX_MEMORY_PERCENT, confira a seção do tópico Percentual de memória disponível para índices e tabelas com otimização de memória.
Aumente max server memory.
Para obter informações sobre como configurar a opção max server memory, consulte o tópico Opções de configuração de servidor Server Memory.
Resolver o impacto de pouca memória ou condições de OOM na carga de trabalho
Obviamente, é melhor não ficar com pouca memória ou na situação de OOM (memória insuficiente). Um bom planejamento e monitoramento pode 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 a recuperação de OOM:
Abrir uma DAC (Conexão de Administrador Dedicada)
O SQL Server fornece uma DAC (Conexão de Administrador Dedicada). A 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 está respondendo às conexões de outro cliente. A DAC está disponível por meio do utilitário sqlcmd
e do SQL Server Management Studio.
Para obter orientações sobre como usar o DAC por meio do SSMS ou do sqlcmd
, consulte Conexão de diagnóstico para administradores de banco de dados.
Realizar a ação corretiva
Para resolver a sua condição de OOM, você precisa ou liberar memória existente reduzindo o uso ou disponibilizar mais memória para as tabelas de memória.
Liberar memória existente
Excluir linhas não essenciais da tabela com otimização de memória e aguardar a coleta de lixo
Você pode remover as linhas não essenciais de uma tabela com otimização de memória. O coletor de lixo retorna a memória usada por essas linhas para a memória disponível. O mecanismo de OLTP na memória coleta linhas de lixo de maneira agressiva. No entanto, uma transação demorada poderá evitar a coleta de lixo. Por exemplo, se você tiver uma transação que é executada durante 5 minutos, todas as versões de linha criadas por causa das operações de atualização/exclusão enquanto a transação estava ativa não poderão ser limpas.
Mover uma ou mais linhas a uma tabela baseada em disco
Os seguintes artigos da 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
Aumentar o valor de MAX_MEMORY_PERCENT no pool de recursos
Se você não tiver criado um pool de recursos nomeado para as tabelas na memória, deverá fazê-lo e associar os bancos de dados do OLTP in-memory a ele. Confira o tópico Associar um banco de dados a tabelas com otimização de memória a um pool de recursos para obter diretrizes sobre como criar e associar bancos de dados do OLTP in-memory a um pool de recursos.
Se seu banco de dados do OLTP in-memory estiver associado a um pool de recursos, você poderá aumentar a porcentagem de memória que o pool poderá acessar. Confira o subtópico Alterar MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT em um pool existente para obter diretrizes sobre como alterar o valor de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT em um pool de recursos.
Aumente o valor de MAX_MEMORY_PERCENT.
Este snippet de código altera MAX_MEMORY_PERCENT para o pool de recursos PoolHk para 70% de memória instalada.
Importante
Se o servidor estiver sendo executado em uma máquina virtual e não for dedicado, defina o valor de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT como o mesmo.
Confira o tópico Práticas recomendadas ao usar o OLTP in-memory em um ambiente de 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 os valores máximos para MAX_MEMORY_PERCENT, confira a seção do tópico Percentual de memória disponível para índices e tabelas com otimização de memória.
Instalar a memória adicional
Por fim, a melhor solução, se possível, é instalar mais memória física. Se você fizer isso, lembre-se de que provavelmente também poderá aumentar o valor de MAX_MEMORY_PERCENT (confira 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 toda ou a maior parte da memória recém-instalada ao pool de recursos.
Importante
Se o servidor estiver sendo executado em uma máquina virtual e não for dedicado, defina o valor de MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT como o mesmo.
Confira o tópico Práticas recomendadas ao usar o OLTP in-memory em um ambiente de VM para obter mais informações.
Resolver falhas de alocação de página devido à memória insuficiente quando há 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 for suficiente para alocar a página, talvez isso ocorra porque um Administrador de Recursos está desabilitado. Quando o Administrador de Recursos é desabilitado, MEMORYBROKER_FOR_RESERVE induz artificial à pressão de memória artificial.
Para resolver isso, é necessário habilitar o Administrador de Recursos.
Veja Habilitar Administrador de Recursos para obter informações sobre limites e restrições, bem como diretrizes sobre como habilitar o Administrador de Recursos usando o Pesquisador de Objetos, as propriedades do Administrador de Recursos ou o Transact-SQL.
Práticas recomendadas ao usar o OLTP in-memory em um ambiente de VM
A virtualização do servidor pode ajudá-lo a diminuir os custos operacionais e de capital com a TI, e atingir uma maior eficiência de TI com processos de provisionamento de aplicativo, manutenção, disponibilidade e backup/recuperação aprimorados. Com os avanços tecnológicos recentes, as cargas de trabalho de banco de dados complexas podem mais ser prontamente consolidadas usando a virtualização. Este tópico abrange as práticas recomendadas para usar o OLTP in-memory do SQL Server em um ambiente virtualizado.
Pré-alocação de memória
Para a memória em um ambiente virtualizado, o melhor desempenho e o 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 de Memória Dinâmica do Hyper-V aumenta a agilidade sobre como a memória é alocada e gerenciada entre as máquinas virtuais executadas em um host.
Algumas práticas recomendadas para virtualizar e gerenciar o SQL Server precisam ser modificadas ao virtualizar um banco de dados que tenha 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 a opção min server memory, será melhor atribuir somente a quantidade de memória necessária para que uma parcela suficiente de memória permaneça em outros processos (impedindo 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 exigirem e isso pode levar à paginação de memória.
Se você seguir as práticas acima para um banco de dados com tabelas otimizadas pela memória, uma tentativa de restaurar e recuperar um banco de dados poderá resultar no banco de dados ficando em um estado de “Recuperação Pendente”, mesmo se você tiver memória suficiente para recuperá-lo. A razão para isso é que, ao iniciar, o OLTP in-memory traz os dados para a memória de maneira mais agressiva do que a alocação de memória dinâmica faz ao alocar a memória no banco de dados.
Resolução
Para solucionar isso, pré-aloque memória suficiente para o banco de dados a ser recuperado ou reinicie o banco de dados, não um valor mínimo que depende da memória dinâmica para fornecer a memória adicional quando for necessário.
Confira também
Gerenciando memória para OLTP in-memory
Monitorar e solucionar problemas de uso da memória
Associar um banco de dados com tabelas com otimização de memória a um pool de recursos
Guia de arquitetura de gerenciamento de memória
Opções Server Memory de configuração do servidor