Übung 3: Nachverfolgen dynamischer Zuweisungen und des Treiberspeicherbedarfs während des Starts

Pool ist die Speicherressource für Kernelmoduskomponenten, die das Betriebssystem und Gerätetreiber zum Speichern ihrer Datenstrukturen verwenden. Ein Pool verfügt über vier grundlegende Speicherbelegungsbereiche:

  1. Nicht ausgelagerter Pool: Speicherbelegungen, die sich garantiert im physischen Speicher befinden.

  2. Ausgelagerter Pool: Speicherbelegungen, die aus dem Arbeitsspeicher in die Auslagerungsdatei verschoben werden können.

  3. NX Nicht auslagerbarer Pool: Nicht auslagerbare Speicherbelegungen, die nicht ausführbar sind.

  4. Sitzungspool: Speicherbelegungen pro Sitzung. Diese sind auslagerbar.

Die Poolnutzung trägt wesentlich zur gesamten Arbeitsspeicherauslastung eines Computers bei – sie ist der größte Verbraucher von Arbeitsspeicher unmittelbar nach dem Start. Jede Verringerung der Poolnutzung reduziert die allgemeine Speicherauslastung des Systems im gesamten Betriebssystem, wobei nicht auslagerbarer Speicher die höchste Priorität beim Erreichen einer Reduzierung hat.

In dieser Übung überprüfen Sie die Microsoft-Treiberzuweisungen und deren Speicherplatzbedarf (zum Zeitpunkt der Initialisierung) während des Startvorgangs.

Schritt 1: Erfassen einer Poolspeicherablaufverfolgung über einen Startvorgang

In diesem Schritt sammeln Sie mithilfe von Windows Performance Recorder (WPR) eine Startablaufverfolgung, die Daten zum Pool und Resident Set enthält.

  1. Öffnen Sie WPR über das Startmenü.

  2. Wählen Sie die richtigen Ereignisanbieter aus:

    1. Pool usage (Poolverwendung)

    2. Resident Set (Resident Set)

    3. First Level Triage (Triage der ersten Ebene)

  3. Wählen Sie boot (Start) als Performance scenario (Leistungsszenario) aus.

  4. Wählen Sie File (Datei) als Logging mode (Protokollierungsmodus) aus.

  5. Geben Sie als Number of Iterations (Anzahl der Wiederholungen) den Wert 1 an.

  6. Klicken Sie auf Start, und wählen Sie dann einen Speicherort für die ETL-Datei aus.

Das System startet automatisch neu, erfasst eine Ablaufverfolgung und stoppt, nachdem der Desktop sichtbar wird.

Screenshot des Dialogfelds mit WPR-Einstellungen.

Schritt 2: Überprüfen von Pooldaten mit WPA

Die Daten zum Pool werden über die Zusammenfassungstabelle Pool Graph in WPA verfügbar gemacht. Die wichtigsten Spalten, die von Interesse sind, befinden sich in der folgenden Tabelle.

Sie können Spalten hinzufügen oder entfernen, indem Sie mit der rechten Maustaste auf die Spaltenüberschriften klicken.

Begriff BESCHREIBUNG
Pool Tag Das Tag, das einer Poolzuordnung zugeordnet ist.
Pool Tag Module Das Modul (Treiber), das einem Pooltag zugeordnet ist.
Stapel Zeigt den Codepfad in einem Thread an, der zu einer Speicherzuweisung führt.
Paged Gibt an, ob die Speicherbelegungen in einem ausgelagerten Pool oder einen nicht ausgelagerten Pool erfolgten.
Impacting type Zeigt an, ob eine Speicherbelegung zu einer konstanten Arbeitsspeicherauslastung in stabilem Zustand beiträgt oder eine vorübergehende Speicherbelegung ist.
  1. Öffnen Sie die Ablaufverfolgung, die in Schritt 1 mit WPA erfasst wurde.

  2. Öffnen Sie das Menü Trace (Ablaufverfolgung), und wählen Sie Configure symbols path (Symbolpfad konfigurieren) aus.

    • Geben Sie den Pfad des Symbolcaches an. Weitere Informationen zu Symbolen finden Sie auf der Seite Symbolunterstützung auf MSDN.
  3. Öffnen Sie das Menü Trace (Ablaufverfolgung), und wählen Sie Load symbols (Symbole laden) aus.

  4. Suchen Sie das Diagramm Pool in der Kategorie Memory (Arbeitsspeicher) in Graph Explorer.

  5. Ziehen Sie das Diagramm Pool auf die Registerkarte Analysis (Analyse) und legen Sie es dort ab.

  6. Bearbeiten Sie die Tabelle so, dass diese Spalten angezeigt werden:

    1. Pool tag module

    2. Paged

    3. Impacting type

    4. Stapel

    5. Pool tag

    6. Count

    7. Impacting Size und Size

    **Hinweis zu Pool Tags: **

    Wenn Sie ein Treiberentwickler sind, stellen Sie sicher, dass die vom Treiber verwendeten Pool-Tags klar und einfach erkennbar sind, um die Analyse zu erleichtern. Wenn Ihre Firma beispielsweise Fabrikam heißt, können Sie allen Pool-Tags das Präfix „Fbk“ hinzufügen: FbkPool1, FbkPool2, FbkBuffer usw.

    Screenshot, der zeigt, wie die neu organisierten WPA-Tabelle aussehen sollte.

  7. Deaktivieren Sie alle Datenreihen im Diagramm (Rechtsklick –>Disable –>In Entire Graph –>All Series)

    Screenshot der Menüoption zum Deaktivieren in WPAWPA.

  8. Sortieren Sie nach der Auswirkungsgröße, indem Sie auf die Spaltenüberschrift Impacting Size kicken.

    Treiber, die über die höchste Speicherauslastung in stabilem Zustand verfügen, werden oben angezeigt.

