Partager via


Exemples PoolMon

Cette rubrique inclut les exemples suivants d’utilisation de PoolMon :

Exemple 1 : Afficher et trier la sortie poolMon

Exemple 2 : Afficher les noms des pilotes

Exemple 3 : Détecter les fuites de mémoire

Exemple 4 : Examiner une fuite de mémoire du pool

Exemple 5 : Surveiller une session Terminal Server

Exemple 1 : Afficher et trier la sortie poolMon

Cet exemple décrit différentes façons de configurer l’affichage PoolMon. Par défaut, PoolMon affiche toutes les allocations de mémoire du noyau dans l’ordre alphanumérique par valeur de balise. Vous pouvez modifier l’ordre de tri de l’affichage sur la ligne de commande ou pendant l’exécution de PoolMon.

La commande suivante démarre PoolMon :

poolmon

La commande suivante démarre PoolMon et trie l’affichage par nombre d’opérations gratuites :

poolmon /f

Pendant que poolmon est en cours d’exécution, vous pouvez utiliser les commandes d’exécution pour modifier l’affichage. Par exemple, pour trier l’affichage par nombre d’octets utilisés, appuyez sur b. Pour trier par octets par allocation, appuyez sur m.

La commande suivante démarre PoolMon et affiche uniquement les allocations du pool non paginé :

poolmon /p

Pendant que PoolMon est en cours d’exécution, appuyez sur p pour basculer entre les allocations du pool paginé, le pool non paginé ou les deux.

Pour démarrer PoolMon et afficher des données pour les allocations avec une balise particulière, utilisez le paramètre /i . La commande suivante affiche les allocations avec la balise AfdB (balise utilisée par afd.sys pour les mémoires tampons de données).

poolmon /iAfdB

Pour exclure les allocations avec une balise particulière, utilisez le paramètre /x . La commande suivante affiche toutes les allocations qui n’ont pas la balise AfdB ;

poolmon /xAfdB

Vous pouvez utiliser un astérisque (*) et/ou un point d’interrogation ( ?) pour spécifier un ensemble de balises avec les mêmes caractères. La commande suivante affiche les allocations dont les balises de pool commencent par Afd, la balise utilisée par afd.sys;

poolmon /iAfd*

Une commande de démarrage PoolMon peut inclure plusieurs paramètres /i et /x . La commande suivante affiche les allocations dont les balises commencent par Aud et les balises à quatre caractères commençant par Cc, à l’exception des allocations avec la balise CcBc ;

poolmon /iAud* /iCc?? /xCcBc

Vous pouvez également trier l’affichage PoolMon par la modification d’une valeur entre les mises à jour. Le paramètre /( place PoolMon en mode tri par modification.

La commande suivante affiche les allocations avec des balises commençant par Afd et trie par la modification des allocations. Il utilise le paramètre /a pour trier par nombre d’allocations et le paramètre /) pour trier par la modification du nombre d’allocations.

