Problemi di memoria insufficiente su SQL Server 2012 SP3


8

Ho avuto periodici errori OOM di SQL Server, una volta al punto che SQL Server si è chiuso da solo e si è sempre verificato durante la notte, quando nessuno lo utilizza e nessun lavoro di SQL Agent in esecuzione in quel momento:

Ecco l'errore tipico:

17/08/2017 19: 31: 17, spid100, Sconosciuto, memoria di sistema insufficiente nel pool di risorse "interna" per eseguire questa query.

17/08/2017 19: 31: 17, spid100, sconosciuto, errore: 701 Gravità: 17 Stato: 123.

17/08/2017 19: 31: 17, spid112, sconosciuto, errore: 18056 Gravità: 20 Stato: 29. (Params :). L'errore viene stampato in modalità concisa perché si è verificato un errore durante la formattazione. Le notifiche ETW di traccia ecc. Vengono ignorate.

Ecco le informazioni sul server:

  • Memoria del server SQL MIN da 10 GB
  • Memoria del server SQL MAX da 21 GB
  • solo 4 DB sul server
  • le loro dimensioni sono solo da 1 a 2 GB ciascuna
  • Le dimensioni del tempdb non sono mai aumentate a più di 1 GB (impostato per crescere automaticamente a 10 GB)
  • Gli indici sono tutti frammentati, statistiche aggiornate
  • Versione:

    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)

Ho controllato più elementi:

  • Memoria DBCC
  • Statistiche rapide:

    SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
    FROM sys.dm_os_process_memory;
    GO
    
    Output:
    20 GB
    Page Life Expectancy                     155932
  • Nessun regolatore di risorse abilitato:

    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

Il server è su SP3, so che c'era un problema di perdita di memoria in SP1, quindi lo escludo.

Qualcuno nota qualcosa nel risultato DBCC su cui dovrei concentrarmi?


1
Ci sono altri servizi / applicazioni ospitati su questo server? L'account del servizio SQL Server fa parte delle pagine bloccate nella politica di sicurezza locale della memoria? I registri eventi di Windows indicano altri problemi nel periodo in cui si è verificato l'arresto anomalo di SQL Server?
John Eisbrener,

-Nessuna altra applicazione ospitata su questo server, è un server SQL dedicato. -L'account del servizio server SQL fa parte del gruppo di amministratori di Windows. - Vedo solo un sacco di errori VSS: Errore del servizio Copia Shadow del volume: Errore imprevisto nella query per l'interfaccia IVssWriterCallback. hr = 0x80070005, Accesso negato. . Ciò è spesso causato da errate impostazioni di sicurezza nel processo del writer o del richiedente. Operazione: raccolta dei dati di Writer Contesto: ID classe Writer: {35e81631-13e1-48db-97fc-d5bc721bb18a} Nome autore: NPS VSS Writer Writer ID istanza autore: {...}
user132852

1
Il server è una macchina virtuale? In tal caso, dispone di risorse di memoria "dedicate" o condivide con altre macchine virtuali? E, se condivide la memoria, la distribuzione delle risorse di memoria è sovraccaricata? Ho visto che ciò accade (indipendentemente dalla versione) sui server VM in cui la memoria è stata allocata eccessivamente.
SQL_Hacker

3
Grazie Shanky. Solo per aggiornare, ho riscontrato il problema venerdì scorso dopo averlo aggiunto al monitoraggio, sembra che una delle sessioni di monitoraggio dell'app nell'applicazione (di terze parti) non sia stata configurata correttamente, la sessione di connessione non si chiude fino a poche ore dopo quando OOM lo uccide.
user132852

1
@ user132852 potresti inserire la soluzione in una risposta e contrassegnarla come risposta.
Thomas Kronawitter,

Risposte:


2

Poiché SQL Server è in esecuzione in una macchina virtuale, come indicato dall'indicatore (hypervisor)nell'istruzione versione, è necessario assicurarsi che abbia una prenotazione di memoria in VMWare (o Hyper-V, ecc.) Sul server host.

La prenotazione della memoria dovrebbe essere in genere il 100% della memoria allocata alla macchina virtuale per macchine virtuali SQL Server utilizzate in un ambiente di produzione. Senza una prenotazione di memoria, il server host può "rubare" la memoria dalla macchina virtuale tramite l'uso di un "driver balloon" per l'utilizzo da parte di un'altra VM, che è probabilmente la causa della condizione di memoria insufficiente.

In VMWare vCenter, per impostare la prenotazione della memoria su una macchina virtuale:

  1. Spegnere la macchina virtuale prima di configurare le impostazioni di memoria.

  2. Nel client vSphere, fare clic con il pulsante destro del mouse su una macchina virtuale dall'inventario e selezionare Modifica impostazioni.

  3. Nella finestra Proprietà macchina virtuale, selezionare la scheda Risorse e selezionare Memoria.

  4. Nel pannello Allocazione risorse, selezionare la casella di controllo Prenota tutta la memoria del guest (Tutti bloccati).

  5. Clicca OK.

Se si utilizza Microsoft Hyper-V, disabilitare la memoria dinamica per la VM, utilizzando questo processo in Hyper-V Manager:

  1. Assicurarsi che la VM sia spenta.
  2. Fare clic con il tasto destro del mouse sulla VM, selezionare "Impostazioni"
  3. Seleziona "Memoria" dal riquadro di sinistra.
  4. Assicurarsi che "Abilita memoria dinamica" non sia selezionato.
  5. Avvia la VM.

1

Un paio di modifiche alla configurazione che vorrei apportare:

  1. Rimuovere le impostazioni minime di memoria, non c'è letteralmente bisogno di questo.
    • Il motivo per cui si desidera modificarlo è perché, se impostato, SQL Server non rilascerà mai la memoria sotto il segno. Se le pagine vengono bloccate in memoria, la memoria non può più essere paginata.
  2. Regola la memoria massima del server al 75% del totale per un totale di <32 gb o all'87,5% per il totale> 32 gb.
    • Supponendo che SQL Server sia l'unica cosa in esecuzione sul computer, lascia che consumi tutta la memoria rimasta dopo aver concesso al sistema operativo memoria sufficiente per funzionare correttamente.

È possibile utilizzare il seguente script per eseguire ciò:

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

3
So che si tratta di best practice piuttosto standard, ma puoi spiegare un po 'come cambiarle ti aiuterà con l'errore che stanno colpendo?
Erik Darling,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.