Conjuntos de referência e os efeitos em todo o sistema sobre o uso de memória

Um conjunto de referências é a maneira recomendada de entender os efeitos reais de um processo na disponibilidade de memória do sistema como um todo.

Tradicionalmente, o uso de memória tem sido medido pelo conjunto de trabalho do processo em um determinado momento. O conjunto de trabalho de um processo é o conjunto de páginas no espaço de endereço virtual do processo que atualmente residem na memória física. (Para obter mais detalhes sobre conjuntos de trabalho, consulte Conjunto de trabalho no Centro de Desenvolvimento do Windows.)

Limitações de um conjunto de trabalho

Um conjunto de trabalho fornece informações limitadas, pois não mostra toda a memória usada para dar suporte ao processo, como arquivos armazenados em cache e a memória usada pelos serviços do sistema que o processo utiliza. Além disso, um conjunto de trabalho é altamente dependente do estado do computador, da quantidade de RAM e do nível de atividade necessário do subsistema de memória para fornecer todos os processos no sistema com a memória que eles solicitam (o nível de pressão de memória). Além disso, um conjunto de trabalho é muito afetado pelas políticas de corte do sistema operacional. Portanto, um conjunto de trabalho é apenas uma medida momentânea e omite efeitos fora do processo de destino.

Vantagens de um conjunto de referência

Por outro lado, um conjunto de referência é uma medida do conjunto de páginas de memória em todo o sistema que qualquer processo ou atividade no sistema acessou durante um determinado cenário. Ele inclui todas as páginas acessadas em nome do componente que está sendo investigado, independentemente de qual processo tenha acessado a página. O conjunto de referências não varia com base no tamanho da RAM, na pressão de memória ou nas políticas de corte do sistema operacional. Medir um conjunto de referências é uma maneira extremamente precisa de avaliar o uso de memória em todo o sistema para qualquer carga de trabalho, pois as páginas que estão atualmente no conjunto de trabalho de qualquer processo ou que são acessadas por processos ou drivers do sistema, estão incluídas no conjunto de referências. Um conjunto de referências é específico para um cenário, não por um momento: não é válido perguntar, Qual é o conjunto de referências do meu processo neste momento? No entanto, é válido perguntar: Qual é o conjunto de referência do sistema nesse cenário? ou Qual é o conjunto de referências do meu processo nesse cenário?

A ideia por trás de um conjunto de referências é simples: para dar uma imagem precisa da memória referenciada em todo o sistema durante o cenário, as páginas são contadas quando acessadas e quando liberadas. Esse método fornece uma visão abrangente dos picos de uso de memória, bem como do que está pendente no final do cenário (ou seja, uso de estado estável).

Observação

Somente a primeira referência de uma página é capturada.

Um conjunto de referências pode ser considerado aproximadamente como uma medida da quantidade de memória que pode ser retirada do restante do sistema durante a execução do cenário ou, equivalentemente, a quantidade de memória que precisaria ser falha e lida do disco para executar o cenário (se outras partes do sistema tiverem feito com que a memória seja paginada). Portanto, um conjunto de referências é valioso para determinar o impacto no desempenho do uso da memória.

Como coletar dados do conjunto de referência

Você pode usar duas ferramentas de linha de comando diferentes para coletar dados do conjunto de referências: WPR (Gravador de Desempenho do Windows) e Xperf. Você também pode usar a interface de GUI do WPR.

O WPR e o Xperf fazem parte do Windows Performance Tookit, que está incluído no Kit de Avaliação e Implantação do Windows (ADK). Você pode baixar o ADK para Windows 10 no seguinte link: Kit de Avaliação e Implantação do Windows.

Observação

Use um prompt de comandos com privilégios elevados ao coletar dados do conjunto de referências.

Coletar dados com o WPR

Para coletar dados com o WPR, insira:

      wpr -start referenceset -filemode

Execute seu cenário e pare de coletar dados inserindo:

      wpr -stopfile-name.etl

Coletar dados com Xperf

Ao usar o Xperf para coletar rastreamentos de memória, especifique o mesmo tamanho para buffers mínimo e máximo para garantir que haja uma quantidade consistente de memória do sistema reservada para ETW (Rastreamento de Eventos para Windows). Essa consistência facilita a comparação entre as execuções devido à diminuição da variabilidade. (Esses buffers são definidos automaticamente com o mesmo tamanho ao usar o WPR.)

Para coletar dados com Xperf, insira:

xperf -on referenceset -minbuffers 50 -maxbuffers 50 -buffersize 1024 -stackwalk PageAccess+PageRelease+PageRangeAccess+PageRangeRelease++ PagefileMappedSectionCreate+VirtualFree+PagefileMappedSectionDelete -start user -on Win32HeapRanges -minbuffers 10 -maxbuffers 10 -buffersize 1024

Execute seu cenário e pare de coletar dados inserindo:

      xperf -stop user -stop -dfile-name.etl

Coletar dados com o aplicativo da área de trabalho WPR

Você também pode coletar dados usando o aplicativo da área de trabalho WPR, wprui.exe. Na GUI, em Análise de Recursos, selecione Análise do Conjunto de Referências. (Se você não vir essa opção, talvez seja necessário clicar em Mais Opções e expandir Análise de Recursos.)

A caixa de diálogo inicial do Gravador de Desempenho do Windows (WPR).

Para iniciar a gravação, clique em Iniciar e, em seguida, execute seu cenário.

Para interromper a gravação e salvar os dados de rastreamento, clique em Salvar.

Caixa de diálogo do Gravador de Desempenho do Windows (WPR) mostrando a gravação ativa.

Como funciona o rastreamento do conjunto de referências

Quando a WPR começa a coletar o rastreamento de um conjunto de referências, o sistema remove imediatamente todas as páginas de memória dos conjuntos de trabalho de todos os processos, incluindo o sistema. Além disso, todas as páginas que permanecem nos conjuntos de trabalho de um processo ou do sistema são registradas para levar em conta páginas bloqueadas ou marcadas como não pagináveis. Depois disso, no primeiro acesso de uma página que foi movida para a lista em espera, o sistema registra uma falha temporária no rastreamento do conjunto de referências, a página é adicionada ao conjunto de trabalho do processo e o processo continua em execução. Os acessos subsequentes a uma página no conjunto de trabalho do processo ou do sistema não causarão outra falha de página flexível, pois a página já está no conjunto de trabalho. Como resultado, a execução continua sem registrar nenhum acesso adicional às páginas em um conjunto de trabalho e, portanto, o número total de acessos a uma página não é registrado no rastreamento.

Da mesma forma, o primeiro acesso de qualquer outra página no mesmo processo é registrado no rastreamento, incluindo páginas recém-alocadas. As páginas liberadas (como por HeapFree) e os arquivos excluídos têm seu tamanho pendente removido do conjunto de referências no final do intervalo de medição, mas ainda são mostrados como acessados. Os arquivos fechados ou executáveis removidos da memória não são removidos do tamanho pendente, pois não são limpos da RAM no fechamento ou remoção. Se uma página for compartilhada entre dois ou mais processos, o rastreamento registrará o primeiro acesso a essa página em cada processo que a tocar.

Observação

Registrar o rastreamento de um conjunto de referências pode ter um efeito significativo no desempenho do sistema, pois todos os processos devem falhar em um grande número de páginas de volta em seus conjuntos de trabalho depois que seus conjuntos de trabalho forem esvaziados.

Visualizações do conjunto de referências

O WPA oferece as seguintes exibições de dados do conjunto de referência:

Conjunto de referências tamanho pendente por processo

Isso mostra a memória dividida por processo para o visor. Este é um bom lugar para começar se você estiver investigando o efeito na memória de um aplicativo específico.

Exemplo da exibição 'Tamanho pendente por processo' no WPA (Windows Performance Analyzer).

Para obter os significados das colunas nessa exibição, consulte Definições de coluna importantes, mais adiante neste tópico.

Conjunto de referências tamanho pendente por categoria

Isso mostra páginas de memória por categoria para o visor.

Exemplo da exibição

Para obter uma explicação das categorias de página, consulte Categoria da Página (Dinâmica) e Categoria da Página (Arquivo), mais adiante neste tópico.

Conjunto de referências tamanho pendente por dinâmico/arquivo

Isso mostra a memória categorizada por se ela tem suporte de memória ou com suporte de arquivo para o visor.

Exemplo da exibição

Observação

As páginas com suporte de memória são apoiadas pelo arquivo de página ou, no caso de pool não paginado, nunca paginadas. As páginas com suporte de memória incluem pilha, heap, VirtualAlloc e outras categorias de página que não são mapeadas diretamente para um arquivo no disco. As páginas com backup de arquivo são apoiadas por arquivos individuais em disco, como imagens de módulo.

Noções básicas sobre dados do conjunto de referência