poolmon /iAfd* /( /a

Le paramètre /( et les touches des parenthèses sont des interrupteurs bascule. Lorsque PoolMon est en mode tri par modification, il interprète toutes les commandes de tri en tant que commandes pour trier par la modification de la valeur. Si vous appuyez à nouveau sur une touche de parenthèse, elle trie selon la valeur.

Exemple 2 : Afficher les noms des pilotes

Vous pouvez utiliser le paramètre PoolMon /g pour afficher les noms des composants Windows et les pilotes couramment utilisés qui attribuent chaque balise de pool. Si vous rencontrez un problème dans les allocations associées à une balise particulière, cette fonctionnalité vous aide à identifier le composant ou le pilote en cause.

Les composants et pilotes sont répertoriés dans la colonne Mapped_Driver, la colonne la plus à droite de l’affichage. Les données de la colonne Mapped_Driver proviennent de pooltag.txt, un fichier installé avec wdK.

La commande suivante affiche la mémoire allouée avec les balises commençant par NtF. (Il utilise le caractère de point d’interrogation ( ?) comme caractère générique.) Le paramètre /g ajoute la colonne Mapped_Driver.

poolmon /iNtF? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

Vous pouvez également copier le fichier pooltag.txt au même emplacement que poolmon. Cela permet cette utilisation.

poolmon /iNtF? /g

L’affichage résultant répertorie les allocations avec des balises commençant par NtF. La colonne la plus à droite de l’affichage, Mapped_Driver, indique que la mémoire a été allouée par ntfs.sys, le pilote pour le système de fichiers NTFS. Dans ce cas, l’affichage est encore plus spécifique, car pooltag.txt inclut les fichiers sources pour les allocations NTFS.

 Memory:  260620K Avail:   65152K  PageFlts:    85   InRam Krnl: 2116K P:19560K
 Commit: 237688K Limit: 640916K Peak: 260632K            Pool N: 8500K P:33024K
 System pool information
 Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

 NtFA Nonp       9112 (   0)      9112 (   0)     0       0 (     0)      0 [ntfs.sys  -  AttrSup.c]
 NtFB Paged      3996 (   0)      3986 (   0)    10  252088 (     0)  25208 [ntfs.sys  -  BitmpSup.c]
 NtFC Paged   1579279 (   0)   1579269 (   0)    10     640 (     0)     64 [ntfs.sys  -  Create.c]
 NtFD Nonp         13 (   0)        13 (   0)     0       0 (     0)      0 [ntfs.sys  -  DevioSup.c]
 NtFF Paged      1128 (   0)      1128 (   0)     0       0 (     0)      0 [ntfs.sys  -  FileInfo.c]
 NtFI Nonp        152 (   0)       152 (   0)     0       0 (     0)      0 [ntfs.sys  -  IndexSup.c]
 NtFL Nonp      68398 (   0)     68390 (   0)     8   27280 (     0)   3410 [ntfs.sys  -  LogSup.c]
 NtFS Paged      2915 (   0)      2614 (   0)   301   80192 (     0)    266 [ntfs.sys  -  SecurSup.c]
 NtFa Paged       838 (   0)       829 (   0)     9     288 (     0)     32 [ntfs.sys  -  AllocSup.c]
 NtFd Paged    137696 (   0)    137688 (   0)     8     720 (     0)     90 [ntfs.sys  -  DirCtrl.c]
 NtFf Nonp          2 (   0)         1 (   0)     1      40 (     0)     40 [ntfs.sys  -  FsCtrl.c]
 NtFs Nonp      48825 (   0)     47226 (   0)  1599   64536 (     0)     40 [ntfs.sys  -  StrucSup.c]
 NtFv Paged       551 (   0)       551 (   0)     0       0 (     0)      0 [ntfs.sys  -  ViewSup.c]

Pooltag.txt est vaste, mais il ne s’agit pas d’une liste complète de toutes les balises utilisées dans Windows. Lorsqu’une balise qui apparaît dans l’affichage n’est pas incluse dans pooltag.txt, PoolMon affiche « Pilote inconnu » dans la colonne Mapped_Driver de la balise.

Les exemples suivants illustrent cette méthode sur un système 32 bits.

La commande suivante utilise le paramètre /i pour répertorier les allocations avec des balises qui se terminent par MEM. Le paramètre /g ajoute le nom du pilote à l’affichage à partir du fichier pooltag.txt.

poolmon /i?MEM /g

L’affichage obtenu répertorie les allocations avec des balises se terminant par MEM. Toutefois, étant donné que les balises MEM ne sont pas incluses dans pooltag.txt, « Pilote inconnu » apparaît dans la colonne Mapped_Driver à la place du nom du pilote.

 Tag  Type        Allocs          Frees      Diff   Bytes      Per Alloc    Mapped_Driver

 1MEM Nonp       1 (   0)         0 (   0)     1    3344 (     0)   3344   Unknown Driver
 2MEM Nonp       1 (   0)         0 (   0)     1    3944 (     0)   3944   Unknown Driver
 3MEM Nonp       3 (   0)         0 (   0)     3     248 (     0)     82   Unknown Driver

La commande suivante démarre PoolMon. Il utilise le paramètre /i pour répertorier les allocations avec des balises se terminant par MEM.

poolmon /i?MEM 

La commande suivante répertorie les allocations pour les balises commençant par Ip. Il utilise le paramètre /g , qui utilise le contenu du fichier pooltag.txt dans la colonne Mapped_Driver.

poolmon /iIp* /g

Dans l’affichage obtenu, la colonne Mapped_Driver contient des données des fichiers pooltag.txt.

 Memory:  130616K Avail:   23692K  PageFlts:   146   InRam Krnl: 2108K P: 9532K
 Commit: 187940K Limit: 318628K Peak: 192000K            Pool N: 8372K P:13384K
 System pool information
 Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

 IpEQ Nonp          1 (   0)         0 (   0)        1    1808 (     0)   1808 [ipsec][ipsec.sys    -  event queue]
 IpFI Nonp         26 (   0)         0 (   0)       26    7408 (     0)    284 [ipsec][ipsec.sys    -  Filter blocks]
 IpHP Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec.sys    - IP Security]
 IpIO Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec]
 IpLA Nonp          1 (   0)         0 (   0)        1     248 (     0)    248 [ipsec][ipsec.sys    -  lookaside lists]
 IpSH Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec.sys    - IP Security]
 IpSI Nonp       1027 (   0)         0 (   0)     1027   53272 (     0)     51 [ipsec][ipsec.sys    - initial allcoations]
 IpTI Nonp          3 (   0)         0 (   0)        3    5400 (     0)   1800 [ipsec][ipsec.sys    -  timers]

