Configurazione della memoria massima e minima di SQL Server


8

Quali sono le impostazioni corrette per memoria minima e memoria massima in questo caso d'uso?

Il server ha 8 GB di RAM, due processori Intel Xeon, con Windows Server 2008 R2 / SQL Server 2008 Standard Edition. Esegue diversi database che vanno da 30 GB a 5 GB di dimensione.

Inizialmente l'utilizzo della memoria era impostato sulle impostazioni predefinite (min = 0 max = 2.147.483.647). Con queste impostazioni la maggior parte dell'utilizzo della memoria è stata occupata da sqlservr.exe e il server avrebbe dovuto essere riavviato ogni giorno o due. Inizialmente funzionerebbe normalmente, ma entro un giorno inizia il timeout su operazioni semplici come la ricerca di un record utilizzando la chiave primaria.

Ho cambiato min = 4.096 e max = 6.144. Ciò comporta solo un utilizzo della memoria di 1,4 GB. Tuttavia, ora tutti e quattro i CPU sono costantemente in esecuzione al 50-60% di CPU. L'esecuzione delle attività richiede circa 1/3 del tempo, sebbene il server sia molto più stabile.


Acquista più RAM e lascia il massimo al valore predefinito.
Remus Rusanu,

4
@RemusRusanu Presumo che volevi dire min al valore predefinito!
Kin Shah,

Abbiamo casi d'uso molto simili e problemi simili (il sistema operativo non ha mem a causa di SQL che lo afferra tutto) quando le persone dimenticano le pratiche. La nostra pratica consiste nell'utilizzare 0 come minimo e mezzo disponibile come max.
Paul,

@kin no, intendo max . Dovrei dire lasciare sia min che max ai valori predefiniti, ma non ho mai capito perché qualcuno dovrebbe mai cambiare il min in ogni caso ...
Remus Rusanu,

1
@RemusRusanu Supponevo che fosse un errore di battitura, poiché con la quantità di conoscenza interna hai + le tue risposte eccellenti. Non sarei però d'accordo con lasciare la memoria massima come predefinita.
Kin Shah,

Risposte:


10

Osservando la tua disponibilità di RAM per questo particolare server e stai eseguendo diversi database che vanno da 30 GB a 5 GB , hai sicuramente bisogno di più RAM su questo server.

Non hai menzionato che si tratta di un'istanza autonoma o che questo server ha più di un'istanza di SQL Server in esecuzione.

Le tue impostazioni di memoria MAX sembrano OK per un server con 8 GB di RAM. Vedi queste impostazioni consigliate per le migliori pratiche da Glenn Berry .

Consiglio vivamente di fare una linea di base del proprio ambiente utilizzando i contatori PERFMON di seguito per ottenere un buon valore della configurazione della memoria:

  • SQL Server: Buffer Manager \ Aspettativa di vita della pagina
  • SQL Server: Buffer Manager \ Pagine lette / sec
  • Disco fisico \ Lettura disco / sec
  • Memoria \ Mbyte disponibili
  • SQL Server: Memory Manager - Memoria totale del server
  • SQL Server: Memory Manager - Memoria del server di destinazione

Memoria totale del server: quantità di memoria attualmente allocata al pool di buffer e non la quantità totale di memoria a SQL Server

Memoria del server di destinazione: dimensione ideale del pool di buffer corrispondente alla memoria massima per l'istanza.

Nota: se la memoria del server totale> memoria del server di destinazione, suggerisce una pressione della memoria.

Lo script seguente ti aiuterà a trovare le notifiche di memoria BASSA o ALTA da sys.dm_os_ring_buffers- sessione di integrità del sistema:

SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] - tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [Notification_type],
cast(record as xml).value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilization %],
cast(record as xml).value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [Node Id],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') AS [Process_Indicator],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') AS [System_Indicator],
cast(record as xml).value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQL_ReservedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQL_CommittedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/AWEMemory)[1]', 'bigint') AS [SQL_AWEMemory],
cast(record as xml).value('(//Record/MemoryNode/SinglePagesMemory)[1]', 'bigint') AS [SinglePagesMemory],
cast(record as xml).value('(//Record/MemoryNode/MultiplePagesMemory)[1]', 'bigint') AS [MultiplePagesMemory],
cast(record as xml).value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/@id)[1]', 'bigint') AS [Record Id],
cast(record as xml).value('(//Record/@type)[1]', 'varchar(30)') AS [Type],
cast(record as xml).value('(//Record/@time)[1]', 'bigint') AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR' 
--and cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') = 'RESOURCE_MEMPHYSICAL_LOW'
ORDER BY rbf.timestamp ASC

Alcuni buoni riferimenti:


2
Hai il confronto totale e target nel modo sbagliato, ma in ogni caso ci sono modi migliori per determinare se il server è sotto pressione della memoria esterna.
Paul White 9

@paulwhite puoi chiarire un po 'di più in modo da poter migliorare la mia risposta? Grazie per averci esaminato.
Kin Shah,

È un'istanza autonoma
sa555,
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.