Partager via


Exercice 3 : Suivre l’empreinte du pilote et les allocations dynamiques pendant le démarrage

Pool est la ressource de mémoire pour les composants en mode noyau que le système d’exploitation et les pilotes de périphérique utilisent pour stocker leurs structures de données. Le pool a quatre zones d’allocation de base :

  1. Pool non paginé : Les allocations sont garanties pour résider dans la mémoire physique.

  2. Pool paginé : Allocations qui peuvent être paginées en mémoire dans le fichier de page.

  3. Pool non paginable NX : Allocations non paginées, qui ne sont pas exécutables.

  4. Pool de sessions : Allocations effectuées par session. Celles-ci sont paginables.

L’utilisation du pool est un contributeur important à l’utilisation globale de la mémoire sur un ordinateur : il s’agit du plus grand consommateur de mémoire immédiatement après le démarrage. Toute réduction de l’utilisation du pool réduit l’utilisation globale de la mémoire du système sur l’ensemble du système d’exploitation, la mémoire non paginable étant la catégorie de priorité la plus élevée pour les réductions (pour).

Dans cet exercice, vous allez examiner les allocations de pilotes Microsoft de boîte de réception et leur empreinte (au moment de l’initialisation) pendant le démarrage.

Étape 1 : Collecter une trace de mémoire de pool au cours d’une transition de démarrage

Dans cette étape, vous allez collecter une trace de démarrage à l’aide de l’enregistreur de performances Windows (WPR) qui contient des données de pool et de jeu de résidents.

  1. Ouvrez WPR à partir du menu Démarrer

  2. Sélectionnez les fournisseurs d’événements appropriés :

    1. Utilisation du pool

    2. Ensemble de résidents

    3. Triage de premier niveau

  3. Sélectionnez démarrage comme scénario de performances.

  4. Sélectionnez Fichier comme mode de journalisation.

  5. Définissez 1 comme nombre d’itérations.

  6. Cliquez sur Démarrer , puis sélectionnez un emplacement pour enregistrer le fichier ETL.

Le système redémarre automatiquement, collecte une trace et s’arrête une fois que le bureau devient visible.

Capture d’écran de la boîte de dialogue paramètres WPR.

Étape 2 : Examiner les données du pool à l’aide de WPA

Les données du pool sont exposées via le tableau récapitulatif du graphe de pool dans WPA. Les colonnes clés qui vous intéressent se trouvent dans le tableau suivant.

Vous pouvez ajouter ou supprimer des colonnes si vous cliquez avec le bouton droit sur les en-têtes de colonne.

Terminologie Description
Balise de pool Balise associée à une allocation de pool.
Module de balise de pool Module (pilote) associé à une balise de pool.
Pile Affiche le chemin du code sur un thread menant à une allocation de mémoire.
Bipé Indique si les allocations ont été placées dans un pool paginé ou dans un pool non paginé.
Type impactant Indique si une allocation contribue à l’utilisation de la mémoire à l’état stable ou s’il s’agit d’une allocation temporaire.
  1. Ouvrez la trace que vous avez capturée à l’étape 1 avec WPA.

  2. Ouvrez le menu Trace et sélectionnez Configurer le chemin des symboles.

    • Spécifiez le chemin du cache de symboles. Pour plus d’informations sur les symboles, consultez la page Prise en charge des symboles sur MSDN.
  3. Ouvrez le menu Trace et sélectionnez Charger les symboles.

  4. Recherchez le graphique pool dans la catégorie Mémoire du Explorer

  5. Faites glisser et déposez le graphique Pool sous l’onglet Analyse .

  6. Organisez la table pour afficher ces colonnes :

    1. Module de balise de pool

    2. Bipé

    3. Type impactant

    4. Pile

    5. Balise de pool

    6. Count

    7. Impact sur la taille et lataille

    **Remarque sur les balises de pool : **

    Si vous êtes développeur de pilotes, assurez-vous que les balises de pool utilisées par votre pilote sont claires et facilement identifiables pour faciliter l’analyse. Par exemple, si le nom de votre entreprise est Fabrikam, vous pouvez ajouter un préfixe « Fbk » à toutes les balises de pool : FbkPool1, FbkPool2, FbkBuffer, etc.

    Capture d’écran montrant à quoi doit ressembler la table WPA réorganisée.

  7. Désactiver toutes les séries sur le graphique (cliquez avec le bouton droit sur ->Désactiver ->In Entire Graph ->All Series)

    Capture d’écran de l’option de menu Désactiver dans WPA.

  8. Triez en impactant la taille en cliquant sur l’en-tête de colonne Taille impactante .

    Les pilotes qui ont l’utilisation la plus élevée de la mémoire à l’état stable s’affichent en haut.

