web-dev-qa-db-fra.com

Pourquoi l'utilisation totale de RAM de Resource Monitor et du gestionnaire de tâches ne correspond-elle même pas à distance à l'utilisation totale de la mémoire physique?

Je l’ai remarqué sur de nombreuses machines Windows différentes et à diverses occasions: l’utilisation de RAM rapportée par le Gestionnaire des tâches ou le Moniteur de ressources semble souvent s’ajouter à un montant qui représente de manière significative inférieur au montant réel utilisé.

Par exemple, plusieurs fois sur mon ordinateur portable ou sur mon bureau, j'ai vu quelque chose comme 7 Go en cours d'utilisation, mais le total de l'ensemble de travail RAM est plutôt de 3 Go. Je n'arrive pas à comprendre où il est utilisé!

Voici un exemple extrême que j'ai remarqué aujourd'hui dans Resource Monitor sur un serveur:

Resource monitor
Cliquez pour agrandir

Si vous cliquez avec le bouton droit de la souris sur l'image, ouvrez un nouvel onglet et affichez les numéros, vous remarquerez que le jeu de travail (qui ne comprend pas de mémoire virtuelle non physique) représente environ 1,7 Go. Je reçois des chiffres similaires en additionnant RAM usage dans le Gestionnaire des tâches lorsque l'option "Afficher les processus de tous les utilisateurs" est activée.

Maintenant, voici une capture d'écran de l'onglet Performance du gestionnaire de tâches:

Task manager
Cliquez pour agrandir

Cela signifie que 7,6 Go de mémoire physique sont utilisés.

Je le vois tout le temps, sur les ordinateurs personnels, les ordinateurs portables et maintenant les serveurs: l'utilisation totale RAM rapportée par les outils système ne représente qu'environ 1/4 de l'utilisation RAM que j'observe . WTF continue ???

Existe-t-il une explication satisfaisante quant à l'emplacement de tous mes RAM? Qu'est-ce qui l'engloutit et pourquoi ne laisse-t-il aucune trace?

EDIT: Voici une image de l'utilisation graphique RAM, comme demandé par l'utilisateur:

RamMap Use
Cliquez pour agrandir

EDIT 2: En réponse à la réponse de James, voici une image des processus non paginés dans poolmon.exe, triés par taille:

enter image description here

Ces résultats me confondent. poolmon indique correctement que j'ai 6 Go de pool non paginé en cours d'utilisation, mais que tous les processus de pool non paginé ont une taille inférieure à 8 Mo.

Qu'est-ce que cela pourrait signifier? poolmon ne parvient-il pas à détecter certains des processus utilisant le pool non paginé?

28
DumpsterDoofus

Je suis désolé, je sais que cela ressemble à une réponse désinvolte ... mais la réponse à la question dans votre titre est "parce qu'ils ne sont pas censés le faire".

Ou pour le dire plus poliment: Il y a beaucoup d'utilisation de RAM qui n'est pas dans les ensembles de travail privés des processus. Cela se trouve en partie dans les ensembles de travail partagés des processus - mais vous ne pouvez pas avoir une idée fiable de l'utilisation réelle ici, à cause du partage; additionner les nombres des processus vous donnera un résultat beaucoup trop grand.

Les autres éléments occupant la mémoire RAM, tels que le pool non paginé, la partie résidente du pool paginé et les portions résidentes des autres utilisations de l'espace noyau, n'apparaissent pas du tout dans les "processus" du gestionnaire de tâches.

En ce qui concerne votre problème spécifique:

Sur l'écran du gestionnaire de tâches, reportez-vous à la section "Mémoire du noyau". Vous avez 6 Go de "mémoire non paginée" (c'est un pool non paginé). Cela fait partie de la section "En cours d'utilisation" de votre deuxième graphique. Le pool non paginé n'est facturé à aucun processus. C'est pourquoi l'ajout des nombres par processus dans le gestionnaire de tâches ne se rapproche pas du total utilisé. Certains conducteurs l'utilisent probablement. C'est une quantité tout à fait excessive; il devrait être bien en dessous de 1 Go. quel que soit le pilote responsable de la partie excessive de l’utilisation du pool non paginé, il est incontestable qu’il est bogué.

RAMmap peut le confirmer (dans son onglet "Use Counts", regardez le total pour "Pool non paginé"), mais il ne peut pas vous aider à trouver le pilote qui l’a provoqué.

Voici comment le trouver: Procurez-vous une copie de l'outil Microsoft "poolmon". Il s’agit d’un outil en mode caractère distribué par le biais du kit de pilotes Windows. Pour Windows 7, le WDK est un téléchargement gratuit . Vous devez tout télécharger (c'est un fichier ISO) et l'installer à partir de cela, mais vous pouvez choisir d'installer uniquement les outils, si c'est tout ce que vous voulez.

Recherchez poolmon dans les répertoires WDK - assurez-vous de choisir celui qui convient, 32 ou 64 bits - et exécutez-le à partir de l'invite de la commande administrateur. Vous obtiendrez un affichage comme celui-ci:

enter image description here

Maintenant, appuyez sur la touche "p" (non, je ne plaisante pas. Pas de menus ici!) Jusqu'à ce que la colonne "Type" affiche uniquement "Nonp". Appuyez ensuite sur "b" (deux fois si nécessaire) pour trier l'affichage par ordre décroissant en fonction de la colonne Octets (cela a déjà été fait dans l'exemple ici).

Ensuite, regardez la colonne "Tag" pour la ligne la plus haute. Dans le cas (évidemment artificiel) montré ici, il s'agit de "Fuite". (Ce système exécute un pilote qui a été délibérément mis à l'écart pour causer ce problème: il "fuit" un pool non paginé.)

au fait, les lignes en surbrillance sont celles qui ont changé depuis la dernière mise à jour de cet écran archaïque.

Maintenant, recherchez dans c:\Windows\System32\Drivers un fichier .sys contenant cette chaîne. Dans ce cas, vous recherchez une "fuite", comme ceci:

c:\windows\system32> findstr /s Leak *.sys

Ensuite, recherchez sur le Web des références à cette chaîne et/ou à ce nom de pilote.

Revenir ici et indiquer le nom complet, le nom du fabricant, etc. à partir du fichier .sys serait également utile.

(Mon pari est que la balise que vous trouverez sera ECMC, le pilote est intmsd.sys et il est associé à un produit appelé ExpressCache ou IntelliMemory. Je "désinstallerais" ce produit. Il existe une mise à jour pour résoudre le problème, mais même avec la version corrigée, je n'ai jamais vu les performances d'un système améliorées par ce produit; il reproduit essentiellement une fonctionnalité déjà présente dans Windows.)

Si vous ne le trouvez pas ainsi, l'étape suivante consiste à utiliser le "Kit d'outils de performance Windows". Cherchez dans ce forum cette chaîne, avec des réponses de magicandre1981, pour un tutoriel. Ignorer les réponses qui mentionnent xperf - il s'agit d'une version plus ancienne de l'outil.

MISE À JOUR: Selon les commentaires, le PO a fait ce qui précède et a constaté que, bien que poolmon ait signalé que la taille totale de la réserve non paginée était vraiment énorme, toutes les pièces attribuées étaient apparemment minuscules. Ma conjecture (également dans les commentaires) est que cela est dû à ce que j'appellerai un pool "ballonné": le pool a été alloué, puis libéré, mais pour une raison quelconque, la quantité de RAM allouée au pool n'a pas été réduite. refléter la "libération". En suivant la procédure décrite dans , cette réponse de magicandre peut identifier le coupable.

26
Jamie Hanrahan