Windows utilisant trop de RAM, comment diagnostiquer le problème des ressources

73

J'ai 16 Go de RAM système. Au démarrage, aucune application ouverte sauf le gestionnaire de tâches Windows utilise environ 3 Go de RAM. J'ai regardé dans l'onglet des processus, mais rien ne semble sortir de l'ordinaire. Comment puis-je savoir pourquoi Windows utilise autant de RAM?

entrez la description de l'image ici

tous les processus de tous les utilisateurs

entrez la description de l'image ici


En lisant le pool, il semble que mon pilote broadcom sans fil utilise environ 0,4 Go de RAM. Même si je l'enlève, il utilisera toujours 2,6 Go au démarrage, ce qui est encore trop.

entrez la description de l'image ici


Après avoir réinstallé le pilote sans fil associé à la fuite de mémoire. J'ai une nouvelle capture d'écran et je voudrais confirmer qu'il s'agissait bien d'une fuite de mémoire.

entrez la description de l'image ici

Vader
la source
3
Tout d’abord, vous n’avez que 12 Go. L'un de vos quatre bâtons de 4 Go est défectueux ou mal installé, ou votre carte mère ne prend pas en charge 16 Go. Deuxièmement, avez-vous essayé d’exécuter des programmes de sécurité pour détecter les programmes malveillants? Security Essentials est intégré. Veillez donc à mettre à jour ses définitions et à effectuer une analyse. Essayez également certains programmes anti-rootkit car les rootkits se cachent spécifiquement (bien qu’ils essaient également de garder un profil bas afin de passer inaperçu, et l’utilisation de quelques gigaoctets de RAM ne se mélange pas à peine).
Synetech
Vous voudrez peut-être regarder la performance -> moniteur de ressources
Journeyman Geek
Essayez d'exécuter la commande tasklist en redirigeant sa sortie vers un fichier, C: \ blah> tasklist> aa, puis ouvrez le fichier aa, vous voyez les totaux pour chaque processus, par exemple 15 100K, supprimez le K après eux et additionnez le total avec Excel. Voyez si le total correspond au chiffre utilisé que ce gestionnaire de tâches vous donne près de son graphique pour utilisé. Pour moi, le total de tasklist est de 4 Go et le gestionnaire de tâches indique 4,5 Go. Je ne peux pas expliquer la différence que j'ai, mais ce n'est pas énorme. ce serait intéressant si vous avez une énorme différence.
barlop
Je n'ai pas Excel
Vader
1
Les balises NDxx sont ndis.sys. Je suppose que BRCM était Broadcom. Cela indiquerait que votre carte réseau est le problème.
David Marshall

Réponses:

82

Vous avez une fuite de mémoire causée par un pilote. Regardez la valeur élevée de la mémoire du noyau non paginée. Dans votre cas, cela dépasse 3,7 Go. Vous pouvez utiliser poolmon pour voir quel pilote est à l'origine de l'utilisation élevée.

Installez Windows WDK , exécutez poolmon, triez-le par Ptype de pool après afin que le nom non paginé soit placé en haut et par Boctets après pour afficher la balise qui utilise le plus de mémoire. Exécutez poolmon en allant dans le dossier où WDK est installé, accédez à Outils (ou C: \ Program Files (x86) \ Windows Kits \ 10 \ Tools \ x64) et cliquez sur poolmon.exe.

Regardez maintenant quel pooltag utilise le plus de mémoire, comme indiqué ici:

entrez la description de l'image ici

Ouvrez maintenant une invite de commande et exécutez la commande findstr. Pour ce faire, ouvrez l'invite cmd et tapez "cd C: \ Windows \ System32 \ drivers", sans guillemets. Puis tapez "findstr / s __ . ", Où __ est la balise (nom le plus à gauche dans poolmon). Faites ceci pour voir quel pilote utilise cette balise:

entrez la description de l'image ici

À présent, accédez au dossier des pilotes (C: \ Windows \ System32 \ drivers) et cliquez avec le bouton droit sur le pilote en question (intmsd.sys dans l'exemple d'image ci-dessus). Cliquez sur Propriétés, accédez à l'onglet Détails pour trouver le nom du produit. Recherchez une mise à jour pour ce produit.

