Recupero della memoria da SQL Server


10

Ho un'istanza di SQL Server il cui utilizzo della memoria aumenta gradualmente fino a quando Windows non lo darà più. Sembra logico che il risultato occasionale di una query di grandi dimensioni causi la crescita dell'istanza.

Esiste un modo per convincere SQL Server a rilasciare la memoria di cui non ha più bisogno (oltre al riavvio del servizio)?

Modifica:
sto usando SQL Server 2000 SQL Server 8.00.2039 - SP4 (Standard Edition)

Sono stato in grado di scoprirlo utilizzando la seguente query:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'

Risposte:


19

Questo è esattamente come dovrebbe funzionare SQL Server .

Se si dispone di altri servizi su quella macchina e non si desidera che SQL consumi tutta la memoria disponibile, sarà necessario impostare la memoria massima del server. Vedere Opzioni di memoria di SQL Server su MSDN.


1
Sembra più un bug che una funzione ... mi sta succedendo. SQL Server occupa il 95% della RAM disponibile per fare qualcosa e non riesce a rilasciarlo al termine.
Alchemico,

1
@Alchemical Dipende da cosa intendi per " completo ". SQL Server può utilizzare tutta la RAM di un computer; usandolo come cache del disco. Non " completa " utilizzandolo come cache del disco fino a quando non si è finito di utilizzare SQL Server.
Ian Boyd l'

8

Gli altri poster hanno ragione che questo è di progettazione, ma vuoi assolutamente limitare la memoria massima a un po 'meno della RAM del tuo server. Pensa a questa sequenza di eventi:

  • SQL 2000 funziona correttamente, consumando tutta la RAM del server
  • Qualcuno si occupa di RDP o devi scaricare IE per scaricare una patch o avviare i tuoi backup, qualunque cosa
  • SQL deve deallocare e liberare memoria sufficiente per far funzionare il sistema operativo
  • Le prestazioni fanno schifo mentre liberano memoria e il paging su disco
  • Le cose vanno abbastanza bene una volta che sono stabili
  • L'altra operazione viene completata e SQL recupera gradualmente la RAM liberata
  • Ripetere

Per evitare ciò, configurare il limite massimo di memoria del server su circa l'80-90% della memoria fisica effettiva. Istruzioni per SQL 2000 all'indirizzo: http://msdn.microsoft.com/en-us/library/ms178067.aspx


Ricordare che questo comportamento è 2005 e 2008 - 2000 non rilascia memoria su richiesta al sistema operativo.
Paul Randal,

2
Non esattamente su richiesta, ma rilascia nuovamente memoria sul sistema operativo. Dal link che ho pubblicato: "Quando SQL Server utilizza la memoria in modo dinamico, interroga periodicamente il sistema per determinare la quantità di memoria fisica libera. In Microsoft Windows 2000, SQL Server aumenta o riduce la cache del buffer per mantenere la memoria fisica libera tra 4 MB e 10 MB in base all'attività del server. Il mantenimento di questa memoria libera impedisce il paging di Windows 2000. Se la memoria disponibile è inferiore, SQL Server rilascia memoria su Windows 2000. Se la memoria è maggiore, SQL Server alloca la memoria nel pool buffer. "
sh-beta,

Ah - vero - fa il trucco di disimpegnare un po 'di memoria fisica - hai ragione!
Paul Randal,

4

Lo rilascerà solo se il sistema operativo segnala che è RAM affamata o se si interrompe e si riavvia il servizio; la cosa da fare è limitare la quantità massima che SQL userà configurando il valore di "memoria massima del server". Se non c'è nient'altro sul server che ha bisogno della RAM (e speriamo non ci sia) non me ne preoccuperei.


4

Quindi, per riassumere le risposte:

Non è possibile richiedere a MS SQL Server di rilasciare la memoria non immediatamente necessaria. SQL Server dovrebbe rilasciare automaticamente la memoria quando richiesto, ma non prima di allora. E se si verificano problemi di memoria, è necessario ridurre il valore dell'opzione di memoria "memoria massima server".


3

SQL Server consumerà memoria e non la restituirà a meno che non venga comunicato dal sistema operativo che esiste una pressione della memoria. Come ha indicato Portman, questo è in base alla progettazione e, se si desidera limitare il consumo di memoria, è necessario impostare la memoria massima del server che verrà utilizzata da SQL Server.


2

Ricorda che il comportamento che stai descrivendo è da SQL Server 2005 in poi, quando il gestore della memoria è stato riscritto (tra le altre cose) per rispondere alle richieste di pressione della memoria dal sistema operativo.

Per SQL Server 2000 e precedenti, una volta che acquisisce memoria non lo restituirà, non importa quanto il sistema operativo lo richieda.

CodeSlave: stai utilizzando 2000, 2005 o 2008?


Ah ah ... sì davvero SQL 2000.
BIBD

3
Non lo restituisce quando il sistema operativo lo richiede, ma lo restituisce se rileva che il sistema operativo è al di sotto di una determinata soglia per la memoria fisica libera. Vedi msdn.microsoft.com/en-us/library/ms178067.aspx
sh-beta

E per rafforzare ciò che ha detto sh-beta, SQL Server 2000 rilascia memoria solo quando nota che il sistema operativo ha poca memoria fisica perché non è stato fino a Windows XP (2001) che Windows ha aggiunto un'API per consentire " al sistema operativo di gridare per esso "( msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx ). SQL Server 2005 sfrutta questa nuova funzionalità di Windows. Ma quando è stato scritto SQL Server 2000 non c'era modo per il sistema operativo di gridare, costringendo SQL Server a controllare periodicamente la pressione della memoria.
Ian Boyd l'

0

Vecchia domanda, lo so, ma un modo per forzare (più nuovo, almeno) l'SQL a liberare memoria è scrivere un'applicazione che alloca più memoria possibile nei blocchi, aspettando (diciamo) 15 secondi (es. Sleep (15000)) e liberare la memoria allocata ed uscire; Ho provato questo e SQL rilascia la memoria in modo che il sistema ritorni la sua RAM; scrivere codice come sopra è quasi banale usando C / C ++, solo una questione di impostazione di una catena di stuct per contenere la catena di blocchi di memoria (puntatore e dimensione), ridurre progressivamente la dimensione quando un "malloc ()" fallisce fino a quando non raggiunge un minimo (diciamo meno di 1024) e poi attraversare l'elenco collegato per liberare i blocchi allocati

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.