La memoria del server rubato del motore DB è troppo alta


8

Ricevo un errore da System Center Operations Manager (SCOM).

Come risolvere questo errore?

La memoria del server rubato al motore SQL DB 2012 è troppo alta.

Eseguo query e ottengo questi contatori:

╔═══════════════════════════════╦═════════════╗
║ Stolen Server Memory (MB)     ║ 7354.773437 ║
║ Lock Memory (MB)              ║ 106.195312  ║
║ Free Memory (MB)              ║ 64.632812   ║
║ Connection Memory (MB)        ║ 24.203125   ║
║ Log Pool Memory (MB)          ║ 14.085937   ║
║ Optimizer Memory (MB)         ║ 2.351562    ║
║ Granted Workspace Memory (MB) ║ 1.296875    ║
║ Cursor memory usage           ║ 0.000000    ║
║ Cursor memory usage           ║ 0.000000    ║
║ Cursor memory usage           ║ 0.000000    ║
╚═══════════════════════════════╩═════════════╝

Risposte:


10

Quante volte vedi tali messaggi? Se è una o due volte, può essere ignorato.

La "memoria rubata" come descritto in questo vecchio articolo di supporto e come utilizzare DBCC MEMORYSTATUS è:

La memoria rubata descrive i buffer in uso per l'ordinamento o per le operazioni di hash (memoria dell'area di lavoro della query) o per quei buffer che vengono utilizzati come archivio di memoria generico per allocazioni per archiviare strutture di dati interne come blocchi, contesto di transazione e informazioni di connessione . Il processo lazywriter non è autorizzato a svuotare i buffer rubati dal pool di buffer.

La memoria viene solitamente prelevata dal pool di buffer. Se si esegue DBCC MEMORYSTATUSe l'output mostra pagine rubate elevate , ciò significa che alcuni processi stanno rubando memoria dal pool di buffer più di quanto sia necessario e è necessario trovare tale processo.

È molto probabile che ci sia stata un'operazione in esecuzione che ha eseguito un'operazione di ordinamento enorme e allo stesso tempo SQL Server stava consumando molto memoria, portando quindi a questo messaggio. A meno che tu non stia affrontando un problema con OOM, questo messaggio sarebbe più considerato come un avvertimento .


-1

L'abbiamo visto dalla ricerca di Google perché stiamo affrontando un problema simile (la memoria rubata è circa il 50% della memoria totale) ma non possiamo

A proposito, ho trovato sotto il codice

select type, name, sum((pages_kb*1024)/8192) as stolen_pages
from sys.dm_os_memory_clerks
where pages_kb > 0
group by type, name
order by stolen_pages desc;

type    name    stolen_pages
MEMORYCLERK_SQLBUFFERPOOL   Default 1710360

L'ho modificato di più per mostrare% di rubato come memoria totale

SELECT Now = GETDATE()
    ,StolenMemory = (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Stolen Server Memory (KB)')
        )
    ,StolenMemoryPercent = 100.0 * (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Stolen Server Memory (KB)')
        ) / (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Total Server Memory (KB)')
        )
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.