Si le pooltag ne montre que les pilotes Windows ou est répertorié dans le pooltag.txt ( "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\triage\pooltag.txt")

vous devez utiliser xperf pour identifier la cause de l'utilisation . Installez le WPT à partir du SDK Windows , ouvrez un cmd.exe en tant qu'administrateur et exécutez ceci:

xperf -on PROC_THREAD + LOADER + POOL -stackwalk PoolAlloc + PoolFree + PoolAllocSession + PoolFreeSession -BufferSize 2048 -MaxFile 1024 -Fichier circulaire && timeout -1 && xperf -d C: \ pool.etl

capturer 30 à 60 de la croissance. Ouvrez l'ETL avec WPA.exe, ajoutez les graphiques de pool au volet d'analyse.

Placez la colonne pooltag en premier lieu et ajoutez la colonne de pile. Maintenant, chargez les symboles à l' intérieur de WPA.exe et développez la pile de la balise que vous avez vue dans poolmon.

entrez la description de l'image ici

Trouvez maintenant d’autres pilotes tiers que vous pouvez voir dans la pile. Ici, la Threbalise (Thread) est utilisée par AVKCl.exe de G-Data. Recherchez les mises à jour de pilotes / programmes pour y remédier.

magicandre1981
la source
1
Oh pardon. @Jebediah Kerman avez-vous exécuté la commande findstr? Du nom, il pourrait être lié au pilote de la carte réseau. Si vous rencontrez toujours des problèmes, exécutez RAMMap, stockez les données au format RMP, compressez le fichier RMP et téléchargez le fichier zip.
magicandre1981
cela peut sembler stupide. Mais comment puis-je commencer poolmon. J'avais l'habitude de pouvoir rechercher "poolmon.exe" et de lancer
Vader
@JebediahKerman Je pense que vous avez déjà fait cela et trouvé les tags. L'image de votre message n'est-elle pas votre poolmon?
magicandre1981
La photo est à moi. pour une raison quelconque, l'index de recherche était incomplet.
Vader
@JebediahKerman avez-vous regardé ce qu'est ce NDFT? Vous pouvez également utiliser xperf pour suivre l'utilisation du pool: channel9.msdn.com/Shows/Defrag-Tools/…
magicandre1981
15

Eh bien, la première chose, avant d'entrer dans une réponse plus détaillée. Dans votre première capture d'écran, votre réserve non paginée (type d'utilisation de la mémoire du noyau) est à 1,3 Go. Cela me semble inhabituellement élevé, surtout 30 minutes seulement après le démarrage. Je pense que NP Pool pourrait atteindre un tel niveau après une utilisation prolongée ou avec un programme qui fuyait comme un tamis. Par contraste, mon pool NP mesure généralement entre 100 et 200 mégaoctets, et mon pool paginé peut atteindre 400 ou 500 (et cela après que mon système ait fonctionné sans redémarrage pendant des semaines).


Vous pouvez activer quelques colonnes supplémentaires dans le Gestionnaire des tâches en cliquant avec le bouton droit de la souris sur les en-têtes de colonne et en choisissant la sélection de colonnes. Vous devez ajouter Working Set (private), Working Set (shared), Commitet NP Pool. J'analyserais tous vos processus de tous les utilisateurs et verrais si l'un d'entre eux possède un pool NP supérieur à environ 256 Ko. Si vous en voyez, en particulier ceux qui sont considérablement plus élevés, cela pourrait être la source du problème, ou du moins une partie de celui-ci.

Votre ensemble de travail total, la quantité de mémoire physique utilisée par un processus, est la combinaison des ensembles de travail privés et partagés. Privé est généralement plus volumineux pour la plupart des processus, mais certains d'entre eux utilisent une plus grande quantité de services partagés. La somme des deux doit normalement correspondre au nombre total de WS. La validation correspond à la quantité de votre groupe de travail qui a été validée dans le magasin de sauvegarde (dans la plupart des cas, le fichier d'échange Windows). Les applications en arrière-plan ont souvent une plus grande validation que WS, ce qui indique qu'une grande partie de leur pool paginé a été remplacée par la mémoire et insérée dans votre fichier de pagination (ce qui est plutôt normal pour les applications de bureau minimisées et non utilisées pendant un certain temps).

