SQL Server no usa toda la memoria

10

Tengo SQL Server 2014 con memoria máxima establecida en 6 GB (la memoria física es de 8 GB).

La memoria del servidor de destino es a veces de 6 GB y luego vuelve a la memoria total del servidor (aproximadamente 5,3 GB, nunca alcanza los 6 GB). Solía committed_kb en sys.dm_os_sys_info para comprobar la memoria utilizada por SQL Server.

Cuando monitorizo sys.dm_os_buffer_descriptors , veo que las páginas se caen del caché, pero todavía quedan 700 MB de memoria. Si nada necesitara la memoria, ¿cómo explicaría el hecho de que las páginas se eliminan del caché? Esperaría que SQL Server solo elimine páginas cuando necesita memoria.

Las tablas temporales desasignadas no son un problema en este servidor. Mi PLE es 3632. El caché de procedimientos es 2182 MB.

Esperaría que las páginas solo se eliminen cuando no quede memoria, pero tengo 700 MB libres o no entiendo esto.

¿Puede alguien intentar explicar este comportamiento?

SQL Server también está leyendo desde el disco, por lo que creo que puedo concluir que no todas las páginas necesarias están en la memoria.

Investigué un poco más y leí una gran cantidad de páginas del disco a la memoria y noté algo en el administrador de tareas durante las lecturas:

  • La memoria en uso fue de 7.0GB -> 7.2GB -> 7.0GB -> 7.2GB -> ...
  • Sqlservr.exe pasó de 5.3GB -> 5.5GB -> 5.3GB -> 5.5GB -> ...

Es como si Windows no permitiera que sqlservr.exe creciera a 6GB.

Ejecuté la consulta proporcionada por Shanky:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

Esto dio el siguiente resultado:

Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0

Lo que no entiendo es por qué Total_Memory_in_MB no es igual a 6144 (memoria máxima)?

En sys.dm_os_ring_buffers encontré RESOURCE_MEMPHYSICAL_LOW, así que creo que Windows se estaba quedando sin memoria y SQL Server debe devolver algunos. Pero hay aproximadamente 1 GB de memoria disponible => ¿por qué Windows dice que se está quedando sin memoria?

<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">   
   <ResourceMonitor>
        <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
        <IndicatorsProcess>0</IndicatorsProcess>
        <IndicatorsSystem>2</IndicatorsSystem>
        <NodeId>0</NodeId>
        <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
        <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
        <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>   
   </ResourceMonitor>   
   <MemoryNode id="0">
        <TargetMemory>6050080</TargetMemory>
        <ReservedMemory>67208656</ReservedMemory>
        <CommittedMemory>5423548</CommittedMemory>
        <SharedMemory>0</SharedMemory>
        <AWEMemory>0</AWEMemory>
        <PagesMemory>4975656</PagesMemory>   
   </MemoryNode>   
   <MemoryRecord>
        <MemoryUtilization>100</MemoryUtilization>
        <TotalPhysicalMemory>8387608</TotalPhysicalMemory>
        <AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
        <TotalPageFile>11142348</TotalPageFile>
        <AvailablePageFile>2887916</AvailablePageFile>
        <TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
        <AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
        <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
   </MemoryRecord> 
</Record>

Actualización
Después de investigar un poco más por qué siempre había 1 GB de memoria disponible, creo que encontré algo.
¿Es posible que SQL Server solo pueda asignar memoria libre y que la memoria disponible se ignore? Al ejecutar Process Explorer (Sysinternals) vi que la memoria libre era 0.

Frederik Vanderhaegen
fuente

Respuestas:

3

Para empezar, debo decir que ha configurado la memoria máxima del servidor en 6 GB y la memoria total es de 8 GB, por lo que acaba de dejar 2 GB para el sistema operativo, que en muchos casos, incluso si no hay nada instalado aparte de SQL Server en una máquina con Windows , se proporciona muy poca memoria al sistema operativo. Para funcionar correctamente, en un sistema con antivirus instalado, el sistema operativo debe tener al menos 4 GB. Dejo 2GB para SO de inmediato y 1.5 G para AV.

La memoria del servidor de destino es a veces de 6 GB y luego vuelve a la memoria total del servidor (aproximadamente 5,3 GB, nunca alcanza los 6 GB).

La memoria del servidor de destino significa cuánta memoria requiere SQL Server para funcionar correctamente en el caso ideal. La memoria del servidor de destino está tratando de ser de 6 GB porque ha establecido el valor máximo de memoria del servidor en 6 GB. Está tratando de consumir toda la memoria que tiene permitido.

La memoria total del servidor es lo que SQL Server puede consumir en este momento. Esto es memoria comprometida y respaldada por RAM física. Esto es 5.5 GB máximo en su caso.

