Pourquoi l'utilisation totale de la RAM par Resource Monitor et Task Manager ne correspond-elle même pas à distance à l'utilisation totale de la mémoire physique? [dupliquer]


30

Cette question a déjà une réponse ici:

Je l'ai constaté sur de nombreuses machines Windows et à différentes occasions: l'utilisation de la RAM indiquée par le Gestionnaire des tâches ou le Moniteur de ressources semble souvent correspondre à une somme considérablement inférieure à la quantité réellement utilisée.

Par exemple, à plusieurs reprises sur mon ordinateur portable ou mon bureau, j'ai vu quelque chose comme 7 Go en cours d'utilisation, mais le total de l'ensemble de RAM de travail 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:

Moniteur de ressources
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. J'obtiens des chiffres similaires en additionnant l'utilisation de la RAM 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:

Gestionnaire des tâches
Cliquez pour agrandir

Cela signifie que 7,6 Go de mémoire physique est utilisée.

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

Existe-t-il une explication satisfaisante de l'emplacement de toute ma mémoire RAM? Qu'est-ce qui l'engloutit et pourquoi ne laisse-t-il aucune trace?

EDIT: Voici une image de l'utilisation de la RAM graphique, telle que demandée par l'utilisateur:

Utilisation de RamMap
Cliquez pour agrandir

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

entrez la description de l'image ici

Ces résultats me confondent. poolmonindique correctement que 6 Go de pool non paginé sont utilisés, mais que tous les processus de pool non paginés ont une taille inférieure à 8 Mo.

Qu'est-ce que cela pourrait signifier? Est -ce poolmonne pas détecter certains des processus en utilisant la piscine non paginée?



Pouvez-vous s'il vous plaît poster une photo de votre moniteur de ressources> onglet Mémoire (juste la partie inférieure avec les couleurs et les chiffres). Ce serait plus parlant.
whs

2
@Ramhound: Merci de m'avoir signalé ce lien! Malheureusement, comme je viens de le demander, j'ai téléchargé une image de la carte graphique de la mémoire physique de Resource Monitor, et la partie en veille de la mémoire physique représente moins de 2% de l'utilisation totale de la RAM. La réponse de David Schwartz suggère que l'utilisation de RAM "cachée" provient de la RAM de secours (c'est-à-dire, la RAM utilisée pour les données en cache et le code non utilisé), et ce n'est pas le cas ici. En tant que tel, je ne pense pas que la réponse de David explique ce qui se passe.
DumpsterDoofus

Utilisez le programme RamMap, et explorez-le davantage., Jusqu’à présent, c’est peut-être un chauffeur qui se comporte comme un fou? mais en effet ce n'est pas le standby (cache). Avez-vous des programmes spéciaux qui permettent de réparer le bélier ou qui supposent d’accélérer l’ordinateur? Des éléments de pilote étranges qui seraient spéciaux pour vos ordinateurs?
Psycogeek

2
Le lien vers "répondu avant" ne couvre pas ce cas.
Jamie Hanrahan

Réponses:


29

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 ne fait pas partie des ensembles de travail privés des processus. Une partie de cela se trouve 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 téléchargeable gratuitement . 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 d'une invite de commande de l'administrateur. Vous obtiendrez un affichage comme celui-ci:

entrez la description de l'image ici

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 rechercherez "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.

Retourner 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 pour refléter la "libération". . Suite à la procédure décrite dans cette réponse par magicandre peut identifier le coupable.


Merci de prendre pour enquêter plus loin que d'autres! poolmonSi je dispose de suffisamment de temps, je chercherai une fuite aujourd'hui et essaierai de lire votre réponse plus attentivement pour être sûr de bien la comprendre. Voulez-vous dire qu'il y a probablement une fuite de mémoire? Si c'est le cas, c'est tout à fait plausible, car nous travaillons sur des logiciels connus pour avoir d'horribles fuites de mémoire.
DumpsterDoofus

@DumpsterDoofus: Oui. Il y a probablement une fuite de mémoire dans un pilote en mode noyau. C'est différent d'une fuite de mémoire dans une application.
Jamie Hanrahan

Alors je me suis finalement mis à courir poolmon.exesur le serveur en question, et édité ma question pour inclure une capture d'écran. poolmonindique que j'ai un pool non paginé de 6 Go (comme vous l'avez indiqué dans la capture d'écran de mon gestionnaire de tâches), mais lorsque je ne regarde que les processus "Nonp" et que je les trie par taille, ils sont tous minuscules (le plus grand est 8 Mo). Avez-vous une idée de la raison pour laquelle la poolmondétection de l’essentiel de l’utilisation du pool non paginé n’est pas détectée?
DumpsterDoofus

2
Ah ... le problème ici est dans le mot "usage". Donc, vous avez un pool non paginé de 6 Go, mais il semble que seule une fraction de celui-ci soit utilisée pour le moment. Hélas, rien de ce que je sache (ni TM, ni poolmon, ni RAMmap) ne montre la quantité réellement utilisée du pool. J'imagine qu'il y avait un gros utilisateur de pool à la fois. Le pool a donc été étendu pour le prendre en charge, puis le gros utilisateur est parti. En raison de la manière dont le pool est géré, il n’est pas facile de libérer la RAM une fois qu’elle lui est allouée, à moins que l’allocation ne soit en gros morceaux contigus. Je suggère de regarder cela après un nouveau démarrage du système.
Jamie Hanrahan

Il existe une version de poolmon.exe disponible dans les outils de support pour Server 2003 ( serverfault.com/questions/84479/… ) - un peu ancienne, mais elle ne nécessite qu'un téléchargement de 5,2 Mo et fonctionne toujours (au moins) sur Server 2016.
mwfearnley le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.