Partilhar via


Exercício 3 – Acompanhar o volume do driver e as alocações dinâmicas durante a inicialização

Pool é o recurso de memória para componentes do modo kernel que o sistema operacional e os drivers de dispositivo usam para armazenar suas estruturas de dados. O pool tem quatro áreas de alocação básicas:

  1. Pool não paginado: Alocações garantidas para residir na memória física.

  2. Pool de Páginas: Alocações que podem ser paginada fora da memória para o arquivo de página.

  3. Pool não paginável do NX: Alocações não paginada, que não são executáveis.

  4. Pool de sessões: Alocações feitas por sessão. Eles são pagináveis.

O uso do pool é uma contribuidor significativa para o uso geral de memória em um computador – ele é o maior consumidor de memória imediatamente após a inicialização. Qualquer redução no uso do Pool reduz o uso geral de memória do sistema em todo o sistema operacional, com a memória não paginável sendo a categoria de prioridade mais alta para gerar reduções (para).

Neste exercício, você examinará as alocações de driver da Microsoft na caixa de entrada e seu volume (no momento da inicialização) durante a inicialização.

Etapa 1: Reunir um rastreamento de memória do pool em uma transição de inicialização

Nesta etapa, você coletará um rastreamento de inicialização usando o WPR (Gravador de Desempenho do Windows) que contém dados do pool e do conjunto de residentes.

  1. Abrir o WPR no menu Iniciar

  2. Selecione os provedores de eventos certos:

    1. Uso do pool

    2. Conjunto de Residentes

    3. Triagem de primeiro nível

  3. Selecione inicialização como o cenário de desempenho.

  4. Selecione Arquivo como o modo de registro em log.

  5. Defina 1 como o Número de Iterações.

  6. Clique em Iniciar e selecione um local para salvar o arquivo ETL.

O sistema reinicializa automaticamente, coleta um rastreamento e para depois que a área de trabalho fica visível.

Captura de tela na caixa de diálogo configurações do WPR.

Etapa 2: Examinar dados do pool usando o WPA

Os dados do Pool são expostos por meio da tabela de resumo do Pool Graph no WPA. As principais colunas de interesse estão na tabela a seguir.

Você pode adicionar ou remover colunas se clicar com o botão direito do mouse nos cabeçalhos da coluna.

Terminologia Descrição
Marca de pool A marca associada a uma alocação de pool.
Módulo de marca de pool O módulo (driver) associado a uma marca de pool.
Pilha Mostra o caminho do código em um thread que leva a uma alocação de memória.
Paginada Indica se as alocações foram colocadas ou não em um pool de páginas ou em um pool não paginado.
Tipo de impacto Mostra se uma alocação contribui para o uso constante de memória de estado ou se é uma alocação transitória.
  1. Abra o rastreamento capturado na Etapa 1 com WPA.

  2. Abra o menu Rastreamento e selecione Configurar caminho de símbolos.

    • Especifique o caminho do cache de símbolos. Para obter mais informações sobre símbolos, consulte a página Suporte a Símbolos no MSDN.
  3. Abra o menu Rastreamento e selecione Carregar símbolos.

  4. Localizar o grafo pool na categoria Memória do Explorer do Graph

  5. Arraste e solte o grafo pool na guia Análise .

  6. Organize a tabela para mostrar estas colunas:

    1. Módulo de marca de pool

    2. Paginada

    3. Tipo de impacto

    4. Pilha

    5. Marca de pool

    6. Count

    7. Afetando tamanho e tamanho

    **Observação em marcas de pool: **

    Se você for um desenvolvedor de driver, verifique se as marcas de pool usadas pelo driver são claras e facilmente identificáveis para facilitar a análise. Por exemplo, se o nome da sua empresa for Fabrikam, você poderá adicionar um prefixo "Fbk" a todas as marcas de pool: FbkPool1, FbkPool2, FbkBuffer etc.

    Captura de tela mostrando a aparência da tabela WPA reorganizada.

  7. Desabilitar todas as séries no grafo (clique com o botão direito do mouse em ->Desabilitar ->In Entire Graph ->All Series)

    Captura de tela da opção de menu desabilitar no WPA.

  8. Classifique afetando o tamanho clicando no cabeçalho da coluna Tamanho impactando .

    Drivers que têm o maior uso de memória de estado estável são exibidos na parte superior.

Etapa 3: Interceptar dados de alocação do pool

  1. Amplie os primeiros 30 segundos do linha do tempo.

  2. Selecione um driver (por exemplo, ACPI.sys, mas qualquer um fará).

    1. Examine a memória nãopagada e expanda a linha.

      A memória não paga deve ser o foco de suas investigações, pois ela não pode ser movida para o arquivo de página quando há pressão de memória sobre o sistema.

    2. Habilite a Legenda para as categorias Impacting e Transient .

      Captura de tela de dados de exemplo mostrando o uso de memória.

  3. Classifique afetando o tamanho clicando no cabeçalho da coluna.

  4. Afetar a memória diretamente contribui para o volume de memória geral do driver em todos os momentos. No exemplo anterior, você pode dizer que ACPI.sys usa alguma memória não paginada o tempo todo e que esse uso de estado constante aumenta duas vezes (primeiro quando o driver está carregando, depois uma segunda vez em cerca de 3 segundos).

    1. Expanda a pilha e navegue por ela. Na parte superior, você deve ver chamadas de função que levam às maiores alocações de pool de estado constante.

    2. No exemplo a seguir, você pode ver que ACPI.sys faz um total de 255 alocações de pool, totalizando 1,2 MB na função ACPIInitStartACPI . É aí que o desenvolvedor do driver deve se concentrar para melhorar o uso constante de memória de estado do driver, pois essa função é responsável pela maioria das alocações de driver.

      Captura de tela da tabela de dados de exemplo mostrando o uso de memória por ACPI.sys com nós de processo expansíveis

  5. Classifique por Tamanho clicando no cabeçalho da coluna.

  6. Faça a mesma coisa para a categoria Transiente . Expanda a pilha e navegue por ela. Na parte superior, você deve ver chamadas de função que levam às maiores alocações transitórias do pool.

    • No exemplo a seguir, você pode ver que o pico inicial de uso transitório de memória é causado principalmente pela execução de DPCs de dispositivos por ACPI (ACPI.sys! ACPIBuildDeviceDpc). O pico que introduziu o código sob essa chamada de função totaliza 455 KB.

      Captura de tela do grafo de dados de exemplo mostrando o uso de memória por ACPI.sys por tamanho excepcional de pico usando o Tempo de Recurso como AllocTime, FreeTime (Agregação: Soma)

Etapa 4: Medir o volume de código do driver

  1. Localize o grafo Conjunto de Residentes na categoria Memória do Explorer do Graph.

  2. Arraste e solte o grafo Conjunto de Residentes na guia Análise.

  3. Certifique-se de remover o grafo (Ctrl+Shift+"-").

  4. Selecione a predefinição de grafo página com backup de arquivo.

    Captura de tela da opção Página Com Backup de Arquivo.

  5. Por meio da coluna árvore de caminho , navegue até o driver selecionado na Etapa 3 (por exemplo, ACPI.sys em C:/Windows/drivers).

  6. Expanda a categoria Driver e concentre-se nas páginas Ativas .

    O valor na coluna Tamanho representa o impacto que o código do driver tem no volume de memória. No exemplo a seguir, são 0,48 MB. Captura de tela de dados de exemplo mostrando páginas ativas.