Exemple 3 : Détecter les fuites de mémoire

Cet exemple suggère une procédure d’utilisation de PoolMon pour détecter une fuite de mémoire.

  1. Démarrez PoolMon avec les paramètres /p /p (afficher uniquement les allocations du pool paginé) et /b (triez en fonction du nombre d’octets).

    poolmon /p /p /b
    
  2. Laissez PoolMon s’exécuter pendant quelques heures. Étant donné que le démarrage de PoolMon modifie les données, il doit retrouver un état stable avant que les données ne soient fiables.

  3. Enregistrez les informations générées par PoolMon, sous la forme d’une capture d’écran ou en la copiant à partir de la fenêtre de commande et en la collant dans le Bloc-notes.

  4. Revenez à PoolMon, appuyez deux fois sur la touche p pour afficher uniquement les allocations du pool non paginé.

  5. Répétez les étapes 3 et 4 environ toutes les demi-heures pendant au moins deux heures, en alternant à chaque fois entre les affichages du pool paginé et du pool non paginé.

  6. Une fois la collecte de données terminée, examinez les valeurs Diff (opérations d’allocation moins les opérations gratuites) et Octets (nombre d’octets alloués moins le nombre d’octets libérés) pour chaque balise, et notez tout ce qui augmente continuellement.

  7. Ensuite, arrêtez PoolMon, attendez quelques heures, puis redémarrez PoolMon.

  8. Examinez les allocations qui ont augmenté et déterminez si les octets sont maintenant libérés. La cause probable réside dans les allocations qui n'ont pas encore été libérées ou qui ont continué à augmenter.

Exemple 4 : Examiner une fuite de mémoire du pool

L’exemple suivant illustre l’utilisation de PoolMon pour examiner une fuite de mémoire de pool liée à un pilote d'imprimante suspecté. Dans cet exemple, PoolMon affiche les données que Windows collecte sur les allocations de mémoire avec la balise Dsrd.

Certains pilotes d’imprimante attribuent la balise Drsd lorsqu’ils allouent des objets GDI (Graphics Device Interface) et de la mémoire associée. Si un pilote d’imprimante a une fuite d’objet, alors la mémoire allouée avec la balise Drsd fuit également.

Note Avant d’exécuter les étapes de cet exemple, vérifiez que l’imprimante que vous utilisez n’est pas interrompue tant que vous n’avez pas terminé. Sinon, les résultats peuvent ne pas être valides.

Dans la ligne de commande, tapez ce qui suit :

poolmon /iDrsd

Cette commande indique à PoolMon d’afficher des informations pour les allocations avec le tag Drsd. (Les balises de pool sont sensibles à la casse. Veillez donc à taper la commande exactement comme indiqué.)

Enregistrez les valeurs dans les colonnes Diff et Octets. Dans l’exemple d’affichage suivant, la valeur de Diff est 21 et le nombre d’octets est 17472.

Memory:  130480K Avail:   91856K  PageFlts:  1220   InRam Krnl: 2484K P: 7988K
Commit:  30104K Limit: 248432K Peak:  34028K            Pool N: 2224K P: 8004K
Tag  Type        Allocs           Frees           Diff  Bytes           Per Alloc

Drsd Paged       560 ( 177)       539 ( 171)       21   17472 (  4992)    832 

Envoyez un travail à l’imprimante, attendez brièvement que Windows retourne à la normale, puis enregistrez les valeurs des colonnes Diff et Octets.

Memory:  130480K Avail:   91808K  PageFlts:  1240   InRam Krnl: 2488K P: 7996K
Commit:  30152K Limit: 248432K Peak:  34052K            Pool N: 2224K P: 8012K
Tag  Type        Allocs           Frees           Diff  Bytes          Per Alloc

