Resolver problemas de memória insuficienteResolve Out Of Memory issues

APLICA-SE A: simSQL Server nãoBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

OLTP na memória do SQL ServerSQL Server In-Memory OLTP usa mais memória e de maneiras diferentes que o SQL ServerSQL Server.uses more memory and in different ways than does SQL ServerSQL Server. É possível que a quantidade de memória que você instalou e atribuiu para o OLTP na memóriaIn-Memory OLTP torne-se inadequada para suas necessidades de crescimento.It is possible that the amount of memory you installed and allocated for OLTP na memóriaIn-Memory OLTP becomes inadequate for your growing needs. Se for o caso, você pode ficar sem memória.If so, you could run out of memory. Este tópico aborda como se recuperar de uma situação de OOM.This topic covers how to recover from an OOM situation. 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.See Monitor and Troubleshoot Memory Usage for guidance that can help you avoid many OOM situations.

Tópicos abordadosCovered in this topic

TópicoTopic Visão geralOverview
Resolver falhas de restauração de banco de dados devido a OOMResolve database restore failures due to 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> '”.What to do if you get the error message, "Restore operation failed for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'."
Resolver o impacto de pouca memória ou condições de OOM na carga de trabalhoResolve impact of low memory or OOM conditions on the workload O que fazer se você desconfiar que os problemas de pouca memória estão comprometendo o desempenho.What to do if you find low memory issues are negatively impacting performance.
Resolver falhas de alocação de página devido à memória insuficiente quando há memória suficiente disponívelResolve page allocation failures due to insufficient memory when sufficient memory is available O que fazer se você receber a mensagem de erro “Desautorizando as alocações de página do banco de dados ' <databaseName> ' devido à memória insuficiente no pool de recursos ' <resourcePoolName> '”.What to do if you get the error message, "Disallowing page allocations for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'. ...” quando a memória disponível é suficiente para a operação...." when available memory is sufficient for the operation.
Práticas recomendadas ao usar o OLTP in-memory em um ambiente de VMBest Practices using In-Memory OLTP in a VM environment O que deve ser levado em consideração ao usar o OLTP in-memory em um ambiente virtualizado.What to keep in mind when using In-Memory OLTP in a virtualized environment.

Resolver falhas de restauração de banco de dados devido a OOMResolve database restore failures due to OOM

Ao tentar restaurar um banco de dados, você pode receber a mensagem de erro: "Falha na operação de restauração do banco de dados ' <nomedoBancoDeDados> ' devido à memória insuficiente no pool de recursos ' <nomeDoPoolDeRecursos> '." Isso indica que o servidor não tem memória suficiente disponível para restaurar o banco de dados.When you attempt to restore a database you may get the error message: "Restore operation failed for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'." This indicates that the server does not have enough available memory for restoring the database.

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.The server you restore a database to must have enough available memory for the memory-optimized tables in the database backup, otherwise the database will not come online, and will be marked as suspect.

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.If the server does have enough physical memory, but you are still seeing this error, it could be that other processes are using too much memory or a configuration issue causes not enough memory to be available for restore. Para esta classe de problemas, use as seguintes medidas para disponibilizar mais memória para a operação de restauração:For this class of issues, use the following measures to make more memory available to the restore operation:

  • Feche temporariamente os aplicativos em execução.Temporarily close running applications.
    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.By closing one or more running applications or stopping services not needed at the moment, you make the memory they were using available for the restore operation. Você poderá reiniciá-los após a restauração bem-sucedida.You can restart them following the successful restore.

  • Aumente o valor de MAX_MEMORY_PERCENT.Increase the value of 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.If the database is bound to a resource pool, which is best practice, the memory available to restore is governed by MAX_MEMORY_PERCENT. Se o valor for muito baixo, a restauração falhará.If the value is too low, restore will fail. Este snippet de código altera MAX_MEMORY_PERCENT para o pool de recursos PoolHk para 70% de memória instalada.This code snippet changes MAX_MEMORY_PERCENT for the resource pool PoolHk to 70% of installed memory.

    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.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT to the same value as 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.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

    -- 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.For information on maximum values for MAX_MEMORY_PERCENT see the topic section Percent of memory available for memory-optimized tables and indexes.

  • Aumente max server memory.Increase 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.For information on configuring max server memory see the topic Server Memory Server Configuration Options.

