Este artigo foi traduzido por máquina.

Rastreamento de pilha

O que são essas PTEs do sistema?

Bob Golding and David Butler

Conteúdo

O que são de APIs do sistema usado para mapear esses endereços?
Parar 3F PTEs de controle não são sempre necessárias
Pilhas do kernel

PTEs de sistema, como todas as PTEs, representam endereços no espaço de endereço do sistema. O que torna esses PTEs diferentes é que eles são um recurso do sistema. Há somente tantos por sistema. Esses "PTEs do sistema" são "slots dinâmicos" no mapa de espaço de endereço de sistema, que significa que um intervalo de endereços são reservado no espaço de endereço sistema e são usados para mapear páginas em demanda e atribuir um endereço a um buffer, ou eles são usados para as pilhas de thread do sistema. O intervalo de endereços fica entre pool não paginado e pool paginado. A seguir é de mi386.h.

E1000000 | Start of paged system area         |
         |   Kernel mode access only.         |
         |                                    |
         |                                    |
         +------------------------------------+
         |                                    |
         | System PTE area - for mapping      |
         |   kernel thread stacks and MDLs    |
         |   that require system VAs.         |<----- Range reserved for dynamic mapping. 
         |   Kernel mode access only.         |
         |                                    |
         +------------------------------------+
         |                                    |
         | NonPaged System area               |
         |   Kernel mode access only.         |
         |                                    |
         +------------------------------------+
FFBE0000 | Crash Dump Driver area             |
         |   Kernel mode access only.         |
         +------------------------------------+

Portanto, como seu tamanho é entre pool paginado e não-paginável, ajustes para esses pools de memória ter um efeito no tamanho da janela de mapeamento. Além disso, como isso é parte do espaço de endereço, fatores que afetam o tamanho dos pools de memória (ou seja, / 3 GB) afeta o tamanho da janela do mapeamento.

O que são de APIs do sistema usado para mapear esses endereços?

Algumas APIs que mapeiam esses endereços são MiMapLockedPagesInUserSpace, MiUnmapLockedPagesInUserSpace, MmMapLockedPages e MmUnmapLockedPages. Essas APIs mapear um buffer para o intervalo de endereços dinâmicos. Eles mapeará o buffer inteiro, portanto, o tamanho do buffer determina quantas páginas contíguas obter usadas.

Como você pode ver, há um unmap API para cada mapa API. Isso é importante observar. Buffers devem ser não mapeados; caso contrário, a janela de mapeamento será fechada. Em outras palavras: nenhum sistema mais PTEs. As páginas mais do que obter mapeado o sistema mais que PTEs acostumados. Como mencionei antes, pilhas de sistema usar esse intervalo. Vídeo não bem para mapear os buffers de vídeo. Portanto, há deve ser suficiente deixado sobre mapear buffers. Quando o sistema PTEs obter baixa, problemas de desempenho ocorrerá. Além disso, um 3F STOP pode ocorrer, mas esses devem ser raras, como código do NT é mais tolerante a falhas de condições de recursos insuficientes.

Parar 3F PTEs de controle não são sempre necessárias

A falta de PTEs do sistema é normalmente os usando TrackPtes para localizar o consumidor de um número alto das PTEs. No entanto, às vezes isso não é útil porque TrackPtes não é implementada pelo próprio código sysptes.c. Portanto, é possível reservar PTEs sem que está sendo controlado. TrackPtes só é implementada por alguns dos chamadores de MiReserveSystemPtes.

Pilhas do kernel

Um consumidor comum sysptes que não é controlado pelo TrackPtes está pilhas do kernel. Felizmente, o Gerenciador de memória oferece a nos vários globais, que forneça esclarecimento sobre a sysptes que está sendo usado para mapear as pilhas do kernel.

No exemplo abaixo, o Gerenciador de memória somente criou sysptes 23,000. Isso é um número relativamente pequeno, mas não é incomum com a opção / 3 GB. Desses sysptes, 17,860 são utilizados para mapear as pilhas do kernel. Análise dos processos e threads não localizou um vazamento aparente; arquitetura de aplicativos do cliente necessário muitos segmentos da GDI. Após analisar o uso da memória do computador, conseguimos ajustar o Gerenciador de memória para aumentar o total PTEs do sistema e liberar espaço suficiente para ações executar.

1: kd> !sysptes 

System PTE Information
  Total System Ptes 23006 

1: kd> dc nt!MmKernelStackPages l 1
80483680  000045c4                             .E..
1: kd> ?45c4
Evaluate expression: 17860 = 000045c4

1: kd> dc MmLargeStacks l 1
8048368c  0000037b
1: kd> dc MmSmallStacks l 1
8048367c  00000385
1: kd> ?37b*f
Evaluate expression: 13365 = 00003435
1: kd> ?385*3
Evaluate expression: 2703 = 00000a8f
1: kd> ?3435+a8f+37b+385
Evaluate expression: 17860 = 000045c4 

Golding Bob está com o Microsoft desde 1997. Ele é engenheiro de escalonamento sênior da equipe de serviços de escalonamento global em que ele oferece suporte a clientes de maiores da Microsoft com suas questões mais críticas.

David Butler está com o Microsoft desde 2000. Ele é um engenheiro de escalonamento da equipe de serviços de escalonamento global em que ele oferece suporte a clientes de maiores da Microsoft com suas questões mais críticas.