Comment déterminer quelle application perd de la mémoire non paginée?


8

Nous avons récemment rencontré un problème sur notre serveur en direct qui a empêché notre application Web de répondre. Tout ce que nous obtenions, c'était 503 erreurs jusqu'à ce que nous redémarrions le serveur, alors ça allait. Finalement, je l'ai retracé dans le httperr.log et j'ai trouvé beaucoup d'erreurs 1_Connections_Refused.

Une enquête plus approfondie a semblé indiquer que nous avions atteint la limite du pool non paginé. Depuis lors, nous surveillons la mémoire du pool non paginé à l'aide de Poolmon.exe et nous pensons avoir identifié la balise à l'origine du problème.

Tag   Type    Allocs       Frees       Diff       Bytes      Per Alloc
Even  Nonp  51,231,806   50,633,533   684,922   32,878,688      48

Si nous utilisons poolmon.exe / g, il affiche le pilote mappé comme [<inconnu> objets d'événement].

Ce n'est pratiquement pas du tout utile. Mon équipe a passé beaucoup de temps à rechercher ce problème et n'a pas été en mesure de trouver un processus pour le réduire à une application ou un service spécifique. J'ai l'impression que la plupart des gens semblent résoudre le problème en tuant les processus sur la machine jusqu'à ce qu'ils voient la mémoire non paginée réinitialisée. Ce n'est pas exactement ce que vous voulez voir lorsque vous travaillez sur une machine de production.

Si j'ouvre le Gestionnaire des tâches et affiche la liste des processus. Je vois MailService.exe avec une valeur de pool NP de 105 Ko, c'est 36 Ko de plus que la valeur du processus indiqué en deuxième. Comme nous avons eu quelques problèmes avec notre serveur de messagerie dans le passé (qui peuvent ou non être liés à ce problème), mon instinct est que cela est à l'origine du problème.

Cependant, avant de quitter le redémarrage des services, j'aimerais avoir un peu plus de certitude qu'un simple «sentiment d'intestin».

J'ai également essayé d'utiliser poolmon.exe / c mais cela renvoie toujours l'erreur:

unable to load msvcr70.dll/msvcp70.dll

et il ne crée pas localtag.txt. Mon collègue a dû télécharger pooltag.txt depuis Internet car nous ne pouvons pas déterminer où il se trouve. Nous n'avons pas de débogueur win ou le DDK win installé (que je peux voir). Peut-être que l'erreur ci-dessus est donnée parce que nous n'avons installé aucun de ceux-ci - mais je ne sais pas.

Enfin j'ai essayé:

C:\windows\system32\driver\findstr /m /l Even *.sys

Cela a renvoyé une liste assez importante de fichiers .sys et encore une fois n'a pas été du tout utile avec le problème à portée de main.

Ma question est donc la suivante: existe-t-il un autre moyen de réduire la cause de cette fuite de mémoire?

MISE À JOUR:

Comme suggéré ci-dessous, j'enregistre les octets non paginés du pool depuis environ un jour pour voir si un processus a tendance à augmenter. Pour la plupart, tous les processus semblent être relativement statiques dans leur utilisation. Deux d'entre eux semblent avoir légèrement augmenté. Je continuerai de surveiller cela pendant les prochains jours.

J'ai également oublié de mentionner plus tôt qu'aucun des processus ne semble utiliser un nombre excessif de poignées non plus.

MISE À JOUR 2:

Je surveille cela depuis quelques semaines. Le pool d'octets non paginés pour les processus individuels et le pool total d'octets non paginés sont restés relativement stables pendant cette période. Pendant ce temps, Windows a été mis à jour et le serveur a redémarré, donc je me demande si cela a résolu le problème. Je ne vois certainement pas la croissance constante du pool d'octets non paginés maintenant que j'étais avant cela.


Pourquoi ne pas utiliser perfmon pour surveiller les octets non paginés du pool pour tous les processus et rechercher le processus avec une mémoire de pool non paginée incontrôlable?
joeqwerty

Je viens de jouer un peu avec l'Analyseur de performances et de le configurer pour faire ce que vous avez suggéré. Cependant, cela ne me dit pas vraiment quelque chose que je ne savais pas déjà en regardant le Gestionnaire des tâches. MailService a l'utilisation la plus élevée du pool non paginé, mais il n'est qu'à 106 Ko. Ce n'est donc pas exactement le pistolet fumant que je cherchais.
Développeur

Recherchez l'augmentation des octets non paginés du pool dans les processus au fil du temps. Il peut ne pas être facilement apparent en prenant un aperçu rapide de l'utilisation par processus à un moment donné. Vous pouvez facilement capturer l'utilisation au fil du temps en configurant un journal de compteur pour l'enregistrer dans un fichier CSV et l'ouvrir avec Excel pour analyser l'escalade de l'utilisation par processus. Tout processus qui présente une augmentation de 10% ou plus des octets non paginés du pool au démarrage du système perd de la mémoire et est probablement le processus à l'origine du problème
joeqwerty

Un outil pratique pour aider à capturer et analyser les données de compteur pertinentes est l'outil PAL, disponible ici: pal.codeplex.com/releases/view/51623#ReviewsAnchor . Il s'agit d'une version plus récente que celle que j'ai utilisée, mais il existe une version x86 et il semble qu'elle puisse être utilisée sur W2K3.
joeqwerty

J'ai configuré un fichier journal pour enregistrer les octets de pool NP. Poolmon dit maintenant que mon utilisation de mémoire non paginée est de 68 Mo. Il a augmenté d'environ 2 à 3 Mo au cours des quelques heures que j'ai essayé de comprendre. Mais il n'y a pas de croissance correspondante (que je peux voir) dans les valeurs NP pour les processus. En fait, les valeurs NP Pool par rapport aux processus individuels sont loin de ce nombre. Même si j'additionne toutes les valeurs de pool np répertoriées, le total serait chanceux d'être 1 Mo et non 68 Mo. Mais peut-être que je manque quelque chose ici.
Développeur

Réponses:


6

Je surveille cela depuis environ 6-7 semaines maintenant et je peux enfin donner une réponse définitive au problème.

Premièrement, les octets non paginés pour les processus individuels ne m'ont vraiment rien dit d'utile car ils semblaient tous assez statiques dans leur utilisation. Il y avait des pointes mais l'utilisation revenait toujours à la ligne de base par la suite.

Le total de mémoire d'octets non paginés était également statique pendant un certain temps, mais a ensuite commencé à augmenter progressivement puis à augmenter. Après un pic, environ la moitié de la mémoire a été libérée, puis elle est restée à nouveau statique (au niveau supérieur) pendant un certain temps jusqu'à ce que le motif se répète. En regardant le graphique, j'ai remarqué que ces pointes semblaient être assez régulièrement espacées et il se trouve qu'elles se produisaient à 2 semaines d'intervalle et toujours un dimanche.

La question suivante était donc la suivante: que se passe-t-il le dimanche toutes les deux semaines? Je suis allé voir l'Observateur d'événements et chaque fois qu'un pic s'est produit, McAfee était en cours d'exécution . Je pense également qu'en nous connectant fréquemment au serveur pour surveiller le problème, nous avons aggravé le problème par inadvertance, car McAfee a un scanner en temps réel et je pense que cela provoquait les augmentations plus faibles que nous observions.

Je pense que les analyses planifiées expliquent également pourquoi nous avons vu les augmentations de la mémoire NP attachées à la balise Object Events dans PoolMon au lieu de la balise McAfee spécifique. C'était la principale chose qui nous a vraiment conduit sur le chemin du jardin.

Maintenant que nous savons enfin ce qui cause les fuites, nous pouvons y remédier. C'est incroyable qu'il ait fallu si longtemps pour le retrouver.

MISE À JOUR : Juste comme une note finale. McAfee a été mis à jour le week-end et cela a complètement résolu notre problème de mémoire non paginée.

MISE À JOUR 2 : Puisque je viens d'obtenir un vote pour cela, je vais ajouter une nouvelle mise à jour à cela. Initialement, la mise à jour de McAfee a semblé résoudre notre problème, c'est-à-dire que nous ne voyons plus les pics massifs de la mémoire NP à intervalles réguliers. J'ai également remarqué que depuis la mise à jour, il semble que McAfee n'écrit plus de journaux dans l'Observateur d'événements par défaut maintenant, qui se cache lorsqu'il analyse activement.

Mais nous constatons toujours une augmentation progressive de l'utilisation de la mémoire NP. C'est arrivé au point où nous devons maintenant redémarrer notre serveur toutes les 2 semaines environ. C'est tellement mauvais que nous avons récemment acquis un nouveau serveur dans l'espoir que le matériel et les logiciels mis à jour feront disparaître ce problème MAIS notre tout nouveau serveur avec uniquement Windows Server 2008, SQL Server 2008 R2, et McAfee installé montrait TOUJOURS une fuite de mémoire NP . Ce n'est qu'après avoir complètement supprimé McAfee que la fuite s'est arrêtée et elle est restée statique même après avoir configuré le serveur avec tous nos logiciels en préparation pour y basculer.

J'ai lu depuis, et je ne sais pas si c'est vrai, que le problème n'est pas avec McAfee, mais avec certaines routines Windows que McAfee utilise et qui provoquent des fuites de mémoire NP. Apparemment, l'activité réseau est à l'origine de la fuite, c'est-à-dire plus d'activité réseau => des fuites plus importantes. Cela semble cohérent avec notre expérience, dans la mesure où la fuite s'est aggravée à mesure que notre serveur est devenu plus occupé.

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.