Configuración de memoria máxima y mínima de SQL Server

8

¿Cuáles son las configuraciones correctas para min-memory y max-memory en este caso de uso?

El servidor tiene 8 GB de RAM, procesadores duales Intel Xeon, que ejecutan Windows Server 2008 R2 / Sql Server 2008 Standard Edition. Está ejecutando varias bases de datos que van desde 30 GB a 5 GB de tamaño.

Originalmente, el uso de la memoria se estableció en la configuración predeterminada (min = 0 max = 2,147,483,647). En estas configuraciones, sqlservr.exe asumió la mayor parte del uso de la memoria y el servidor eventualmente necesitaría reiniciarse cada día o dos. Funcionaría normalmente al principio, pero dentro de un día comenzaría a agotar el tiempo en operaciones simples como buscar un registro usando la clave primaria.

He cambiado min = 4.096 y max = 6.144. Esto da como resultado solo un uso de memoria de 1.4GB. Sin embargo, ahora los cuatro cpus se ejecutan al 50-60% de uso de la CPU constantemente. Las tareas están tardando aproximadamente 1/3 más en ejecutarse, aunque el servidor es mucho más estable.

sa555
fuente
Compre más RAM y deje el valor máximo predeterminado.
Remus Rusanu
44
@RemusRusanu ¡Supongo que te refieres a min por defecto!
Kin Shah
Tenemos casos de uso muy similares y problemas similares (el sistema operativo no tiene memoria debido a que SQL lo agarró todo) cuando la gente olvida las prácticas. Nuestra práctica es usar 0 como mínimo y la mitad disponible como máximo.
Paul
@kin no, quiero decir max . Debería decir que deje min y max en los valores predeterminados, pero nunca entendí por qué alguien cambiaría el min de todos modos ...
Remus Rusanu
1
@RemusRusanu Supuse que era un error tipográfico, ya que con la cantidad de conocimiento interno que tienes + tus excelentes respuestas. Aunque no estoy de acuerdo con dejar la memoria Max como predeterminada.
Kin Shah

Respuestas:

10

Mirando la disponibilidad de RAM para este servidor en particular y está ejecutando varias bases de datos que van desde 30 GB a 5 GB , definitivamente necesita más RAM en este servidor.

No ha mencionado que esta es una instancia independiente o que este servidor está ejecutando más de una instancia de servidor SQL.

La configuración de la memoria MAX parece correcta para un servidor que tiene 8 GB de RAM. Vea estos ajustes sugeridos de mejores prácticas de Glenn Berry .

Recomiendo encarecidamente que haga una línea base de su entorno utilizando los contadores PERFMON a continuación para obtener un buen valor de la configuración de su memoria:

  • SQL Server: Administrador de búfer \ Esperanza de vida de página
  • SQL Server: Administrador de búfer \ Lecturas de página / seg.
  • Disco físico \ Lecturas de disco / seg.
  • Memoria \ Mbytes disponibles
  • SQL Server: Administrador de memoria - Memoria total del servidor
  • SQL Server: Administrador de memoria - Memoria del servidor de destino

Memoria total del servidor: cantidad de memoria asignada actualmente a la agrupación de almacenamiento intermedio y no la cantidad total de memoria a SQL Server

Memoria del servidor de destino: tamaño ideal del grupo de búferes correspondiente a la memoria máxima para la instancia.

Nota: Si la memoria total del servidor> la memoria del servidor de destino, sugiere presión de memoria.

El siguiente script lo ayudará a encontrar notificaciones de memoria BAJA o ALTA de sys.dm_os_ring_buffersla sesión de estado 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

Algunas buenas referencias:

Kin Shah
fuente
2
Tiene la comparación total y objetivo al revés, pero en cualquier caso hay mejores formas de determinar si el servidor está bajo presión de memoria externa.
Paul White 9
@paulwhite, ¿puedes aclarar un poco más para que pueda mejorar mi respuesta? Gracias por investigar.
Kin Shah
Es una instancia independiente
sa555