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:
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:
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:
EDIT 2: En réponse à la réponse de James, voici une photo des processus non paginés poolmon.exe
, triée par taille:
Ces résultats me confondent. poolmon
indique 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 poolmon
ne pas détecter certains des processus en utilisant la piscine non paginée?
la source
Réponses:
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:
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:
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.
la source
poolmon
Si 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.poolmon.exe
sur le serveur en question, et édité ma question pour inclure une capture d'écran.poolmon
indique 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 lapoolmon
détection de l’essentiel de l’utilisation du pool non paginé n’est pas détectée?