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.