Schritt 3: Abfangen von Poolspeicherbelegungsdaten

  1. Vergrößern Sie die ersten 30 Sekunden der Zeitachse.

  2. Wählen Sie einen Treiber aus (z. B. ACPI.sys oder irgendeinen anderen).

    1. Überprüfen Sie den nicht ausgelagerten Arbeitsspeicher (NonPaged), und erweitern Sie die Zeile.

      NonPaged Arbeitsspeicher sollte im Mittelpunkt Ihrer Untersuchungen stehen, da er nicht in die Auslagerungsdatei verschoben werden kann, wenn der Arbeitsspeicher im System knapp wird.

    2. Aktivieren Sie die Legende für die Kategorien Impacting (Auswirkung) und Transient (Vorübergehend).

      Screenshot der Beispieldaten mit Arbeitsspeicherauslastung.

  3. Sortieren Sie die Tabelle nach Auswirkungsgröße, indem Sie auf die Spaltenüberschrift Impacting Size klicken.

  4. Impacting Arbeitsspeicher trägt immer direkt zum Gesamtspeicherbedarf des Treibers bei. Im vorherigen Beispiel können Sie feststellen, dass ACPI.sys immer eine gewisse Menge an nicht ausgelagertem Arbeitsspeicher verwendet und dass die Nutzung im stabilen Zustand zweimal zunimmt (zum ersten Mal, wenn der Treiber geladen wird, dann ein zweites Mal nach ca. 3 Sekunden).

    1. Erweitern Sie den Stapel, und navigieren Sie durch ihn. Oben sollten Funktionsaufrufe angezeigt werden, die zu den größten Poolspeicherbelegungen in stabilem Zustand führen.

    2. Im folgenden Beispiel können Sie sehen, dass ACPI.sys insgesamt 255 Poolspeicherbelegungen vornimmt, die sich auf 1,2 MB im Rahmen der ACPIInitStartACPI-Funktion belaufen. Hierauf sollten sich Treiberentwickler konzentrieren, um die konstante Arbeitsspeichernutzung des Treibers zu verbessern, da diese Funktion für die meisten Treiberspeicherbelegungen verantwortlich ist.

      Screenshot der Beispieldatentabelle mit Speicherauslastung durch ACPI.sys mit erweiterbaren Prozessknoten

  5. Sortieren Sie die Liste nach Größe, indem Sie auf die Spaltenüberschrift Size klicken.

  6. Führen Sie den gleichen Schritt für die Kategorie Transient aus. Erweitern Sie den Stapel, und navigieren Sie durch ihn. Oben sollten Funktionsaufrufe angezeigt werden, die zu den größten vorübergehenden Poolzuweisungen führen.

    • Im folgenden Beispiel können Sie sehen, dass die anfängliche Spitze der vorübergehenden Arbeitsspeicherauslastung hauptsächlich dadurch verursacht wird, dass ACPI die DPCs von Geräten ausführt (ACPI.sys!ACPIBuildDeviceDpc). Die Spitze, die den Code unter dieser Funktion eingeführt hat, beläuft sich auf insgesamt 455 KB.

      Screenshot eines Beispieldatendiagramms, das die Speicherauslastung nach ACPI.sys nach „Peak Outstanding Size“ zeigt, wobei die Ressourcenzeit als AllocTime, FreeTime (Aggregation: Summe) verwendet wird

Schritt 4: Messen des Speicherbedarfs des Treibercodes

  1. Suchen Sie das Diagramm Resident Set in der Kategorie Memory (Arbeitsspeicher) in Graph Explorer.

  2. Ziehen Sie den Graph Resident Set per Drag & Drop auf die Registerkarte „Analysis“.

  3. Vergewissern Sie sich, dass Sie das Diagramm nicht vergrößert ist (STRG+UMSCHALT+"–").

  4. Wählen Sie die Diagrammvoreinstellung File Backed Page aus.

    Screenshot der Option „File Backed Page“.

  5. Navigieren Sie über die Spalte Path tree zu dem Treiber, den Sie in Schritt 3 ausgewählt haben (z. B. ACPI.sys unter C:/Windows/drivers).

  6. Erweitern Sie die Kategorie Driver (Treiber), und konzentrieren Sie sich auf die aktiven Seiten.

    Der Wert in der Spalte Size stellt dar, wie sich der Treibercode auf den Speicherbedarf auswirkt. Im folgenden Beispiel sind es 0,48 MB.Screenshot der Beispieldaten mit aktiven Seiten.