Resolver o impacto de pouca memória ou condições de OOM na carga de trabalhoResolve impact of low memory or OOM conditions on the workload

Obviamente, é melhor não ficar com pouca memória ou na situação de OOM (memória insuficiente).Obviously, it is best to not get into a low memory or OOM (Out of Memory) situation. Um bom planejamento e monitoramento pode ajudar a evitar situações de OOM.Good planning and monitoring can help avoid OOM situations. Ainda assim, o melhor planejamento nem sempre prevê o que realmente acontece e você pode acabar com pouca memória ou OOM.Still, the best planning does not always foresee what actually happens and you might end up with low memory or OOM. Há duas etapas para a recuperação de OOM:There are two steps to recovering from OOM:

  1. Abrir uma DAC (Conexão de Administrador Dedicada)Open a DAC (Dedicated Administrator Connection)

  2. Realizar a ação corretivaTake corrective action

Abrir uma DAC (Conexão de Administrador Dedicada)Open a DAC (Dedicated Administrator Connection)

SQL ServerSQL Server fornece uma DAC (conexão de administrador dedicada).provides a dedicated administrator connection (DAC). 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.The DAC allows an administrator to access a running instance of SQL Server Database Engine to troubleshoot problems on the server-even when the server is unresponsive to other client connections. O DAC é disponibilizado pelo utilitário sqlcmd e SQL Server Management StudioSQL Server Management Studio.The DAC is available through the sqlcmd utility and SQL Server Management StudioSQL 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.For guidance on using DAC through SSMS or sqlcmd, refer to Diagnostic Connection for Database Administrators.

Realizar a ação corretivaTake corrective action

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.To resolve your OOM condition you need to either free up existing memory by reducing usage, or make more memory available to your in-memory tables.

Liberar memória existenteFree up existing memory

Excluir linhas não essenciais da tabela com otimização de memória e aguardar a coleta de lixoDelete non-essential memory optimized table rows and wait for garbage collection

Você pode remover as linhas não essenciais de uma tabela com otimização de memória.You can remove non-essential rows from a memory optimized table. O coletor de lixo retorna a memória usada por essas linhas para a memória disponível.The garbage collector returns the memory used by these rows to available memory. O mecanismo de OLTP na memória coleta linhas de lixo de maneira agressiva.In-memory OLTP engine collects garbage rows aggressively. No entanto, uma transação demorada poderá evitar a coleta de lixo.However, a long running transaction can prevent garbage collection. 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.For example, if you have a transaction that runs for 5 minutes, any row versions created due to update/delete operations while the transaction was active can't be garbage collected.

Mover uma ou mais linhas a uma tabela baseada em discoMove one or more rows to a disk-based table

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.The following TechNet articles provide guidance on moving rows from a memory-optimized table to a disk-based table.

Aumentar a memória disponívelIncrease available memory

Aumentar o valor de MAX_MEMORY_PERCENT no pool de recursosIncrease value of MAX_MEMORY_PERCENT on the resource pool

Se você não criou um pool de recursos nomeado para as tabelas de memória, deverá fazer isso e associar seus bancos de dados do OLTP na memóriaIn-Memory OLTP a ele.If you have not created a named resource pool for your in-memory tables you should do that and bind your OLTP na memóriaIn-Memory OLTP databases to it. Confira o tópico Associar um banco de dados com 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 na memóriaIn-Memory OLTP a um pool de recursos.See the topic Bind a Database with Memory-Optimized Tables to a Resource Pool for guidance on creating and binding your OLTP na memóriaIn-Memory OLTP databases to a resource pool.

Se seu banco de dados do OLTP na memóriaIn-Memory OLTP estiver associado a um pool de recursos, você poderá aumentar a porcentagem de memória que o pool pode acessar.If your OLTP na memóriaIn-Memory OLTP database is bound to a resource pool you may be able to increase the percent of memory the pool can access. 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.See the sub-topic Change MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool for guidance on changing the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT for a resource pool.

Aumente o valor de MAX_MEMORY_PERCENT.Increase the value of MAX_MEMORY_PERCENT.
Este snippet de código altera MAX_MEMORY_PERCENT para o pool de recursos PoolHk para 70% de memória instalada.This code snippet changes MAX_MEMORY_PERCENT for the resource pool PoolHk to 70% of installed memory.

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.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value.
Confira o tópico Práticas recomendadas ao usar o OLTP in-memory em um ambiente de VM para obter mais informações.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

