KB3074434 - CORREÇÃO: erro de falta de memória quando o espaço de endereço virtual do processo de SQL Server é muito baixo na memória disponível

Aplica-se a
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

Depois de aplicar essa atualização, você precisa adicionar o sinalizador de rastreamento -T8075 como um parâmetro de inicialização para habilitar essa alteração.

Sintomas

Ao executar uma consulta em uma versão de 64 bits do Microsoft SQL Server 2012, você recebe uma mensagem de erro de memória insuficiente semelhante à seguinte no log de erros do SQL Server:

Observação

Falha ao alocar páginas: FAIL_PAGE_ALLOCATION 513

As consultas levam muito tempo para concluir a execução e encontram SOS_MEMORY_TOPLEVELBLOCKALLOCATOR esperas.

Ao examinar os pontos de informação a seguir, você descobrirá que há um espaço de endereço virtual disponível muito baixo:

  • DBCC MEMORYSTATUS - Seção de contagens de processo/sistema - Memória virtual disponível
  • DMV: sys.dm_os_process_memory - coluna virtual_address_space_available_kb

Esses valores começam em torno de 8 terabytes (TB) em um processo x64 e continuam a diminuir e chegar a alguns gigabytes (GB). 

Quando você está no estágio em que o espaço de endereço virtual disponível é muito baixo, as consultas que tentam executar a alocação de memória também podem encontrar um tipo de espera de CMEMTHREAD.

Os seguintes pontos de dados continuarão a aumentar ao longo do tempo:

  • DMV: sys.dm_os_process_memory e sys.dm_os_memory_nodes - coluna virtual_address_space_reserved_kb
  • DBCC MEMORYSTATUS - Seção do Gerenciador de Memória - VM Reservada

Esses valores normalmente aumentam em múltiplos do valor de "memória máxima do servidor" até quase 8 TB.

Causa

Quando o processo do SQL Server atinge o estado em que Memória total do servidor = Memória do servidor de destino = memória máxima do servidor, há políticas no gerenciador de memória do SQL Server para permitir que novas alocações solicitem várias páginas de 8 KB para ter êxito temporariamente. O padrão de alocação repetido sob essa condição pode causar fragmentação dos blocos de memória e consumo de espaço de endereço virtual. Se esse processo se repetir muitas vezes, o espaço de endereço virtual do SQL Server será esgotado e você observará os sintomas mencionados anteriormente.

Resolução

Informações sobre a atualização cumulativa

O problema foi corrigido pela primeira vez na atualização cumulativa seguinte do SQL Server.

Recomendação: instalar a atualização cumulativa mais recente para o SQL Server

Cada nova atualização cumulativa do SQL Server contém todos os hotfixes e todas as correções de segurança incluídas na atualização cumulativa anterior. Recomendamos que você baixe e instale as atualizações cumulativas mais recentes para o SQL Server:

Esse hotfix impede a falta de memória e a redução contínua do espaço de endereço virtual disponível que você pode enfrentar.

Status

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".

Mais informações

  • O Windows 2012 R2 permite que o espaço de endereço virtual cresça até 128 TB. Portanto, você pode não notar esse problema em ambientes Windows 2012 R2. Para obter mais informações, consulte o tópico a seguir no Centro de Desenvolvimento do Windows:

    Limites de memória para versões do Windows e do Windows Server

  • Se você observar um crescimento contínuo no espaço de endereço virtual mesmo depois de aplicar a correção, poderá determinar quais consultas ou operações estão solicitando grandes blocos de memória usando o Page_allocated evento estendido. Um script de exemplo tem esta aparência:

    CREATE EVENT SESSION [memory_tracking] ON SERVER
    ADD EVENT sqlos.page_allocated(
        ACTION(package0.callstack,sqlos.cpu_id,sqlos.task_address,sqlos.worker_address,sqlserver.database_id,sqlserver.query_hash,sqlserver.request_id,sqlserver.session_id,sqlserver.sql_text)
        WHERE ([number_pages]>(1)))
    ADD TARGET package0.event_file(SET filename=N'E:\Data\MSSQL11.MSSQLSERVER\MSSQL\Log\memory_tracking.xel')
    WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
    GO
    
    
    

    Normalmente, são backups de log e operações de manutenção de índice, que ocorrem com frequência.