Ottimizza il consumo elevato di memoria nelle istanze

Questo documento spiega come esaminare e ottimizzare un'istanza Cloud SQL per SQL Server se viene identificata dal motore per suggerimenti di istanze con provisioning insufficiente di memoria elevata.

Memoria SQL Server

La memoria SQL Server può essere suddivisa come segue:

Cache

Si tratta di oggetti su un disco che può essere ricaricato, ad esempio pagine di database e stored procedure. Di conseguenza, SQL Server può aumentare e ridurre questi oggetti in base all'utilizzo della memoria. Le cache includono pool di buffer e cache dei piani.

Memoria corretta

La memoria fissa può crescere e ridursi. Si riduce solo quando non è in uso, ad esempio quando cala il numero di connessioni o il numero di query in esecuzione. È diverso dalle cache. Se la memoria fissa non è sufficiente, SQL Server può esaurire la memoria. La memoria corretta include la memoria della connessione e le concessioni di memoria.

Overhead per SQL Server

L'overhead di SQL Server include thread e stack.

OLTP in memoria

OLTP in memoria include tabelle e gruppi di file in memoria.

Il consumo di memoria da parte di SQL Server è controllato impostando maximum server memory e memory.memory.limitmb. Il parametro memory.memory.limitmb viene impostato automaticamente da Cloud SQL.

Per saperne di più su memory.memory.limitmb, consulta la documentazione di Microsoft.

Devi impostare il limite di max server memory su un valore adeguato. In SQL Server, se max server memory non è impostato, le pagine del database possono consumare la maggior parte della memoria vicino al 100% e fino al 100%. Questo a volte può essere fuorviante.

Opzioni di ottimizzazione della memoria

Per determinare se un'istanza richiede una maggiore ottimizzazione della memoria:

  • Imposta il valore di max server memory. Il consiglio generale è di impostare max server memory su circa l'80% per impedire a SQL Server di consumare tutta la memoria disponibile. Per le istanze che hanno grandi quantità di memoria, l'80% potrebbe essere troppo basso e portare a uno spreco di memoria.

  • Monitora Page life expectancy

    Page life expectancy indica la quantità di tempo, in secondi, per cui la pagina meno recente rimane nel pool di buffer. Questo valore deve essere superiore a 300, come consigliato da Microsoft. Se scende costantemente al di sotto di 300, potrebbe indicare che l'istanza sta affrontando un utilizzo elevato della memoria. Esegui la seguente query per monitorare Page life expectancy.

    SELECT
      [object_name],
      [counter_name],
      [cntr_value]
    FROM
      sys.dm_os_performance_counters
    WHERE
      [object_name]
    LIKE
      '%Manager%'
    AND
      [counter_name] = 'Page life expectancy'
    
  • Controlla Memory Grants Pending

    Memory Grants Pending specifica il numero totale di processi in attesa di concessione di memoria dell'area di lavoro. Esegui la query seguente per verificare Memory Grants Pending. Se questa query mostra costantemente concessioni in attesa, significa un elevato utilizzo della memoria. Puoi ridurlo eseguendo query sulle attese del database e ottimizzando qualsiasi istruzione in attesa di memoria.

    SELECT
      @@SERVERNAME AS [Server Name],
      RTRIM([object_name]) AS [Object Name],
      cntr_value AS [Memory Grants Pending]
    FROM
      sys.dm_os_performance_counters WITH(NOLOCK)
    WHERE
      [object_name]
    LIKE
      N'%Memory Manager%'  -- Handles named instances
    AND
      counter_name = N'Memory Grants Pending'