Conforme mencionado anteriormente, o conjunto de referência representa a memória que foi tocada durante a execução do cenário de interesse. Nesse sentido, o conjunto de referência é o custo real da execução da carga de trabalho e representa a contabilidade mais precisa do volume de memória da carga de trabalho.

Normalmente, você está interessado no volume de memória de um processo específico, portanto, você desejará começar com a tabela Conjunto de Referências Pendentes por Processo . Você desejará examinar os locais em que o uso de memória aumentou ou diminuiu, bem como onde ele atingiu o pico e onde estava estável.

Estado de pico versus estável

Como o conjunto de referência é a medida da quantidade de memória referenciada durante um cenário, pode não ser intuitivo que seu tamanho possa diminuir. Quando a memória é liberada e retornada ao sistema para ser usada para outras finalidades, ela é subtraída do conjunto de referências para refletir o fato de que ela pode ser reutilizado posteriormente.

Isso faz com que um cenário tenha duas métricas de conjunto de referência primária: estado estável e pico.

MétricaDescrição
Estado estável 

Um custo de linha de base do aplicativo ou cenário. Isso pode ser medido executando um cenário (ou vários cenários) e, em seguida, aguardando que o sistema atinja um estado ocioso novamente. Minimizando o número de páginas que seu aplicativo acessa em um estado estável em vários cenários, você pode ver os cenários serem executados mais rapidamente (por exemplo, retomar mais rapidamente) e fornecer uma experiência melhor para o usuário, pois você reduzirá a pressão de memória no sistema.

Peak

Alto uso transitório de memória, que pode enviar informações mais valiosas para fora da memória física. Ao reduzir a frequência e a magnitude de qualquer pico de uso, seu aplicativo ou recurso será um "cidadão do sistema" melhor diminuindo o potencial de troca ou encerramento de outros processos.

Definições de coluna importantes

Ao examinar o rastreamento de um conjunto de referência no WPA, as seguintes colunas no modo de exibição de tabela são especialmente importantes:

Se uma dessas colunas estiver ausente na exibição no WPA, você poderá adicioná-la clicando com o botão direito do mouse em um título de coluna no modo de exibição atual e selecionando a coluna ausente na lista.

Todas as três exibições de conjunto de referência fornecem quatro colunas diferentes, fornecendo tamanhos da memória que está sendo contada:

  • Tamanho (Exibição de Processo): o conjunto total de páginas referenciadas pelo processo especificado
  • Tamanho (Exibição do Sistema): o conjunto de páginas referenciados por
  • Tamanho do Impacto (Modo de Exibição de Processo)
  • Tamanho do Impacto (Modo de Exibição do Sistema)

Exibições diferentes mostram colunas diferentes por padrão, mas todas elas estão disponíveis em todas as exibições de refset se você as procurar e elas somam tamanhos da mesma maneira, independentemente das exibições em que você as usa.

Tipo de Impacto

A coluna Tipo de Impacto identifica o tipo de efeito que uma alocação de memória tem na memória atualmente em uso: Impacting, Transient e Persistent.

Tipo de impacto Descrição
Impactando

Memória que foi (A) alocada antes do início do visor e liberada durante o visor (alocada fora e liberada dentro) ou (B) alocada durante o visor e liberada após o final do visor (alocada dentro e liberada fora). Uma alocação impactando afeta a memória em uso no final do visor.

Transitório

Memória alocada e liberada durante o visor (alocada dentro e liberada dentro). Uma alocação transitória está ativa somente no visor atual. As alocações transitórias normalmente contribuem para quaisquer picos de uso em um visor.

Persistente

Alocações que foram alocadas antes do início do visor e liberadas após o final dela (alocadas fora e liberadas fora). Uma alocação persistente está ativa durante a totalidade do visor.

Tamanho e tamanho do impacto

A coluna Tamanho do Conjunto de Referências Pendente por Processo representa a magnitude dos acessos, independentemente do tipo de efeito (mostrado na coluna Tipo de Impacto ) causado por uma alocação, que pode ser um dos impactantes, transitórios ou persistentes. Isso não é muito valioso para análise, mas é necessário para grafo no WPA.

O Tamanho do Impacto representa o efeito sobre o tamanho do carimbo de data/hora inicial até o carimbo de data/hora final para o nível de zoom atual. Uma comparação dos valores grafados no início e no final do campo de exibição, em termos simples, corresponde ao delta. Os acessos transitórios ou persistentes não fazem com que o valor grafado seja alterado para a janela de zoom e, portanto, eles não contam.

