Estou tendo erros periódicos de OOM do SQL Server, uma vez que o SQL Server se desligava e sempre acontecia durante a noite, quando ninguém o usava e nenhum trabalho do SQL Agent em execução naquele momento:
Aqui está o erro típico:
17/08/2017 19: 31: 17, spid100, Desconhecido, Não há memória do sistema insuficiente no pool de recursos 'interno' para executar esta consulta.
17/08/2017 19: 31: 17, spid100, Desconhecido, Erro: 701 Gravidade: 17 Estado: 123.
17/08/2017 19: 31: 17, spid112, Desconhecido, Erro: 18056 Gravidade: 20 Estado: 29. (Params :). O erro é impresso no modo conciso porque ocorreu um erro durante a formatação. As notificações de rastreamento ETW etc. são ignoradas.
Aqui estão as informações do servidor:
- Memória mínima do servidor SQL de 10 GB
- Memória máxima do servidor SQL de 21 GB
- apenas 4 DBs no servidor
- seus tamanhos são de apenas 1 a 2 GB cada
- O tamanho do tempdb nunca cresceu para mais de 1 GB (definido como aumento automático para 10 GB)
- Os índices são todos baixos, as estatísticas atualizadas
Versão:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Oct 20 2015 15:36:27 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
Eu verifiquei vários itens:
- Estado da memória DBCC
Estatísticas rápidas:
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB] FROM sys.dm_os_process_memory; GO Output: 20 GB Page Life Expectancy 155932
Nenhum administrador de recursos ativado:
select pool_id, cache_memory_kb, used_memory_kb, out_of_memory_count,used_memgrant_kb from sys.dm_resource_governor_resource_pools Output: pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb --------+-----------------+----------------+---------------------+----------------- 1 | 295368 | 641416 | 0 | 0 select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB, (total_virtual_address_space_kb/1024 )Total_VAS_in_MB, process_physical_memory_low, process_virtual_memory_low from sys. dm_os_process_memory Output: Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low ---------------------------------------------------------------------------------------------------------------------------------------- 20553 | 20393 | 134217727 | 0 | 0
O servidor está no SP3, eu sei que houve um problema de vazamento de memória no SP1, descartando isso.
Alguém notou alguma coisa no resultado do DBCC em que eu deveria me concentrar?
fonte
Respostas:
Como o SQL Server está sendo executado em uma VM, conforme indicado pelo
(hypervisor)
indicador na instrução version, você deve garantir que ele tenha uma reserva de memória no VMWare (ou Hyper-V, etc) no servidor host.A reserva de memória normalmente deve ser 100% da memória alocada às máquinas virtuais da VM para SQL Server usadas em um ambiente de produção. Sem uma reserva de memória, o servidor host pode "roubar" a memória da máquina virtual por meio do uso de um "driver de balão" para uso em alguma outra VM, o que provavelmente é a causa de sua condição de falta de memória.
No VMWare vCenter, para definir a reserva de memória em uma máquina virtual:
Desligue a máquina virtual antes de definir as configurações de memória.
No vSphere Client, clique com o botão direito do mouse em uma máquina virtual do inventário e selecione Editar configurações.
Na janela Propriedades da máquina virtual, selecione a guia Recursos e selecione Memória.
No painel Alocação de Recursos, marque a caixa de seleção Reservar toda a memória do convidado (Tudo bloqueado).
Clique OK.
Se você estiver usando o Microsoft Hyper-V, desative a memória dinâmica da VM, usando este processo no Gerenciador Hyper-V:
fonte
Algumas alterações na configuração que eu faria:
Você pode usar o seguinte script para fazer isso:
fonte