Le pool non paginé est une mémoire qui ne peut pas, et ne pourra jamais, être remplacée par de la mémoire physique ... ce qui correspond effectivement à l'utilisation minimale permanente de la mémoire physique. La mémoire du pool NP contient souvent du code de programme et des sections critiques qui doivent se trouver dans la mémoire physique pour se comporter correctement ou de manière sécurisée, des tas spéciaux, etc. Sur 60 processus, si chacun d'entre eux possède 256 Ko de mémoire du pool NP, votre consommation de mémoire physique minimale absolue serait autour de 15.360KB. Dans la plupart des cas, une ou deux applications peuvent avoir un pool NP de 256 Ko, tandis que la plupart en ont moins, souvent considérablement moins (voire pas du tout). Il est hautement improbable que le système trace jamais la totalité de l'ensemble des processus en cours, aussi ne vous attendez pas à ce que l'utilisation de la mémoire devienne aussi faible.


Enfin, l’intérêt d’avoir davantage de mémoire est d’éviter d’avoir à feuilleter des données vers et depuis l’espace mémoire étendu (swap, fichier de page) d’un disque physique. La pagination est un processus qui implique le déplacement de blocs de mémoire physique allouée, le transfert de certains sur le disque et le transfert des autres dans la mémoire physique. La pagination est, pour rester simple, hautement indésirable. Ce n'est pas «mauvais» en soi, mais cela peut être un frein sérieux aux performances quand elles se produisent trop fréquemment. Le but ultime de l’augmentation de la RAM physique totale dans un système est de permettre à davantage de processus de conserver une plus grande partie de leur validation dans la mémoire physique (ensemble de travail plus grand). Consommer de la mémoire n'est pas un problème, et lorsque davantage de processus en cours utilisent plus de mémoire, les performances système globales et les performances des processus actifs seront généralement plus performantes,

