"Ghost Memory" di SQL Server 2008 R2?


12

Abbiamo una macchina SQL Server 2008 R2 dedicata che presenta alcuni strani problemi di memoria. La macchina stessa ha molte risorse tra cui due processori quad-core, 16 gb di RAM e Windows Server 2008 R2 Enterprise a 64 bit (è un Dell PowerEdge 2950) .

Lo strano problema è che il sistema sta segnalando l'82% della memoria in uso ma sqlservr.exe sta segnalando solo 155 MB in uso. Il motivo per cui sospetto che SQL Server sia il problema è perché se riavvio il processo sqlservr.exe il consumo di memoria ritorna normale per un periodo di tempo.

Qualcuno ha qualche idea su come posso iniziare a rintracciare questo problema?

Grazie Jason


3
Stai usando l'utente Lock Pages in Memory giusto? In tal caso, la memoria bloccata non verrà segnalata dal task manager. Vedi blogs.technet.com/b/askperf/archive/2008/03/25/… per maggiori informazioni.
Mark S. Rasmussen,

L'utente Lock Pages in Memory è impostato su "Nessuno". Abbiamo anche l'impostazione "Memoria massima del server (in MB)" sul valore predefinito int.MaxValue - pensi che potrebbe causare un problema?
typefragger,

4
L'unica volta che mi preoccuperei è quando il mio server sql sta usando MENO dell'82%!
SqlACID,

Risposte:


15

Non otterrai una vera immagine dell'utilizzo della memoria da Task Manager se l'account con cui è in esecuzione il servizio ha le pagine di blocco nel privilegio di memoria (modifica: come da commento / collegamento di Mark Rasmussen). Per determinare la quantità di memoria utilizzata è possibile consultare:

  • SQLServer: contatore perfmon Memory Manager \ Total Server Memory
  • DMV

Non riesco a ricordare se esiste un DMV o una combinazione di questo ti darà l'allocazione di memoria totale ma quanto segue mostrerà la maggior parte di esso.

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

Il secondo è di solito il più interessante, allocazioni di pool di buffer per database. Qui è dove verrà utilizzata la condivisione dei leoni e può essere utile capire quali database sono i maggiori consumatori.


Wow, grazie mille! Questo (in particolare il secondo) mi ha reso completamente chiaro!
typefragger,

8

C'è un recente articolo del nostro Brent Ozar che tratta questo caso, quando Task Manager non mostra correttamente la memoria consumata da SQL Server e dai suoi servizi aggiuntivi. Puoi trovarlo qui: una guida di Sysadmin alla memoria di Microsoft SQL Server .

Citazione: " Perché SQLServer.exe non utilizza molta memoria?

Quando si esegue il desktop remoto in un server e si visualizza Task Manager, l'utilizzo Mem di sqlservr.exe sembra sempre stravagante. Non è colpa di SQL Server. Task Manager è un bugiardo sporco e sporco. (Lo so, sembra che il tipo SQL stia spostando la colpa, ma abbi pazienza con me per un secondo.) Sui box a 64 bit, questo numero è un po 'più preciso, ma sui box a 32 bit è completamente fuori base . Per avere un quadro preciso della quantità di memoria utilizzata da SQL Server, è necessario uno strumento come Process Explorer e identificare tutti i processi di SQL Server. Nel server che sto mostrando a destra, ci sono due istanze di SQL Server (mostrate da sqlservr.exe), oltre agli strumenti di backup di SQL Agent, SQL Browser e SQL Server. Non è insolito vedere anche SQL Server Analysis Services, Integration Services e Reporting Services in esecuzione sullo stesso server, che consumano tutti memoria.

Quindi quanta memoria utilizza SQL? Lo renderò facile per te. SQL Server utilizza tutta la memoria. Periodo."

Quindi ti consiglio di provare la query di Mark e di utilizzare uno strumento migliore per il rapporto sulla memoria. O semplicemente affidati a Perfmon per segnalare la memoria, non Task Manager.


-2

La quantità di memoria utilizzata da SQL, come mostrato nel task manager, sarà principalmente l'impostazione di memoria massima. Ecco come funziona l'impostazione min / max:

All'avvio di SQL Server, inizia a portare la memoria all'impostazione di memoria minima. All'aumentare della necessità di SQL, SQL inizierà a utilizzare più memoria fino all'impostazione di memoria massima. La memoria rimane quindi in questo punto (massimo) anche quando l'utilizzo di SQL diminuisce. Questo dà l'impressione che SQL esegua compiti enormi e che consuma molta memoria. In realtà, questa memoria è riservata da SQL.

In caso di pressione della memoria non SQL sul server, SQL rilascerà la memoria fino al punto di impostazione della memoria minima. Ecco come vengono utilizzate le impostazioni di memoria. Puoi usare gli script di Mark per vedere come SQL sta usando questa memoria.


1
Min / max regola le allocazioni del pool di buffer, niente di più. Questa è la prima riga nella descrizione delle opzioni di memoria del server in BOL. Le impostazioni non hanno assolutamente alcuna relazione con quella visualizzata in Task Manager. La descrizione di Brent di taskmgr come "una sporca e sporca bugiarda" riassume la situazione così come quella che ho letto.
Mark Storey-Smith,

@ MarkStorey-Smith per favore leggi il contenuto più in basso nel link nel tuo commento, spiega solo il mio punto. Il task manager mostra l'utilizzo delle risorse di sistema. Il pool di buffer non è una risorsa di sistema. Sto spiegando cosa significa l'utilizzo della memoria da parte di SQL mostrato nel task manager. Stai affermando l'ovvio citando il pool di buffer, ma ciò non mi dimostra ancora di sbagliarmi.
StanleyJohns,

Non sono sicuro di come mettere meglio questo ... "La quantità di memoria utilizzata da SQL, come mostrato nel task manager, sarà principalmente l'impostazione di memoria massima. Ecco come funzionano le impostazioni min / max" .. no, non lo è 't.
Mark Storey-Smith,

'Ecco come funzionano le impostazioni min / max:' C'è un punto alla fine che significa che la spiegazione segue, non che afferma la frase precedente. :)
StanleyJohns,

1
Sono con Mark. Leggi il blog di Slava Oks : faceva parte del team MS che ha scritto il gestore della memoria. Vai all'intestazione "pool di buffer". Cito "Ricorda che SQL Server ha due impostazioni di memoria che puoi controllare usando sp_conifigure. Sono memoria massima e minima del server. Non sono sicuro che tu lo sappia, ma queste due impostazioni controllano davvero la dimensione del pool di buffer. Non controllano complessivamente quantità di memoria fisica consumata da SQL Server "
gbn
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.