Auteur de questions
SQL Server 2016 SP2 : problème de taille de cache

Question
-
Bonjour
Je viens de migrer une instance SQL Server 2008 vers 2016 SP2. Les bases sont dans un groupe de disponibilité synchrone.
La mémoire alloué à SQL Server : 480Go pour un serveur possédant : 507Go.
Pourtant nous avons des symptômes de contention mémoire :
> Nombre de plan d'exécution faible (nombre de plan entre : 10 et 210, pour un volume de 3Mo à 21Mo), pourtant nous avons eut un nombre important de plan, il y a quelques jours la taille du cache : CACHESTORE_SQLCP : 4.3Go, au profit de MEMORYCLERK_SQLQERESERVATIONS passant de 1,3Go à 95Go. De plus, 1h après le cache MEMORYCLERK_SQLQERESERVATIONS est retombé à 800Mo). La mémoire récupéré est réalloué en partie à MEMORYCLERCK_SQLBUFFERPOOL.
> les DMV suivantes sont quasiment vide :
- sys.dm_exec_trigger_stats (5lignes)
- sys.dm_exec_procedure_stats (1lignes)
- sys.dm_exec_query_stats (0lignes)
Nous n'avons aucune action de DBCC FREEPROCACHE, aucune base en auto_close, pas de bascule de groupe de disponibilité
Si vous avez des pistes je suis preneur.
Toutes les réponses
-
Salut Greg
Pas de resource_semaphore ?
Vu que tu es en enterprise, essaie de changer les settings du ResGov pour par exemple limiter à 10% la mémoire au lieu de 25%.
Autre point, bcp de colonnes en VARCHAR ou NVARCHAR dans la/les tables en question ?
Christophe
Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM
-
Non aucun ressource_semaphore au niveau session ou dans les statistiques globales.
Après analyse plus poussé via la DMV : sys.dm_os_memory_cache_
clock_hands Type :CACHESTORE_PHDR / Round count : 49708 (Avg : 5,96) / Removed_ all_rounds_ count : 1521293 (Avg by min.: 182,52)
Type : CACHESTORE_SQLCP / Round count : 49708 (Avg : 5,96) / Removed_ all_rounds_ count : 1521293 (Avg by min.: 149,99)
Type : CACHESTORE_OBJCP / Round count : 49708 (Avg : 5,96) / Removed_ all_rounds_ count : 1521293 (Avg by min.: 23.98)
Pas de pressions mémoire remontée constamment, dans la DMV : sys.dm_os_ring_buffers (avec ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR'
). La dernière pression mémoire apparaît plusieurs jours avant. Mon analyse est : tant qu'aucun gros traitement ne passe, le cache plan grossit mais lors du 1er gros traitement s'allouant beaucoup de mémoire au travers des caches :
- SQLServer:Memory Manager\Granted Workspace Memory (KB)
- SQLServer:Memory Manager\Stolen Server Memory (KB)
La taille du plan cache n'arrive plus à grossir.
Sur une semaine la taille du cache de plan d'exécution (SQLServer:Memory Manager\SQL Cache Memory (KB)") n'a pas dépassé 10Ko, hors avec le compteurs : "SQLServer :Plan cache\Cache Pages (_Total)" à comme valeur moyenne : 2 847 soit : 182 776Ko et une valeur maximum à 67 425 soit : 539 400Ko, J'imagine que cette différence est que les plans d'exécutions sont stockés "temporairement" dans le cache stolen.
-