Windows gère la mémoire pour vous et met automatiquement en mémoire les données des pages vers et depuis le fichier d'échange (swap). Si vous exécutez un processus nécessitant 9 Go de mémoire et que votre système en utilise déjà 4 (sur 12 Go), le système déterminera automatiquement les processus qui ne nécessitent pas un accès immédiat à leur ensemble de travail complet, et pagera tout ou partie de celui-ci. de leur pool paginé sur pour échanger afin de libérer ce 1GB supplémentaire. Si votre processus volumineux a finalement besoin de plus de mémoire, Windows réduira encore le nombre de processus en cours jusqu'à ce qu'il dispose de suffisamment d'espace libre pour allouer le nouveau bloc demandé. Votre processus volumineux risque de consommer éventuellement toute la mémoire disponible, à l'exception de NP Pool, et éventuellement une surcharge supplémentaire pour l'exécution périodique de processus qui ne permettent pas à Windows de libérer davantage de son jeu de travail (i. e. ils ont des défauts de page en attente que Windows échangerait autrement en dehors de la mémoire physique, mais étant donné qu'ils sont demandés, ils ne peuvent pas être déplacés.)

Si un processus nécessite plus de mémoire qu'il n'est autorisé à en accéder (les processus 32 bits peuvent généralement accéder à 2 Go et certains à un peu moins de 4 Go avec des techniques améliorées, alors que les processus 64 bits peuvent généralement accéder à environ 48 Go de mémoire), Windows essaie parfois virtualiser sa mémoire avec l’espace de swap. Si une application 32 bits veut utiliser son maximum d'espace autorisé de 2 Go, mais que seulement 1,2 Go sont disponibles, Windows réservera l'intégralité des 2 Go dans le fichier de page et déplacera les données propres du processus dans et hors du fichier de page selon les besoins afin de: soutenir l'utilisation de la mémoire de l'application. L'utilisation totale de "mémoire" dans ce cas peut sembler être supérieure à la mémoire physique disponible, lors de l'activation totale. L'engagement total correspond généralement au maximum de la taille du fichier de page, qui, lorsqu'il est géré par le système, correspond généralement à 2 à 3 fois la quantité de mémoire physique. Dans ton cas,


Un dernier point. Vous avez dit dans votre réponse que vous disposiez de 16 Go de RAM, alors que le Gestionnaire des tâches ne voit que 12 Go de RAM. Une des deux choses ici. Soit votre système n’a en réalité que 12 Go de RAM, soit l’un de vos bâtons n’est pas enregistré correctement. Si un bâton de bélier (je suppose 4 bâtons de 4 Go), il peut être mauvais, ne pas être correctement installé dans votre carte mère ou avoir un problème de détection de mémoire.

Pour vérifier s’il s’agit de la dernière, vous devez d’abord mettre à jour le BIOS de votre carte mère vers la dernière version. J'ai eu un problème similaire ... mes six bâtons de bélier DDR3 Tripple-Channel (6x 2 Go) étaient tous bons sur la base de tests individuels chacun ... mais ma carte mère a décidé au hasard de ne pas compter un ou deux d'entre eux de temps en temps, me laissant souvent avec seulement 8 Go de bélier. Une mise à jour du BIOS a corrigé le problème et j’ai maintenant un accès fiable à tous les 12 Go de ma mémoire.

Jrista
la source
intéressant..et je viens de remarquer que sa mémoire non paginée était très grande..mine est 539MB pagée, 139MB non paginée.Un sait clairement plus que moi à ce sujet .. Mais, vous vous trompez au total commit.U write "L'engagement total correspond généralement au maximum de la taille du fichier de la page" Ma RAM est de 12 Go.Je règle mon fichier d'échange à 4000 Mo (3,8 Go?) et 1,5 à 2 fois la mémoire, car mon maximum est de 15 Go (commit = 7) / 15 actuellement), mon fichier d'échange est d'environ 4 Go ou probablement un peu moins de 3,8 Go. Max Commit est plus proche de la taille du fichier d'échange + de la taille de la RAM. Lorsque mon fichier d'échange était de 12 Go, mon engagement maximal était d'environ 24 Go. Pagefile de près de 3,8 Go ou 4 Go maximum est de 15 Go
barlop
@barlop: Vous comprenez mal ce qu'est commit. Techniquement parlant, les frais de validation représentent la "totalité de l'espace mémoire virtuellement adressable", y compris l'espace pris en charge par les gestionnaires de mémoire étendus et la détection d'adresses étendues. Le commit maximal ne serait pas un fichier de page + RAM, mais plutôt un espace d'adressage virtuel total géré par le système. Le fichier de page doit généralement couvrir, à tout le moins, la taille de la mémoire physique totale et l’étendre au-delà de la taille de la mémoire physique totale. Dans votre cas, je m'attendais à ce que l'engagement soit d'au moins 18 Go (1,5 x) ou 24 Go (2x), mais ...
jeudi
... serait le cas pour un fichier de page géré par le système. Il semble que vous ayez modifié manuellement les paramètres de votre fichier de page. Dans ce cas, je devrais en savoir plus sur votre configuration spécifique pour vous expliquer pourquoi votre commit actuel est de 15 Go (un fichier de page de 3,8 / 4 Go indiquerait un commit de 16 Go, et non de 15 Go). .) Il est tout à fait possible de configurer manuellement aucun fichier de page, ou un fichier de page trop petit, ce qui peut entraîner des problèmes de performances et des problèmes d’allocation de mémoire. La meilleure recommandation, sauf si vous avez une configuration de serveur très spécifique (base de données), est de permettre à Windows de gérer son fichier d'échange.
jeudi
Une dernière note. Pour des performances maximales, il est préférable de laisser Windows allouer à l’avance la taille maximale du fichier de page. Cela se fait généralement sur des configurations de serveur, comme une base de données SQL Server, où vous pouvez préallouer 64 Go ou plus (généralement 2x la taille de la RAM physique, donc peut-être même 128 Go ou 256 Go) dans un fichier de page réparti uniformément entre plusieurs disques physiques pour des performances optimales. . Les fichiers de page distribués, en particulier lorsqu'ils sont préalloués à la taille maximale, permettent des lectures / écritures entrelacées sur tous les disques participants, permettant ainsi des performances de pagination améliorées via les E / S parallèles.
jeudi
Comme exemple de charge de mémoire importante, mon système utilise actuellement: 7,5 / 12 Go d’utilisation de la mémoire physique; 14.7 / 23.3Gb commit; Piscine paginée de 491mb; Piscine de 145 Mo np. Ceci concerne 146 processus, le pool paginé maximum 2276k le pool np maximal 263k. La plus grande taille de commit 696,396k, et pour le même processus WS est 714,256k (un processus de tabulation Opera.) (Le nombre élevé de processus est dû au navigateur Web ... ils isolent les onglets via un processus, et je suis un hypertabber. ... des dizaines ouvrent à la fois, donc des dizaines de processus supplémentaires.)
jeudi
12

