Come faccio a far sì che SQL Server rilasci la sua memoria?


19

So che a SQL piace la RAM, ma la rilascia quando Windows lo chiede. So che è così che dovrebbe funzionare SQL. Ma ho un amministratore di Windows che non è convinto che SQL restituirà effettivamente la RAM e, su questo particolare server (virtuale), SQL non ha bisogno di molto una volta terminato Analysis Services, ma non c'è nient'altro su questo server che si preoccupa di chiedi molto a SQL.

Quindi sto cercando di rassicurare gli amministratori di Windows che i problemi con l'ambiente virtuale non sono "perché SQL utilizza troppa RAM", ma non riesco a convincere SQL a rilasciarlo senza riavviare il servizio.

Durante l'elaborazione dei cubi, il servizio SQL prende felicemente 8 GB di RAM, ma poiché non ha alcuna pressione su di esso, non rilascia molto di questo durante un giorno normale. I ragazzi di Windows urlano, e sarebbe molto più bello avere SQL rilasciare questo.

Non voglio usare l'impostazione di memoria massima, perché in realtà voglio che SQL usi così tanta RAM durante l'elaborazione. Voglio solo che torni giù di nuovo in seguito.

È potenzialmente un duplicato di entrambi SQL Server che non rilascia memoria e che recupera memoria da SQL Server , ma mi chiedo se ci sia una risposta diversa. Aspettare che Windows riconosca non convincerà i ragazzi di Windows qui. Il riavvio del servizio è un'opzione, ma in realtà non sono un fan di quell'idea.

Voglio sapere come ottenere Windows per chiedere indietro ...


2
Cosa ... un amministratore di sistema si lamenta della RAM utilizzata? Ottengo schifo quando la RAM non viene utilizzata, perché se non viene utilizzata, sprecherà solo ...
Mark Henderson

Non capisco neanche, se la macchina non ha bisogno della memoria - dov'è il problema? Ecco come funzionano normalmente il sistema operativo e le sue applicazioni ... dato che il carico di lavoro con il servizio SQL inattivo mantiene la maggior parte della memoria quando nient'altro ha bisogno potrebbe aumentare i tempi di risposta e / o le prestazioni per il prossimo lavoro SQL?
Oskar Duveborn,

L'amministratore di Windows ritiene che SQL stia stressando la macchina perché il processo ha tanta RAM. So che la scatola non è sotto stress da SQL e posso dimostrarlo riavviando il servizio SQL, dimostrando che sta consumando molta RAM solo quando ottiene i dati per l'elaborazione SSAS. Quindi voglio che SQL rilasci la memoria per mostrare la quantità di RAM che SQL sta usando per il resto della giornata. Non si tratta di indurli a fornire più RAM, ma di farli smettere di incolpare SQL per roba.
Rob Farley,

2
D'accordo con Farseeker, sysadmin dovrebbe essere felice che venga utilizzata la RAM. Se non viene recuperato, il server non ne ha bisogno. Magari chiedi al sysadmin di guardare gli errori di pagina per mostrare che il sistema non è stressato?
Nick Kavadias,

2
Se il tuo amministratore di sistema non capisce cosa rappresentano gli errori di pagina e perché si è consumata memoria ma non si verificano problemi di pagina reali, non so come aiutarti. Non puoi risolvere stupidi. Una cosa che puoi fare, tuttavia, è usare sp_configure per configurare la memoria massima quando non stai usando il sistema e configurarla di backup quando ne hai bisogno. Questo sembra abbastanza sciocco, tuttavia. sp_configureè generalmente qualcosa che dovresti impostare una volta e lasciare da solo.
Pezzi di pancetta l'

Risposte:


12

Credo che la tua unica opzione sia riavviare il servizio SQL o eseguire un'applicazione che consuma molta memoria per forzare SQL a rilasciarlo.

Mi piace il suggerimento di @Nick Kavadias: monitorare il contatore delle prestazioni Memory: Page Faults / Sec per mostrare che SQL non ha messo sotto pressione la memoria del sistema operativo.


2
Grazie Mitch ... Fammi trovare quel file di testo da 10 GB per Blocco note.
Rob Farley,

lol !, in realtà non è una cattiva idea!
Mitch Wheat,

magari usa un file da 2 GB ...
Mitch Wheat,

5

