Memoria di SQL Server

Oct 25 2020

Riguarda la memoria di SQL Server. Quando il server sta esaurendo la memoria, si consiglia di aggiungere ulteriore memoria all'hardware per superare i problemi di utilizzo della CPU.

Ma prima di procedere all'aggiornamento della memoria, come parte della risoluzione dei problemi, come controlliamo / calcoliamo la memoria SQL attualmente consumata nell'istanza.

Per esempio:

NOME SERVER: XXXXXXXXXXXXX

Memoria fisica installata (RAM): 64,0 GB

Memoria SQL Server attualmente allocata: 58982 MB -> 58,982 GB

In questo caso, abbiamo solo un'istanza (MSSQLSERVER) sul server e l'80% di memoria è stata assegnata all'istanza secondo lo standard. E il 20% è assegnato a Application & OS.

Quando controlliamo il monitor delle risorse, verrà visualizzato come riempito all'80% poiché abbiamo impostato la memoria di SQL Server su quello.

Ma ciò non significa che l'80% di SQL sia completamente utilizzato, poiché SQL manterrà un po 'di spazio nel buffer sul backend. Quando ho navigato, ho ottenuto la formula seguente per calcolare la memoria SQL consumata sull'istanza, ma questi parametri sono stati rimossi dallo strumento di monitoraggio delle prestazioni molto tempo fa.

C'è un modo per controllare, attualmente quanto fa l'SQL utilizzato dell'80% (OR) su quali metriche possiamo procedere con l'aggiornamento della memoria.

FORMULA PER IL CALCOLO DELLA MEMORIA SQL: (I parametri seguenti sono stati rimossi da Performance Monitor)

*Database Usage(GB) = (Totalpages-Freepages-Stolenpages)8/1024=MB/1024=GB

Risposte

3 Shanky Oct 26 2020 at 09:51

come controlliamo / calcoliamo la memoria SQL attualmente consumata sull'istanza.

È abbastanza semplice da fare. Hai DMV sys.dm_os_process_memory che ti darà le informazioni. Ti darà physical memory usedetotal memory used (RAM+Page file)

    select (physical_memory_in_use_kb/1024) as Phy_Mem_used_MB, (virtual_address_space_committed_kb/1024) as Total_mem_Used_MB
   from sys.dm_os_process_memory

Ma ciò non significa che l'80% di SQL sia completamente utilizzato, poiché SQL manterrà un po 'di spazio nel buffer sul backend

Una volta che SQL Server raggiunge il valore di memoria massima del server, manterrà tale memoria a meno che la notifica di memoria insufficiente non gli chieda di rilasciare memoria. Quindi sì, potrebbe non usarlo tutto ma lo manterrà comunque. Questo è chiamato caching in quanto aiuta a evitare errori di pagina.

C'è un modo per controllare, attualmente quanto fa l'SQL utilizzato dell'80% (OR) su quali metriche possiamo procedere con l'aggiornamento della memoria.

Come ho detto una volta utilizzato, mostrerà tutta la memoria utilizzata anche quando non ha bisogno di quelle pagine nell'elaborazione delle query. Quando arriva una nuova richiesta, queste pagine verranno spostate per creare spazio per nuove pagine.

2 TiborKaraszi Oct 26 2020 at 12:18

Come si definisce "utilizzato"? Una pagina che è stata letta nella cache un secondo fa, verrebbe conteggiata come utilizzata? Un minuto fa? Un'ora? Una settimana?

Il punto è che non esistono cose come "utilizzate". Il server SQL mantiene le pagine (e altre cose) in memoria. Quando c'è una pressione della memoria (interna o esterna) un meccanismo tradizionale di invecchiamento della cache (fondamentalmente) viene utilizzato per rimuovere le cose che sono usate meno di recente. Ovviamente ci sono molti più dettagli sulla gestione della memoria (cache), ma in linea di principio è gestita come qualsiasi meccanismo di caching.

Quindi, concetti come "utilizzato" o configurazione ottimale semplicemente non esistono. Puoi vedere se ci sono un sacco di memoria che non vengono utilizzate affatto dal server SQL, ovviamente. Ma quando il server SQL ha allocato la memoria, si bloccherà a meno che non vi sia una pressione della memoria. Chissà, forse qualcuno avrà bisogno di quella pagina il secondo dopo?

Ad esempio, puoi ridurre la memoria massima del server e vedere quando le tue prestazioni iniziano a peggiorare.

2 AlekseyVitsko Oct 26 2020 at 16:09

Usa la MemoryManagerInfoprocedura memorizzata, che puoi trovare qui:

https://github.com/aleksey-vitsko/Database-Administrator-Tools

Fornisce una buona ripartizione del modo in cui SQL Server utilizza attualmente la memoria:
vedere l'esempio in questa immagine di seguito: questo è ciò che il mio server sta attualmente consumando:

Approssimativamente, Total Server Memory= Database Cache Memory+ Free Memory+ Stolen Server Memory(La memoria del server rubata include la cache del piano, i blocchi, ecc.)