Comment puis-je savoir pourquoi Windows utilise autant de RAM?

Il utilise tellement de RAM parce qu'il est conçu pour le faire. Il n'y a absolument aucun coût associé à l'utilisation de la RAM. En fait, la RAM utilisée est meilleure que la RAM libre car le système d’exploitation n’a rien à faire pour l’utiliser. Utiliser de la RAM libre nécessite de l'utiliser, ce qui demande un effort.

Si vous pensez "Je veux ma RAM libre maintenant pour pouvoir l'utiliser plus tard", oubliez ça. Il n'est pas nécessaire que la RAM soit libre maintenant pour l'utiliser plus tard. Vous pouvez l'utiliser maintenant et l' utiliser plus tard. Il n'y a pas de compromis ici - il n'y a absolument aucun inconvénient à utiliser la RAM.

La mémoire vive est utilisée et directement commutée d’une utilisation à l’autre sans avoir à passer par l’effort de la libérer, il suffit de la réutiliser. Les systèmes d'exploitation modernes ne libèrent de la RAM que lorsqu'ils n'ont pas d'autre choix.

David Schwartz
la source
12
Si mon système Windows7 utilise 3 Go de RAM au démarrage, sans application ouverte, il faut bien que quelque chose ne se passe pas comme prévu
Vader
5
@JebediahKerman Pourquoi dites-vous cela? Je me suis efforcé de vous expliquer pourquoi ce n’est pas le cas et pourquoi Windows est conçu pour le faire. Vous n'avez pas compris mon explication? Ou, si vous n'êtes pas d'accord, pourriez-vous expliquer où vous pensez que je me trompe?
David Schwartz
11
@ DavidSchwartz totalement faux réponse. Il a une fuite de mémoire par un pilote
magicandre1981
9
@DavidSchwartz: le comportement que vous décrivez (les allocations de RAM pouvant être réutilisées) doit obligatoirement être réalisé à partir de mémoire paginable. Le chiffre inquiétant est de 1,3 Go de mémoire non paginée. Vous ne pouvez pas simplement libérer cela pour d'autres ressources, où iraient ces 1,3 Gbits? Être "non paginé" signifie que son propriétaire a déclaré "ces octets sont si importants que vous ne pouvez même pas les mettre sur disque, et encore moins les supprimer".
MSalters
25
Pourquoi cette "réponse" est-elle votée si haut? Cela passe complètement à côté de l'essentiel. Indépendamment des mots spécifiques utilisés (qui étaient parfaitement clairs au début), la question n'est pas “Why is Windows using RAM?”, la question est “Why do the RAM usage numbers not add up; why is one part reporting a higher usage than another part?”Ce post doit être au mieux un commentaire car il n'aborde pas la question elle-même ni ne tente d'y répondre; il ne fait que donner un conseil, et un mauvais conseil car si le PO l'avait ignoré comme suggéré, la fuite de mémoire ne serait pas découverte.
Synetech
2

Une raison non mentionnée ci-dessus est Hyper-V.

J'ai pu l'identifier avec l'excellent utilitaire RamMap :

entrez la description de l'image ici

La capture d'écran est d'après. Avant la mémoire du «pilote verrouillé», elle dépassait 6 Go, soit plus de 80% de la mémoire vive de cette machine. Je devais entrer dans le gestionnaire Hyper-V et désactiver la "mémoire dynamique". Curieusement, même après la réactivation, la mémoire "Driver Locked" est restée faible - je ne peux que supposer que les instances antérieures l'ont augmentée et que Hyper-V ne réduit pas automatiquement la mémoire allouée:

entrez la description de l'image ici

Dagelf
la source