Drsd Paged       737 (   0)       710 (   0)       27   22464 (     0)    832  

Lorsque la gestion de la mémoire du pilote d’imprimante fonctionne correctement, la valeur de Diff doit revenir à sa valeur d’origine 21 après l’impression. Toutefois, comme l’illustre la sortie précédente, la valeur de Diff a augmenté à 27 et le nombre d’octets a augmenté à 22464. La différence entre la sortie initiale et la suivante implique que six blocs Drsd, totalisant 4992 octets, ont fui pendant l'impression.

Pour plus d’informations

Si vous pensez avoir identifié un pilote qui fuite, accédez au site web du support Microsoft et recherchez des articles pertinents dans la Base de connaissances, ou contactez le fournisseur s’il s’agit d’un pilote tiers.

Exemple 5 : Surveiller une session Terminal Server

Cet exemple montre plusieurs façons d’afficher les allocations à partir des pools de sessions Terminal Services. Il illustre l’utilisation du paramètre de ligne de commande /s , ainsi que les paramètres S, TSSessionID et i en cours d’exécution.

La commande suivante affiche les allocations de tous les pools de sessions Terminal Services. Dans cet exemple, l’ordinateur local, configuré en tant que serveur Terminal Server, héberge les sessions et les ordinateurs clients utilisent la fonctionnalité Bureau à distance pour se connecter à l’hôte.

poolmon /s

En réponse, PoolMon affiche les allocations de tous les pools de sessions. Notez le titre « Informations sur tous les pools de sessions » dans l’en-tête.

Memory:  523572K Avail:  233036K  PageFlts:   344   InRam Krnl: 1828K P:18380K
Commit: 193632K Limit:1279764K Peak: 987356K            Pool N:14332K P:18644K
All sessions pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc

 Bmfd Paged       361 (   0)       336 (   0)       25   57832 (     0)   2313
 DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60
 Dddp Paged         8 (   0)         6 (   0)        2     272 (     0)    136
 Dh 1 Paged        24 (   0)        24 (   0)        0       0 (     0)      0
 Dh 2 Paged       344 (   0)       344 (   0)        0       0 (     0)      0
 Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 GDev Paged       108 (   0)       102 (   0)        6   20272 (     0)   3378
 GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80
 GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272
 GTmp Paged     88876 (   1)     88876 (   1)        0       0 (     0)      0
 GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0
 Gbaf Paged      9829 (   0)      9801 (   0)       28   19712 (     0)    704
 Gcac Paged      3761 (   0)      3706 (   0)       55  288968 (     0)   5253
 Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488
 Gdbr Paged      6277 (   0)      6271 (   0)        6    1872 (     0)    312
 ...

Pour afficher les allocations à partir d’un pool de sessions particulier, tapez l’ID de session immédiatement après le paramètre /s , comme indiqué dans la commande suivante. Cette commande affiche les allocations de pool de sessions pour la session Terminal Services 0.

poolmon /s0

En réponse, PoolMon affiche les allocations du pool de sessions pour la session Terminal Services 0. Notez le titre « Informations du pool session 0 » dans l’en-tête.

Memory:  523572K Avail:  233024K  PageFlts:   525   InRam Krnl: 1828K P:18384K
 Commit: 193760K Limit:1279764K Peak: 987356K            Pool N:14340K P:18644K
 Session 0 pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc

 Bmfd Paged       361 (   0)       336 (   0)       25   57832 (     0)   2313
 DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60
 Dddp Paged         8 (   0)         6 (   0)        2     272 (     0)    136
 Dh 1 Paged        24 (   0)        24 (   0)        0       0 (     0)      0
 Dh 2 Paged       344 (   0)       344 (   0)        0       0 (     0)      0
 Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 GDev Paged       108 (   0)       102 (   0)        6   20272 (     0)   3378
 GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80
 GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272
 GTmp Paged     89079 (  99)     89079 (  99)        0       0 (     0)      0
 GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0
 Gbaf Paged      9830 (   0)      9802 (   0)       28   19712 (     0)    704
 Gcac Paged      3762 (   0)      3707 (   0)       55  283632 (     0)   5156
 Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488
 Gdbr Paged      6280 (   0)      6274 (   0)        6    1872 (     0)    312
 ...