Étape 3 : Intercepter les données d’allocation de pool

  1. Effectuez un zoom avant les 30 premières secondes du chronologie.

  2. Sélectionnez un pilote (par exemple, ACPI.sys, mais n’importe quel pilote le fera).

    1. Passez en revue la mémoire non paginé et développez la ligne.

      La mémoire non paginée doit être au centre de vos investigations, car elle ne peut pas être déplacée vers le fichier de page en cas de pression de la mémoire sur le système.

    2. Activez la légende pour les catégories Impacting et Transient .

      Capture d’écran des exemples de données montrant l’utilisation de la mémoire.

  3. Triez en affectant la taille en cliquant sur l’en-tête de colonne.

  4. L’impact sur la mémoire contribue directement à l’empreinte mémoire globale du pilote à tout moment. Dans l’exemple précédent, vous pouvez voir que ACPI.sys utilise une certaine mémoire non paginée à tout moment, et que cette utilisation de l’état stable augmente deux fois (d’abord lors du chargement du pilote, puis une deuxième fois à environ 3 secondes).

    1. Développez la pile et parcourez-la. En haut, vous devriez voir des appels de fonction qui mènent aux allocations de pool d’état stable les plus importantes.

    2. Dans l’exemple suivant, vous pouvez voir que ACPI.sys effectue un total de 255 allocations de pool, soit un total de 1,2 Mo sous la fonction ACPIInitStartACPI . C’est là que le développeur de pilotes doit se concentrer afin d’améliorer l’utilisation de la mémoire à l’état stable du pilote, car cette fonction compte pour la plupart des allocations de pilotes.

      Capture d’écran de l’exemple de table de données montrant l’utilisation de la mémoire par ACPI.sys avec des nœuds de processus extensibles

  5. Triez par Taille en cliquant sur l’en-tête de colonne.

  6. Effectuez la même chose pour la catégorie Temporaire . Développez la pile et parcourez-la. En haut, vous devriez voir des appels de fonction menant aux allocations de pool temporaires les plus importantes.

    • Dans l’exemple suivant, vous pouvez voir que le pic initial d’utilisation de la mémoire temporaire est principalement dû à l’exécution d’ACPI DPC d’appareils (ACPI.sys! ACPIBuildDeviceDpc). Le pic qui a introduit le code sous cet appel de fonction totalise 455 Ko.

      Capture d’écran d’un exemple de graphique de données montrant l’utilisation de la mémoire par ACPI.sys par peak outstanding size à l’aide de resource time as AllocTime, FreeTime (Agrégation : Sum)

Étape 4 : Mesurer l’empreinte du code du pilote

  1. Recherchez le graphique Ensemble résident dans la catégorie Mémoire de l’Explorer Graph.

  2. Faites glisser le graphique Ensemble de résidents sous l’onglet Analyse.

  3. Veillez à annuler le graphe (Ctrl+Maj+ »-« ).

  4. Sélectionnez la présélection graphique de page sauvegardée par fichier.

    Capture d’écran de l’option Page sauvegardée par fichier.

  5. Dans la colonne de l’arborescence de chemin d’accès, accédez au pilote que vous avez sélectionné à l’étape 3 (par exemple, ACPI.sys sous C:/Windows/drivers).

  6. Développez la catégorie Pilote et concentrez-vous sur les pages Actives .

    La valeur de la colonne Taille représente l’impact du code du pilote sur l’empreinte mémoire. Dans l’exemple suivant, il est de 0,48 Mo. Capture d’écran des exemples de données montrant des pages actives.