Ho SQL Server 2014 con memoria massima impostata su 6 GB (la memoria fisica è 8 GB).
La memoria del server di destinazione è talvolta 6 GB e quindi torna alla memoria totale del server (circa 5,3 GB, non raggiunge mai i 6 GB). Ho usato committed_kb in sys.dm_os_sys_info per controllare la memoria utilizzata da SQL Server.
Quando controllo sys.dm_os_buffer_descriptors , vedo che le pagine vengono eliminate dalla cache, ma rimangono ancora 700 MB di memoria. Se nulla avesse bisogno della memoria, come spiegheresti il fatto che le pagine vengono rimosse dalla cache? Mi aspetto che SQL Server rimuova le pagine solo quando ha bisogno di memoria.
Le tabelle temporanee deallocate non sono un problema su questo server. Il mio PLE è 3632. La cache delle procedure è 2182 MB.
Mi aspetto che le pagine vengano eliminate solo quando non è rimasta memoria, ma ho 700 MB di spazio libero o non lo capisco?
Qualcuno può provare a spiegare questo comportamento?
Anche SQL Server legge dal disco, quindi penso di poter concludere che non tutte le pagine necessarie sono in memoria.
Ho fatto qualche ricerca in più e ho letto un'enorme quantità di pagine dal disco in memoria e ho notato qualcosa nel taskmanager durante le letture:
- La memoria in uso è passata da 7,0 GB -> 7,2 GB -> 7,0 GB -> 7,2 GB -> ...
- Sqlservr.exe è passato da 5,3 GB -> 5,5 GB -> 5,3 GB -> 5,5 GB -> ...
È proprio come Windows non consente a sqlservr.exe di crescere fino a 6 GB.
Ho eseguito la query fornita da 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
Ciò ha dato il seguente risultato:
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
Quello che non capisco è perché Total_Memory_in_MB non è uguale a 6144 (memoria massima)?
In sys.dm_os_ring_buffers l' ho trovato RESOURCE_MEMPHYSICAL_LOW
, quindi penso che Windows abbia esaurito la memoria e che SQL Server debba restituirne alcuni. Ma è disponibile circa 1 GB di memoria => perché Windows dice che sta esaurendo la 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>
Aggiornamento
Dopo ulteriori ricerche sul perché fosse sempre disponibile 1 GB di memoria, penso di aver trovato qualcosa.
È possibile che solo SQL Server possa allocare memoria libera e che la memoria disponibile venga ignorata? Durante l'esecuzione di Process Explorer (Sysinternals) ho visto che la memoria libera era 0.