Un modo per mostrare loro che lo farà è che SQL Server mastica tutta la memoria. Quindi copia un file enorme sulla rete (i file di backup SQL di grandi dimensioni funzionano perfettamente per questo). Ciò causerà il riempimento della cache di sistema e Windows inizierà a richiedere indietro la memoria a SQL. SQL inizierà a restituire la memoria al sistema operativo fino a quando non raggiunge l'impostazione di memoria minima.

(Mi dispiace non aver ricevuto l'intera domanda via Twitter, apparentemente erano necessari più di 140 caratteri.)


1
Spero in qualche processo che posso usare che richieda a SQL la memoria (dopo che i buffer sono stati ripuliti e rilasciati), ma senza dover paralizzare la scatola per farlo.
Rob Farley,

Non penso che ci sia un modo per forzare il gestore della memoria di Windows a chiedere indietro la memoria, senza forzare il problema in un altro modo. Probabilmente potresti scrivere qualcosa che colpisce direttamente l'API win32 per farlo, ma per quanto ne so l'unico modo per attivare Windows per richiedere indietro la memoria è di far sì che abbia bisogno di più memoria per un altro processo. Controlla con Bob o Paul, potrebbero avere maggiori informazioni.
mrdenny,

3
Il driver del fumetto di VMware fa esattamente questo: richiede a Windows sempre più memoria per consentire a SQL Server (o qualsiasi altra applicazione) di rinunciare alla memoria.
Brent Ozar,

Sì, speravo che non avrei dovuto fare qualcosa del genere.
Rob Farley,

@BrentOzar, il driver ballon di VMware recupera solo la memoria dalla cache di sistema , non la memoria di processo effettiva; è concepito come un modo per dire al sistema operativo "non usare tutta la memoria disponibile per cose banali", non per distruggerla.
Massimo

2

Citi i "cubi", quindi non è chiaro se stai parlando del motore AS o del motore relazionale. Il motore relazionale può liberare memoria su richiesta:

DBCC FREESYSTEMCACHE('<cache name>');

Dove 'cache name' è preso da sys.dm_os_memory_clerks . Le specifiche di DBCC FREESYSTEMCACHE menzionano solo i pool di governatori, ma in realtà è possibile eliminare molte più cache.

Ma se tutta la memoria viene utilizzata dal pool di buffer, l'eliminazione dell'intero pool di buffer comporterà un enorme degrado delle prestazioni e un enorme carico di I / O. È meglio che SQL lo gestisca da solo.


1
Ciao Remus, la cache del buffer relazionale è grande dopo l'elaborazione di un cubo. Dopodiché, voglio davvero che le cache vengano pulite, eliminate e la memoria venga restituita a Windows. DBCC DROPCLEANBUFFERS e FREESYSTEMCACHE svuotano la cache ma non restituiscono la memoria a Windows, quindi non è completamente quello che voglio.
Rob Farley,

2
In teoria si potrebbe pressione di memoria falsa (ad es. Si potrebbe trampolino QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ), ma mi sarebbe davvero davvero davvero non andare lì. Se SQL non rilascia memoria impegnata è perché il sistema operativo non ne ha bisogno. Il sistema operativo non ha bisogno della memoria perché SQL è l'unica applicazione sull'host ( stackoverflow.com/questions/1401834/… ), giusto? Se esegui qualche altra applicazione lungo SQL, ce l'hai fatta.
Remus Rusanu,

2

Con entrambi i motori AS e DS puoi mettere un limite nella memoria in modo che rimangano al di sotto di una soglia di sicurezza; questo è consigliato su 64 macchine bit con molta RAM e / o più istanze di SQL. Almeno per il motore di database se si modifica il limite di memoria al di sotto di quello attualmente in uso ridurrà la quantità di memoria al volo senza dover riavviare il servizio, ma non si è sicuri di SSAS.


Avere il tappo è ok, ma penso che vorrò abbassare la memoria massima dopo l'elaborazione e quindi rimuoverlo, quando preferirei pulire i buffer, rilasciarli e chiedere a Windows un po 'di pressione sulla memoria.
Rob Farley,

1

Il più semplice che ho trovato è andare alle proprietà di memoria del server, inserire un valore più piccolo, applicare, attendere qualche minuto e regolare il backup della configurazione.

Abbiamo anche scoperto che l'utilizzo limitato della memoria dei server sql può effettivamente migliorare le prestazioni del server in quanto fornisce a Windows più RAM per la memorizzazione nella cache, ecc.

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.