SQL Server 2008 R2 «Mémoire fantôme»?

12

Nous avons une machine dédiée SQL Server 2008 R2 qui rencontre d'étranges problèmes de mémoire. La machine elle-même dispose de nombreuses ressources, dont deux processeurs quadricœurs, 16 Go de RAM et 64 bits Windows Server 2008 R2 Enterprise (il s'agit d'un Dell PowerEdge 2950) .

Le problème étrange est que le système signale 82% de la mémoire utilisée, mais sqlservr.exe ne signale que 155 Mo en cours d'utilisation. La raison pour laquelle je soupçonne SQL Server est le problème parce que si je redémarre le processus sqlservr.exe, la consommation de mémoire revient à la normale pendant un certain temps.

Quelqu'un at-il des idées sur la façon de commencer à suivre ce problème?

Merci, Jason

police de caractères
la source
3
Utilisez-vous le droit d'utilisateur Verrouiller les pages en mémoire? Si c'est le cas, la mémoire verrouillée ne sera pas signalée par le gestionnaire de tâches. Voir blogs.technet.com/b/askperf/archive/2008/03/25/… pour plus d'informations.
Mark S. Rasmussen
Le droit d'utilisateur Verrouiller les pages en mémoire est défini sur "Aucun". Nous avons également le paramètre «Mémoire maximale du serveur (en Mo)» sur son int.MaxValue par défaut - pensez-vous que cela pourrait causer un problème?
police de caractères
4
La seule fois où je serais inquiet, c'est quand mon serveur sql utilise MOINS de 82%!
SqlACID

Réponses:

15

Vous n'obtiendrez pas une image réelle de l'utilisation de la mémoire du Gestionnaire des tâches si le compte sous lequel le service s'exécute dispose des privilèges de verrouillage des pages en mémoire (modifier: selon le commentaire / lien de Mark Rasmussen). Pour déterminer la quantité de mémoire utilisée, vous pouvez consulter:

  • SQLServer: Memory Manager \ Total Server Memory perfmon counter
  • DMV

Je ne me souviens pas s'il y a un DMV ou une combinaison de cela qui vous donnera l'allocation totale de la mémoire mais ce qui suit en montrera la majeure partie.

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

Le second est généralement le plus intéressant, les allocations de pool de mémoire tampon par base de données. C'est là que la part des lions sera utilisée et il peut être utile de comprendre lesquelles de vos bases de données sont les plus gros consommateurs.

Mark Storey-Smith
la source
Woah, merci beaucoup! Cela (en particulier le deuxième) l'a rendu complètement clair pour moi!
police de caractères
8

Il y a un article récent de notre propre Brent Ozar qui traite de ce cas, lorsque le Gestionnaire des tâches n'affiche pas correctement la mémoire consommée par SQLServer et ses services supplémentaires. Vous pouvez le trouver ici: Guide Sysadmin de la mémoire Microsoft SQL Server .

Citation: " Pourquoi SQLServer.exe n'utilise-t-il pas beaucoup de mémoire?

Lorsque vous postez un bureau à distance sur un serveur et examinez le Gestionnaire des tâches, l'utilisation mem de sqlservr.exe semble toujours farfelue. Ce n'est pas la faute de SQL Server. Le Gestionnaire des tâches est un menteur sale et sale. (Je sais, il semble que le gars SQL déplace le blâme, mais restez avec moi pendant une seconde.) Sur les boîtes 64 bits, ce nombre est un peu plus précis, mais sur les boîtes 32 bits, il est tout simplement hors de propos . Pour obtenir une image précise de la quantité de mémoire utilisée par SQL Server, vous avez besoin d'un outil tel que Process Explorer et vous devez identifier tous les processus de SQL Server. Dans le serveur que je montre à droite, il y a deux instances SQL Server (affichées par sqlservr.exe), plus SQL Agent, SQL Browser et les outils de sauvegarde SQL Server. Il n'est pas rare de voir également SQL Server Analysis Services, Integration Services et Reporting Services s'exécuter également sur le même serveur, qui consomment tous de la mémoire.

Alors, combien de mémoire utilise SQL? Je vais vous faciliter la tâche. SQL Server utilise toute la mémoire. Période."

Je vous conseille donc d'essayer la requête de Mark et d'utiliser un meilleur outil pour le rapport de mémoire. Ou faites simplement confiance à Perfmon pour signaler la mémoire, pas au Gestionnaire des tâches.

Marian
la source
-2

La quantité de mémoire utilisée par SQL, comme indiqué dans le gestionnaire de tâches, sera principalement le paramètre max-memory. Voici comment fonctionne le paramètre min / max:

Lorsque SQL Server démarre, il commence à prendre de la mémoire jusqu'au paramètre de mémoire minimale. À mesure que vos besoins SQL augmentent, SQL commencera à utiliser plus de mémoire jusqu'au paramètre max-memory. La mémoire reste alors à ce point (max) même lorsque l'utilisation de SQL diminue. Cela donne l'impression que SQL effectue d'énormes tâches et utilise autant de mémoire. En réalité, cette mémoire est réservée par SQL.

En cas de pression de mémoire non SQL sur le serveur, SQL libère de la mémoire jusqu'au point de configuration de la mémoire minimale. C'est ainsi que les paramètres de mémoire sont utilisés. Vous pouvez utiliser les scripts de Mark pour voir comment SQL utilise cette mémoire.

StanleyJohns
la source
1
Min / max régit les allocations de pool de mémoire tampon, rien de plus. Il s'agit de la première ligne de la description des options de mémoire du serveur dans BOL. Les paramètres n'ont absolument aucun rapport avec ceux affichés dans le gestionnaire de tâches. La description par Brent de taskmgr comme "un menteur sale et sale" résume la situation ainsi que toutes celles que j'ai lues.
Mark Storey-Smith,
@ MarkStorey-Smith, veuillez lire le contenu plus bas dans le lien dans votre propre commentaire, cela explique encore plus mon point. Le gestionnaire de tâches montre l'utilisation des ressources système. Le pool de mémoire tampon n'est pas une ressource système. J'explique ce que signifie l'utilisation de la mémoire par SQL indiquée dans le gestionnaire de tâches. Vous dites l'évidence en mentionnant le pool de tampons, mais cela ne me prouve toujours pas.
StanleyJohns
Je ne sais pas comment mieux mettre cela ... "La quantité de mémoire utilisée par SQL, comme indiqué dans le gestionnaire de tâches, sera principalement le paramètre max-memory. Voici comment fonctionne le paramètre min / max" .. non ce n'est pas 't.
Mark Storey-Smith,
'Voici comment fonctionnent les paramètres min / max:' Il y a un deux-points à la fin, ce qui signifie que l'explication suit, pas qu'il affirme la phrase précédente. :)
StanleyJohns
1
Je suis avec Mark. Lire le blog de Slava Oks : il faisait partie de l'équipe MS qui a écrit le gestionnaire de mémoire. Allez à la rubrique "pool de tampons". Je cite "N'oubliez pas que SQL Server a deux paramètres de mémoire que vous pouvez contrôler à l'aide de sp_conifigure. Ce sont la mémoire maximale et minimale du serveur. Je ne sais pas si vous le savez, mais ces deux paramètres contrôlent vraiment la taille du pool de mémoire tampon. Ils ne contrôlent pas globalement quantité de mémoire physique consommée par SQL Server "
gbn