Condividi tramite


Esercizio 3 - Tenere traccia del footprint dei driver e allocazioni dinamiche durante l'avvio

Il pool è la risorsa di memoria per i componenti in modalità kernel usati dal sistema operativo e dai driver di dispositivo per archiviare le relative strutture di dati. Il pool ha quattro aree di allocazione di base:

  1. Pool non di paging: Le allocazioni hanno la garanzia di risiedere nella memoria fisica.

  2. Pool di paging: Allocazioni di cui è possibile eseguire il paging nella memoria nel file di pagina.

  3. Pool non pageable NX: Allocazioni non di paging, che non sono eseguibili.

  4. Pool di sessioni: Allocazioni effettuate per sessione. Sono disponibili per la pagina.

L'utilizzo del pool è un collaboratore significativo all'utilizzo complessivo della memoria in un computer, ovvero il consumer di memoria più grande immediatamente dopo l'avvio. Qualsiasi riduzione dell'utilizzo del pool riduce l'utilizzo complessivo della memoria del sistema nel sistema operativo, con memoria non di paging che rappresenta la categoria con priorità più alta per ridurre le prestazioni (per).

In questo esercizio verranno esaminate le allocazioni dei driver Microsoft nella posta in arrivo e il relativo footprint (al momento dell'inizializzazione) durante l'avvio.

Passaggio 1: Raccogliere una traccia di memoria del pool in una transizione di avvio

In questo passaggio si raccoglierà una traccia di avvio usando Windows Performance Recorder (WPR) che contiene i dati del pool e del set residente.

  1. Aprire WPR dal menu Start

  2. Selezionare i provider di eventi corretti:

    1. Utilizzo del pool

    2. Set residente

    3. Valutazione di primo livello

  3. Selezionare Boot come scenario di prestazioni.

  4. Selezionare File come modalità di registrazione.

  5. Impostare 1 come Numero di iterazioni.

  6. Fare clic su Start e quindi selezionare un percorso per salvare il file ETL.

Il sistema viene riavviato automaticamente, raccoglie una traccia e si arresta dopo che il desktop diventa visibile.

Screenshot nella finestra di dialogo delle impostazioni WPR.

Passaggio 2: Esaminare i dati del pool con WPA

I dati del pool vengono esposti tramite la tabella di riepilogo di Pool Graph in WPA. Nella tabella seguente sono riportate le colonne chiave di interesse.

È possibile aggiungere o rimuovere colonne facendo clic con il pulsante destro del mouse sulle intestazioni di colonna.

Terminologia Descrizione
Pool Tag Tag associato a un'allocazione del pool.
Modulo tag pool Modulo (driver) associato a un tag del pool.
Stack Mostra il percorso del codice in un thread che conduce a un'allocazione di memoria.
Paging Indica se le allocazioni sono state inserite in un pool di paging o in un pool non di paging.
Tipo di impatto Indica se un'allocazione contribuisce all'utilizzo della memoria a stato stabile o è un'allocazione temporanea.
  1. Aprire la traccia acquisita nel passaggio 1 con WPA.

  2. Aprire il menu Traccia e selezionare Configura percorso simboli.

    • Specificare il percorso della cache dei simboli. Per altre informazioni sui simboli, vedere la pagina Supporto simboli su MSDN.
  3. Aprire il menu Traccia e selezionare Carica simboli.

  4. Trovare il grafico Pool nella categoria Memoria di Graph Explorer

  5. Trascinare e rilasciare il grafico Pool nella scheda Analisi .

  6. Organizzare la tabella per visualizzare le colonne seguenti:

    1. Modulo tag pool

    2. Paging

    3. Tipo di impatto

    4. Tra elementi sovrapposti

    5. Tag del pool

    6. Numero

    7. Impatto su dimensioni e dimensioni

    **Nota sui tag del pool: **

    Se si è uno sviluppatore di driver, assicurarsi che i tag del pool usati dal driver siano chiari e facilmente identificabili per facilitare l'analisi. Ad esempio, se il nome della società è Fabrikam, è possibile aggiungere un prefisso "Fbk" a tutti i tag del pool: FbkPool1, FbkPool2, FbkBuffer e così via.

    Screenshot che mostra l'aspetto della tabella WPA riorganizzata.

  7. Disabilitare tutte le serie nel grafico (fare clic con il pulsante destro del mouse su ->Disable ->In Entire Graph ->All Series)

    Screenshot dell'opzione di menu Disabilita in WPA.

  8. Ordinare in base alle dimensioni, facendo clic sull'intestazione di colonna Impatto dimensioni .

    I driver con l'utilizzo della memoria a stato stabile più elevato vengono visualizzati nella parte superiore.

Passaggio 3: Intercettare i dati di allocazione del pool

  1. Ingrandire i primi 30 secondi della sequenza temporale.

  2. Selezionare un driver (ad esempio, ACPI.sys, ma qualsiasi operazione).

    1. Esaminare la memoria NonPaged ed espandere la riga.

      La memoria nonPaged deve essere l'obiettivo delle indagini perché non può essere spostata nel file di paging quando si verifica un utilizzo elevato della memoria nel sistema.

    2. Abilitare la legenda per le categorie impatto e temporanee.

      Screenshot dei dati di esempio che mostrano l'utilizzo della memoria.

  3. Ordinare in base all'impatto sulle dimensioni facendo clic sull'intestazione di colonna.

  4. L'impatto diretto della memoria contribuisce al footprint di memoria complessivo del driver in qualsiasi momento. Nell'esempio precedente è possibile indicare che ACPI.sys usa sempre una memoria non di paging e che questo utilizzo dello stato costante aumenta due volte (prima quando il driver viene caricato, quindi una seconda volta in circa 3 secondi).

    1. Espandere lo stack e spostarsi all'interno. Nella parte superiore dovrebbero essere visualizzate chiamate di funzione che portano alle allocazioni di pool di stati stabili più grandi.

    2. Nell'esempio seguente è possibile notare che ACPI.sys effettua un totale di 255 allocazioni di pool, totali di 1,2 MB nella funzione ACPIInitStartACPI . Questo è il punto in cui lo sviluppatore del driver deve concentrarsi per migliorare l'utilizzo della memoria dello stato stabile del driver, in quanto questa funzione rappresenta la maggior parte delle allocazioni dei driver.

      Screenshot della tabella dei dati di esempio che mostra l'utilizzo della memoria per ACPI.sys con nodi di processo espandibili

  5. Ordinare in base alle dimensioni facendo clic sull'intestazione di colonna.

  6. Eseguire la stessa operazione per la categoria Temporanea . Espandere lo stack e spostarsi all'interno. Nella parte superiore dovrebbero essere visualizzate le chiamate di funzione che portano alle allocazioni di pool temporanei più grandi.

    • Nell'esempio seguente è possibile osservare il picco iniziale dell'utilizzo temporaneo della memoria causato principalmente dall'acpi che esegue i CONTROLLER di dominio dei dispositivi (ACPI.sys! ACPIBuildDeviceDpc). Il picco che ha introdotto il codice in questa funzione chiama il totale di 455 KB.

      Screenshot del grafico dei dati di esempio che mostra l'utilizzo della memoria per ACPI.sys in base alle dimensioni in attesa di picco usando il tempo di risorsa come AllocTime, FreeTime (aggregazione: Somma)

Passaggio 4: Misurare il footprint del codice del driver

  1. Trovare il grafico Del set residente nella categoria Memoria di Graph Explorer.

  2. Trascinare e rilasciare il grafico Resident Set nella scheda Analisi.

  3. Assicurarsi di annullare lozoom del grafico (CTRL+MAIUSC+"-").

  4. Selezionare il set di impostazioni Grafico pagina supportata da file .

    Screenshot dell'opzione Pagina supportata da file.

  5. Tramite la colonna albero del percorso passare al driver selezionato nel passaggio 3 (ad esempio, ACPI.sys in C:/Windows/drivers).

  6. Espandere la categoria Driver e concentrarsi sulle pagine Attive .

    Il valore nella colonna Dimensioni rappresenta l'impatto del codice driver sul footprint di memoria. Nell'esempio seguente è 0,48 MB. Screenshot dei dati di esempio che mostrano le pagine attive.