-- 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.For information on maximum values for MAX_MEMORY_PERCENT see the topic section Percent of memory available for memory-optimized tables and indexes.

Instalar a memória adicionalInstall additional memory

Por fim, a melhor solução, se possível, é instalar mais memória física.Ultimately the best solution, if possible, is to install additional physical memory. 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 ServerSQL Server talvez não precise de mais memória, permitindo assim que você disponibilize a maior parte da memória recém-instalada, se não toda ela, ao pool de recursos.If you do this, remember that you will probably be able to also increase the value of MAX_MEMORY_PERCENT (see the sub-topic Change MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool) since SQL ServerSQL Server won't likely need more memory, allowing you to make most if not all of the newly installed memory available to the resource pool.

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.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value.
Confira o tópico Práticas recomendadas ao usar o OLTP in-memory em um ambiente de VM para obter mais informações.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

Resolver falhas de alocação de página devido à memória insuficiente quando há memória suficiente disponívelResolve page allocation failures due to insufficient memory when sufficient memory is available

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.If you get the error message, 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. in the error log when the available physical memory is sufficient to allocate the page, it may be due to a disabled Resource Governor. Quando o Administrador de Recursos é desabilitado, MEMORYBROKER_FOR_RESERVE induz artificial à pressão de memória artificial.When the Resource Governor is disabled MEMORYBROKER_FOR_RESERVE induces artificial memory pressure.

Para resolver isso, é necessário habilitar o Administrador de Recursos.To resolve this you need to enable the Resource Governor.

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.See Enable Resource Governor for information on Limits and Restrictions as well as guidance on enabling Resource Governor using Object Explorer, Resource Governor properties, or Transact-SQL.

Práticas recomendadas ao usar o OLTP in-memory em um ambiente de VMBest Practices using In-Memory OLTP in a VM environment

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.Server virtualization can help you lower IT capital and operational costs and attain greater IT efficiency with improved application provisioning, maintenance, availability, and backup/recovery processes. 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.With recent technological advances, complex database workloads can be more readily consolidated using virtualization. Este tópico abrange as práticas recomendadas para usar o OLTP in-memory do SQL Server em um ambiente virtualizado.This topic covers best practices for using SQL Server In-Memory OLTP in a virtualized environment.

Pré-alocação de memóriaMemory pre-allocation

Para a memória em um ambiente virtualizado, o melhor desempenho e o suporte aprimorado são considerações essenciais.For memory in a virtualized environment, better performance and enhanced support are essential considerations. 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.You must be able to both quickly allocate memory to virtual machines depending on their requirements (peak and off-peak loads) and ensure that the memory is not wasted. 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.The Hyper-V Dynamic Memory feature increases agility in how the memory is allocated and managed between virtual machines running on a 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.Some best practices for virtualizing and managing SQL Server need to be modified when virtualizing a database with memory-optimized tables. Sem tabelas com otimização de memória, duas das práticas recomendadas são:Without memory-optimized tables, two of the best practices are:

  • 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).If you use min server memory, it is better to assign only the amount of memory that is required so sufficient memory remains for other processes (thereby avoiding paging).
  • Não defina o valor de pré-alocação de memória muito alto.Do not set the memory pre-allocation value too high. 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.Otherwise, other processes may not get sufficient memory at the time when they require it, and this can result in memory paging.

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.If you follow the above practices for a database with memory-optimized tables, an attempt to restore and recover a database could result in the database being in a "Recovery Pending" state, even if you have sufficient memory to recover the database. 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.The reason for this is that, when starting up, In-Memory OLTP brings data into memory more aggressively than dynamic memory allocation allocates memory to the database.

ResoluçãoResolution

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.To mitigate this, pre-allocate sufficient memory to the database to recover or restart the database, not a minimum value relying on dynamic memory to provide the additional memory when needed.

Consulte TambémSee Also

Gerenciando memória para OLTP na memória Managing Memory for In-Memory OLTP
Monitorar e solucionar problemas de uso da memória Monitor and Troubleshoot Memory Usage
Associar um banco de dados com tabelas com otimização de memória a um pool de recursos Bind a Database with Memory-Optimized Tables to a Resource Pool
Guia de arquitetura de gerenciamento de memóriaMemory Management Architecture guide
Opções Server Memory de configuração do servidorServer Memory Server Configuration Options