Quando dois processos fazem referência à mesma página de memória física, a página é contada para cada processo na coluna Tamanho . Adicionar os dois valores não produz um total de todo o sistema para o conjunto de referência, pois depois que a página é adicionada ao conjunto de trabalho, o acesso subsequente não é contado. A página também é contada na coluna Tamanho do Impacto , apenas uma vez, para o primeiro processo que acessa a página. Adicionar os valores em Tamanho do Impacto para um processo produz um total válido em todo o sistema para o conjunto de referência e faz isso sem perder ou multiplicar a contagem de qualquer página. Portanto, os valores em Tamanho do Impacto representam os efeitos reais em todo o sistema na memória.

Considere um exemplo, de t_start a t_end, com os seguintes valores:

  • Grafo em t_start: 10 MB

  • Novos acessos (impactando) na janela: 10 MB

  • Transitório acessado na janela: 10 MB

  • Grafo em t_end: 10 (persistente) + 10 (impactando) = 20

  • Coluna de tamanho: 10 (persistente) + 10 (transitório) + 10 (impacto) = 30

  • Coluna Tamanho do Impacto: 10 (Impactando)

Observação

Ampliar e reduzir altera o visor e faz com que esses tamanhos sejam recalculados.

Classe Category

Há duas categorias de acesso para páginas de memória, identificadas no WPA na coluna Classe categoria : Dinâmico ou Arquivo.

Classe Category Descrição
Dinâmico

São alocações sob demanda de memória associadas a um processo ou estado do sistema que não persistem em um desligamento do sistema. As alocações podem ser não paginadas ou apoiadas pelo arquivo de página e podem ser Heap, VirtualAlloc e assim por diante, conforme identificado na coluna Categoria de Página . A memória dinâmica compartilhável também é identificada na Categoria de Página como PFMappedSection.

Arquivo

São arquivos referenciados pelo processamento que são apoiados por um arquivo em disco. Arquivos carregados como dados, arquivos carregados como imagens (executável ou DLL) e arquivos de mapa.

Categoria de Página (Dinâmico)

Na coluna Categoria de Página , quando a classe de categoria é Dinâmica, o WPA exibe uma ou mais das categorias descritas na tabela a seguir.

Categoria da Página , alocação dinâmica Descrição
Virtualalloc Essa categoria de página inclui grandes alocações dinâmicas (maiores que 512 KB ou 1 MB, dependendo do sistema) alocações dinâmicas feitas pelo aplicativo (ou feitas pela estrutura em nome do aplicativo) usando as APIs de alocação virtual.
Pilha Essa categoria de página inclui alocações pequenas e dinâmicas feitas pelo aplicativo (ou feitas pela estrutura em nome do aplicativo) usando as APIs de alocação de heap.
UserStack Pilha de modo de usuário para um thread.
PFMappedSection Memória dinâmica compartilhável. Essa categoria de página geralmente mede a quantidade de memória gasta em alocações gráficas. Do ponto de vista do aplicativo, isso inclui não apenas imagens, vídeos, outras alocações de "pipeline de mídia" que seu aplicativo está usando, mas também inclui os blocos de construção básicos da interface do usuário, como as superfícies usadas para renderizar um ListView.
CopyOnWriteImage Páginas de cópia na gravação para módulos carregados no processo.
LargePage
AWEPage Páginas físicas alocadas por um processo.
PageTable
PagedPool Heap de kernel.
Non-PagedPool Heap de kernel não paginável.
SessionPrivate
KernelStack Pilha do modo kernel.
Driver
DriverLockedSystemPage
PTEs do sistema

Categoria da Página (Arquivo)

Na coluna Categoria de Página , quando a classe de categoria é Arquivo, o WPA exibe uma ou mais das categorias descritas na tabela a seguir.

Categoria da Página, arquivo Descrição
Imagem Um arquivo carregado como um executável, como uma DLL.
Mapfile Um arquivo carregado como dados.
Metarquivo Um diretório ou um log do sistema.
RegistryFile Um arquivo do Registro.
Pré-busca Informações usadas para acelerar a inicialização de um aplicativo.
DriverFile Um driver que é carregado como um executável.

Pilha de alocação

A coluna Pilha de Alocação identifica onde a memória é alocada.

Afetando a pilha

A coluna Pilha de Impacto mostra por que a memória é acessada.

Recomendações para medir e melhorar o desempenho em um conjunto de referência

As recomendações gerais a seguir são úteis para medir um conjunto de referências e melhorar os efeitos de um aplicativo ou recurso no sistema. Use estas recomendações na seguinte ordem:

Nota O rastreamento usa memória, que é visível como pool não paginado com a descrição "ETWB" para buffers ETW.

Examinar o uso de estado estável e o uso máximo de memória

Dois aspectos são importantes: (1) a quantidade de uso de memória que está em um estado estável no final do cenário e (2) em que os picos de uso ocorrem no conjunto de referência e por quê. Sua análise deve se concentrar primeiro no impacto de estado estável do cenário e, em seguida, examinar quaisquer picos específicos nos grafos do conjunto de referência.

Concentre-se no processo com os maiores efeitos

Concentre-se em processos que têm o maior efeito sobre o conjunto de referências, incluindo o processo de interesse, bem como outros processos do sistema.

Caracterizar e categorizar páginas de memória

A caracterização precisa ser para classes de categoria de páginas de memória, dinâmicas e de arquivo e divididas ainda mais em subcategorias.

Examinar páginas de memória na categoria Arquivo

A melhor maneira de examinar os acessos a arquivos geralmente é agrupá-los por árvore de caminho e, em seguida, identificar acessos a arquivos relacionados ao sistema (como DLLs) e acessos a arquivos específicos do processo (como bancos de dados locais, arquivos de texto, JPEGs e assim por diante).

Minimizar os acessos a arquivos específicos do processo reduz o tamanho do conjunto de referências. Ele também melhora o desempenho para iniciar o teste antes que o aplicativo ou recurso que está sendo testado seja carregado (um cenário frio).

Essencialmente, diagnosticar a parte do arquivo de um conjunto de referência requer saber quais DLLs são exclusivas para seu cenário e por que elas estão sendo carregadas, bem como todos os arquivos que seu aplicativo ou recurso acessa (por exemplo, arquivos de imagem ao decodificar para uma apresentação de slides).

Examinar páginas de memória na categoria Dinâmica

Use a seguinte sequência para analisar o rastreamento de um conjunto de referência:


Classificar por categoria de página

Classifique por categoria de página para o seguinte: Win32Heap, VirtualAlloc ou PFMappedSection. A categoria pode ser atribuída diretamente ao processo.

As categorias específicas do sistema geralmente podem ser ignoradas para análise inicial, embora as principais contribuições (mais de 2 a 3 MB) do pool paginado ou da pilha de kernel geralmente valham a pena examinar, pois esse volume geralmente indica um uso excessivo de threads ou componentes, como o Registro.

Aplicar marcas de pilha

Aplicar marcas de pilha para categorizar o uso de memória por pilha pode ser muito útil para identificar de onde vem o uso de memória.

Executar rastreamento específico do heap

Embora as marcas de pilha para um conjunto de referência possam fornecer uma ideia geral de quais processos estão usando o heap, muitas vezes você precisa fazer rastreamento específico de heap se o uso de heap tiver um efeito significativo em seu cenário. Um conjunto de referências não fornece a granularidade necessária para analisar o heap de um ponto de vista de alocação, pois o conjunto de referência identifica apenas quais páginas de memória são referenciadas. Um heap muito fragmentado pode mostrar um grande volume de estado estável para uso de heap, mesmo que as próprias alocações de heap sejam pequenas, mas espalhadas por todo o heap.

Examinar pilhas de alocações que têm alto uso

VirtualAlloc: examine pilhas de alocação específicas que têm alto uso de VirtualAlloc. A exibição de VirtualAlloc Commit LifeTimes na guia Análise exibe detalhes sobre o uso da confirmação por processo.

Examinar processos do sistema que têm efeitos significativos

Há outros processos do sistema que têm efeitos maiores na memória como resultado desse cenário? Exemplos de candidatos incluem serviços, agentes de aplicativos e scanners antivírus.

Categorizar para analisar custos e identificar opções de redução

Depois de trabalhar com as recomendações anteriores, use o procedimento a seguir para analisar as pilhas que têm o maior efeito sobre o sistema e explorar maneiras de reduzir os custos de memória.

  1. Identifique as pilhas que têm os custos mais altos.

  2. Use anotações para categorizar as pilhas com um nome para o que cada uma deve fazer.

  3. Considere se o custo de cada categoria e pilha é um valor esperado para o cenário.

  4. Considere se você pode reduzir os picos no cenário ativo, por exemplo, alocando memória somente quando necessário.

  5. Considere se você pode reduzir o uso de memória em estado estável. Por exemplo, você pode liberar recursos durante o estado estável que são específicos do cenário e não são necessários? Exemplos podem incluir caches e recursos em pool. A liberação de recursos pode diminuir o volume de memória de estado estável.