SQL Server está tratando de aumentar su consumo de memoria, pero después de llegar a 5.3 o 5.5 GB, el sistema operativo le está pidiendo a SQL Server que no aumente aún más su consumo de memoria y podría estar marcando una notificación de poca memoria. Esto está sucediendo porque el sistema operativo podría estar enfrentando poca memoria como ya se dijo anteriormente. SQLOS responde si el sistema operativo Windows enfrenta presión de memoria pidiéndole a sus cachés que reduzcan su consumo. Puede consultar el Ring Buffer para verificar si se notificó una notificación de poca memoria. Debo agregar DMV sys.dm_os_ring_buffer no está documentado pero es seguro.

Veo que las páginas se eliminan del caché, pero aún quedan 700 MB de memoria. Si nada necesitara la memoria, ¿cómo explicaría el hecho de que las páginas se eliminan del caché? Esperaría que SQL Server solo elimine páginas cuando necesita memoria.

Si está buscando memoria libre, no le sugiero que mire los DMV sys.dm_os_buffer_descriptors . El contador del sistema operativo Available Mbytes le indicará la cantidad de memoria física, en bytes, disponible para los procesos que se ejecutan en la computadora. Le sugiero que vea también ¿Qué es un método determinista para evaluar un tamaño razonable de agrupación de almacenamiento intermedio? y también lea ¿SQL Server necesita más RAM para saber cuánta RAM necesita SQL Server y si SQL Server enfrenta presión de memoria? Por lo que mencionó, si está seguro de que las páginas se están eliminando del grupo de búferes, sí, SQL Server considera que las páginas deben moverse porque necesita espacio para acomodar nuevas páginas. No estoy seguro de cómo calculaste los 700 MB gratis.

Otra cosa, no mire el Administrador de tareas para el consumo de memoria de SQL Server. No siempre le da el valor correcto, especialmente cuando la cuenta de servicio de SQL Server tiene las páginas bloqueadas en el privilegio de memoria . En su caso, incluso si SQL Server tiene una memoria máxima de servidor de 6 GB, el sistema operativo tiene solo 2 GB, lo que obliga a SQL Server a no aumentar su consumo porque 2 GB son bajos para SQL Server. ¿Hay algo aparte de SQL Server ejecutándose en el sistema?

Si desea calcular el consumo de memoria de SQL Server, utilice:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Lo que no entiendo es por qué Total_Memory_in_MB no es igual a 6144 (memoria máxima).

La columna Total_Memory_in_MB indica la memoria total utilizada por SQL Server (RAM + archivo de página). La RAM es en realidad memoria física utilizada o memoria comprometida. Alguna parte del proceso de SQL Server también está paginada en el disco y eso constituye una memoria virtual o un archivo de página, por lo que si va a ver la memoria TOTAL consumida por SQL Server, sería la suma de la memoria física y el archivo de página.

Mientras que la columna Physical_Memory_usedby_Sqlserver_MB es solo la memoria física (memoria respaldada por RAM física o memoria comprometida) utilizada. Esta es la razón por la cual ambos son diferentes. Si ve la columna real, la primera es la memoria física utilizada y la otra es la memoria virtual comprometida.

Si desea ver la memoria paginada, esa sería la diferencia entre Total_Memory_in_MB y Physical_Memory_usedby_Sqlserver_MB .

NOTA: La memoria total utilizada sería mayor que la memoria física utilizada.

Shanky
fuente
5

SQL Server utiliza muchas más cachés además de la memoria caché del búfer, aunque esa es de lejos la más grande (un ejemplo obvio es la caché del plan). Puede echar un vistazo más de cerca a la memoria DBCC MEMORYSTATUSy a una variedad de DMV. La memoria de destino y la memoria total se refieren específicamente al Buffer Pool / Cache.

Extracto del seminario profesional interno de SQL Server 2008 de Christian Bolton y resolución de problemas :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Esto indica el tamaño actual de la agrupación de almacenamiento intermedio.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    Esto indica el tamaño ideal para el grupo de búferes. Total y Target deberían ser casi iguales en un servidor sin presión de memoria que se haya estado ejecutando durante un tiempo. Si Total es significativamente menor que Target , es probable que SQL Server no pueda aumentar el grupo de búferes debido a la presión de la memoria, en cuyo caso puede investigar más a fondo.
Mark Broadbent
fuente
Solo para agregar, incluso si la memoria total y la memoria del servidor de destino son las mismas, no podemos estar 100% seguros de que no haya presión de memoria. En este caso, necesitamos encender algunos contadores de memoria más y también obtener sus datos para llegar a una conclusión.
Shanky
"Total y Target deberían ser casi iguales en un servidor sin presión de memoria que ha estado funcionando durante un tiempo". Pensemos en esto. Pongo en pie un nuevo SQL Server con 128 GB de RAM y presento una sola base de datos de 1 GB. Déjalo correr por un mes. ¿De verdad creo que Total y Target van a ser casi iguales al final de ese mes? Si no lo son, ¿debo creer que el servidor está bajo presión de memoria? Me parece difícil de creer.
Mike Sherrill 'Cat Recall'