J'ai SQL Server 2014 avec une mémoire maximale définie sur 6 Go (la mémoire physique est de 8 Go).
La mémoire du serveur cible est parfois de 6 Go, puis revient à la mémoire totale du serveur (environ 5,3 Go, n'atteint jamais 6 Go). Je committed_kb dans sys.dm_os_sys_info pour vérifier la mémoire utilisée par SQL Server.
Lorsque je surveille sys.dm_os_buffer_descriptors , je constate que des pages sont supprimées du cache - mais il reste encore 700 Mo de mémoire. Si rien n'avait besoin de mémoire, comment expliquer le fait que les pages soient supprimées du cache? Je m'attendrais à ce que SQL Server supprime uniquement les pages lorsqu'il a besoin de mémoire.
Les tables temporaires désallouées ne sont pas un problème sur ce serveur. Mon PLE est 3632. Le cache de procédure est de 2182 Mo.
Je m'attendrais à ce que les pages ne soient supprimées que s'il n'y a plus de mémoire, mais j'ai 700 Mo d'espace libre ou suis-je mal compris?
Quelqu'un peut-il essayer d'expliquer ce comportement?
SQL Server lit également à partir du disque, donc je pense que je peux conclure que toutes les pages nécessaires ne sont pas en mémoire.
J'ai fait quelques recherches supplémentaires et j'ai lu une énorme quantité de pages du disque dans la mémoire et j'ai remarqué quelque chose dans le gestionnaire de tâches pendant les lectures:
- La mémoire utilisée est passée de 7,0 Go -> 7,2 Go -> 7,0 Go -> 7,2 Go -> ...
- Sqlservr.exe est passé de 5,3 Go -> 5,5 Go -> 5,3 Go -> 5,5 Go -> ...
C'est comme si Windows ne laisse pas sqlservr.exe atteindre 6 Go.
J'ai exécuté la requête fournie par 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
Cela a donné le résultat suivant:
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
Ce que je ne comprends pas, c'est pourquoi Total_Memory_in_MB n'est pas égal à 6144 (mémoire max)?
Dans sys.dm_os_ring_buffers, j'ai trouvé RESOURCE_MEMPHYSICAL_LOW
, donc je pense que Windows manquait de mémoire et SQL Server doit en renvoyer. Mais il y a environ 1 Go de mémoire disponible => pourquoi Windows dit-il qu'il manque de mémoire?
<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>
Mise à jour
Après quelques recherches pour savoir pourquoi il y avait toujours 1 Go de mémoire disponible, je pense avoir trouvé quelque chose.
Est-il possible que SQL Server puisse uniquement allouer de la mémoire libre et que la mémoire disponible soit ignorée? Lors de l'exécution de Process Explorer (Sysinternals), j'ai vu que la mémoire disponible était de 0.
la source