J'ai une instance de SQL Server 2012 SP2 Enterprise Edition consommant ~ 20 Go de mémoire au-dessus du maximum. limite de mémoire. L'instance est limitée à 65 Go, mais la mémoire physique utilisée à partir de la requête ci-dessous affiche 86 Go
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Le serveur est physique avec 2 nœuds NUMA. Existe-t-il un moyen de savoir ce qui consomme la mémoire en dehors du pool de tampons (je suppose que c'est ce qui se passe)?
Voici la sortie de DBCC MEMORYSTATUS: -
Et voici la limite de mémoire définie: -
Merci d'avance.
MISE À JOUR: - J'ai exécuté la requête suggérée par Aaron
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
Voici la sortie: -
La somme de pages_kb atteint ~ 60 Go
MISE À JOUR 2: - La sortie complète de DBCC MEMORYSTATUS est ici: - http://pastebin.com/nGn6kXEc
MISE À JOUR 3: - Sortie des scripts de Shanky dans le fichier Excel ici: - http://jmp.sh/LKRlH4K
MISE À JOUR 4: - Capture d'écran de la sortie de: -
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Cela semble donc indiquer que SQL Server utilise plus que l'ensemble de 65 Go.
la source
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;
?Réponses:
Max commandes de mémoire de serveur pool de mémoire tampon et toutes les allocations de taille de page, mais ne contrôle pas toujours les choses comme les allocations de Windows directs (serveurs liés, sp_OA, XPs), la mémoire requise pour fils / piles de fil, etc .
Vous pouvez probablement vous attendre à ce que cela soit plus élevé sur NUMA (bien que je ne sois pas sûr que 20 Go soient normaux); le fait est que vous ne pouvez pas vous attendre à ce que la mémoire maximale du serveur contrôle entièrement la mémoire utilisée par une instance de SQL Server. Si vous souhaitez que l'instance entière (pas seulement le pool de mémoire tampon, les caches de plan et CLR) n'utilise pas plus de 64 Go, vous devez définir la mémoire maximale du serveur sur quelque chose de plus bas.
Quelques idées potentielles pour retrouver cela (je normaliserai tout en Mo):
compteurs de performance
Voyez si quelque chose saute ici comme excessivement grand:
20 premiers employés
Vous l'avez déjà fait, mais pour être complet:
taille de la pile de fils
Tout d'abord, assurez-vous qu'il s'agit de zéro, et non d'un certain nombre personnalisé (si ce n'est pas 0, découvrez pourquoi et corrigez-le):
Mais vous pouvez également voir la quantité de mémoire occupée par les piles de threads en utilisant:
Modules tiers chargés
DMV liés à la mémoire
Vous pouvez également être en mesure de repérer quelque chose hors de l'ordinaire en regardant ces DMV:
Cet article a été écrit avant SQL Server 2012, donc certains noms de colonne et calculs peuvent devoir être ajustés, mais peuvent également donner d'autres pistes à essayer:
Quelques bons antécédents dans un autre article sur ce site aussi:
Quelques bonnes informations sur les types de choses qui utilisent de la mémoire en dehors de
max server memory
(mais pas de bonnes données sur la façon de collecter l'utilisation réelle):la source
J'ai obtenu ci-dessous la définition de Bob Dorr sur la mémoire maximale du serveur dans les contrôles SQL Server 2012. Vous pouvez également lire la documentation en ligne pour plus de détails
La mémoire allouée à la pile de threads, la DLL tierce, le fournisseur de serveur lié autre que celui de Microsoft (comme MySQL.PostgreSQL, etc.) ou toute DLL chargée dans l'espace d'adressage SQL Server qui n'est pas SQL Server est allouée en dehors de la mémoire maximale du serveur. L'opération de sauvegarde IIRC dans SQL Server 2012 se voit également allouer de la mémoire en dehors du pool de tampons.
Utilisez-vous un serveur lié pour interroger d'autres SGBDR? Tout autre logiciel installé sur la même machine Windows. Pouvez-vous publier sur un emplacement partagé la sortie des requêtes suivantes
Pouvez-vous également télécharger une
DBCC MMEMORYSTATUS
sortie complète sur un emplacement partagé et publier le lien ici. Cela aiderait à comprendre quel composant prend de la mémoireModifier: selon la sortie memorystatus dbcc, je peux voir 2 nœuds NUMA et la mémoire utilisée par chaque nœud est d'environ
Encore une fois, si vous voyez Memory Manager dans memorystatus sortir son
La VM validée est en fait de la mémoire virtuelle validée par SQL Server et puisque cette mémoire est validée, elle l'a fait
physical memory backing it
. Cela encore une fois, ce qui me fait penser que SQL Server utilise 65 G comme défini dans la mémoire maximale du serveurC'est ce qu'est la mémoire max du serveur. La mémoire est donc bien répartie entre les deux nœuds. Vous pouvez également ajouter la sortie de la requête ci-dessous pour vérifier. Veuillez ajouter une capture d'écran
la source
select * from sys.dm_so_process_memory