Problemas de falta de memória no SQL Server 2012 SP3

8

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?

user132852
fonte
11
Existem outros serviços / aplicativos hospedados neste servidor? A conta do serviço do SQL Server faz parte da diretiva de segurança local de páginas bloqueadas na memória? Os Logs de Eventos do Windows indicam outros problemas durante o período em que ocorreu o travamento do SQL Server?
precisa saber é o seguinte
-Nenhum aplicativo hospedado neste servidor, é um servidor SQL dedicado. A conta de serviço do servidor SQL faz parte do grupo de administradores do Windows. - Acabei de ver um monte de erros do VSS: Erro do Volume Shadow Copy Service: Erro inesperado ao consultar a interface IVssWriterCallback. hr = 0x80070005, acesso negado. . Isso geralmente é causado por configurações de segurança incorretas no processo do gravador ou solicitante. Operação: Reunindo dados do gravador Contexto: ID da classe do gravador: {35e81631-13e1-48db-97fc-d5bc721bb18a} Nome do gravador: NPS VSS Writer ID da instância do
gravador
11
O servidor é uma VM? Em caso afirmativo, ele possui recursos de memória "dedicados" ou compartilha com outras VMs? E, se compartilhar memória, a distribuição dos recursos de memória será supercomprometida? Eu já vi isso acontecer (independentemente da versão) em servidores VM em que a memória foi superalocada.
SQL_Hacker 17/08/19
3
Obrigado Shanky. Apenas para atualizar, encontrei o problema na última sexta-feira após adicioná-lo ao monitoramento, parece que uma das sessões de monitoramento do aplicativo no aplicativo (de terceiros) não foi configurada corretamente, a sessão de conexão não fecha até horas depois, quando o OOM mata.
user132852
11
@ user132852 você pode colocar sua solução em uma resposta e marcá-la como respondida.
Thomas Kronawitter

Respostas:

2

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:

  1. Desligue a máquina virtual antes de definir as configurações de memória.

  2. No vSphere Client, clique com o botão direito do mouse em uma máquina virtual do inventário e selecione Editar configurações.

  3. Na janela Propriedades da máquina virtual, selecione a guia Recursos e selecione Memória.

  4. No painel Alocação de Recursos, marque a caixa de seleção Reservar toda a memória do convidado (Tudo bloqueado).

  5. 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:

  1. Verifique se a VM está desligada.
  2. Clique com o botão direito do mouse na VM, escolha "Configurações"
  3. Selecione "Memória" no painel esquerdo.
  4. Verifique se "Ativar memória dinâmica" não está marcado.
  5. Inicie a VM.
Max Vernon
fonte
1

Algumas alterações na configuração que eu faria:

  1. Remova as configurações mínimas de memória, literalmente não há necessidade disso.
    • O motivo pelo qual você deseja alterar isso é porque, se estiver definido, o SQL Server nunca liberará a memória abaixo da marca. Se as páginas ficarem bloqueadas na memória, a memória não poderá mais ser paginada.
  2. Ajuste a memória máxima do servidor para 75% do total para o total <32gb ou 87,5% para o total> 32gb.
    • Supondo que o SQL Server seja a única coisa em execução na máquina, consuma a memória restante após conceder ao sistema operacional memória suficiente para operar corretamente.

Você pode usar o seguinte script para fazer isso:

use master;
go

-- MIN Server Memory
exec sys.sp_configure
    'min server memory (MB)'
    ,0;

-- MAX Server Memory
declare
  @systemMemory int
  ,@maxServerMemory int;

select
  @systemMemory = total_physical_memory_kb / 1024
from
  sys.dm_os_sys_memory;

set @maxServerMemory = floor(@systemMemory * .75);

if @systemMemory >= 32768
  begin
    set @maxServerMemory = floor(@systemMemory * .875);
  end;

exec sys.sp_configure
  'max server memory (MB)'
  ,@maxServerMemory;

reconfigure;
go
pimbrouwers
fonte
3
Sei que essas são práticas recomendadas bastante comuns, mas você pode explicar um pouco como alterá-las ajudará no erro que está ocorrendo?
Erik Darling