Pour déterminer quels pilotes et composants allouent de la mémoire à partir du pool de sessions, ajoutez le paramètre /g , comme indiqué dans la commande suivante. Le paramètre /g ajoute une colonne Mapped_Driver répertoriant les composants et pilotes Windows qui attribuent chaque balise.

poolmon /s0 /g

Memory:  523572K Avail:  235876K  PageFlts:    43   InRam Krnl: 1900K P:18860K
Commit: 185040K Limit:1279764K Peak: 987356K            Pool N:14684K P:19124K
Session 0 pool information
Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

Bmfd Paged       421 (   0)       396 (   0)       25   57832 (     0)   2313 [Font related stuff]
DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60 Unknown Driver
Dddp Paged        11 (   0)         6 (   0)        5     392 (     0)     78 Unknown Driver
Dh 1 Paged        37 (   0)        35 (   0)        2     224 (     0)    112 Unknown Driver
Dh 2 Paged       367 (   0)       364 (   0)        3     912 (     0)    304 Unknown Driver
Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0 [vga for risc video driver]
GDev Paged       119 (   0)       113 (   0)        6   20272 (     0)   3378 [Gdi pdev]
GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80 [Gdi engine descriptor list]
GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272 [Gdi Objects]
GTmp Paged     98626 (   1)     98626 (   1)        0       0 (     0)      0 [Gdi Objects]
GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0 [Gdi Objects]
Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0 [Gdi Objects]
Gbaf Paged     10331 (   0)     10305 (   0)       26   18304 (     0)    704 [Gdi Objects]
Gcac Paged      4722 (   0)      4666 (   0)       56  305400 (     0)   5453 [Gdi glyph cache]
Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488 [Gdi string resource script names]
Gdbr Paged      6972 (   0)      6965 (   0)        7    2184 (     0)    312 [Gdi driver brush realization]

Vous pouvez également configurer l’affichage du pool de sessions Terminal Services pendant l’exécution de PoolMon. Le tableau suivant présente une série de commandes en cours d’exécution, dans l’ordre dans lequel elles sont tapées et l’affichage PoolMon résultant.

La série commence par une commande pour démarrer PoolMon. Tous les autres paramètres sont tapés pendant l’exécution de PoolMon.

poolmon
Clé Résultat Descriptif

s

Affiche tous les pools de sessions.

s

Affiche les pools système.

Le paramètre s bascule l’affichage entre les pools système et les pools de sessions Terminal Services.

0

Affiche le pool de sessions 0.

Vous pouvez taper un ID de session lors de l’affichage des pools système.

7

Affiche le pool de session 7.

un

Affiche les allocations de pool pour la session 7, triées par nombre d’allocations.

Tous les paramètres d’exécution standard sont valides pour les affichages du pool de sessions.

0

Affiche les allocations pour la session 0, triées par nombre d’allocations.

Les options de session et de tri sont conservées jusqu’à ce qu’elles soient modifiées.

s

Affiche les pools système.

s

Affiche les allocations pour la session 0, triées par nombre d’allocations.

L’option de session est conservée.

10ENTER

Affiche les allocations de session 1, puis affiche les allocations de session 0.

Sans i, vous ne pouvez entrer que les ID de session 0 à 9.

i

Invite à saisir un identifiant de session Terminal Server.

10

Affiche les allocations de session 10.

i

Invite à entrer un ID de session Terminal Server.

Pour afficher tous les pools de sessions, appuyez sur i , puis appuyez sur Entrée.

ENTRÉE

Affiche tous les pools de sessions.

Seuls les systèmes configurés en tant que serveur Terminal Server allouent de la mémoire à partir du pool de sessions. Si vous utilisez PoolMon pour afficher le pool de sessions sur un ordinateur qui n’est pas un serveur Terminal Server ou si vous tapez un ID de session qui n’existe pas sur Windows, PoolMon n’affiche aucune allocation. Au lieu de cela, il affiche uniquement les en-têtes avec des données de mémoire générales.

La commande suivante affiche les allocations de tous les pools de sessions Terminal Services :

poolmon /s

La figure suivante montre l’affichage PoolMon qui entraînerait l’envoi de la commande /s à un ordinateur exécutant Windows XP qui n’a pas pu être configuré en tant que serveur Terminal Server :

 Memory:  260620K Avail:   44956K  PageFlts:   308   InRam Krnl: 2744K P:20444K
 Commit: 185452K Limit: 640872K Peak: 192472K            Pool N: 8112K P:20648K
 All sessions pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc