Compartilhar via


Considerations For Improving NDIS Driver Performance

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

Otimizar desempenho driver NDIS varia de dispositivo para dispositivo. Nem todas as técnicas otimização apresentadas aqui melhorará suas problemas desempenho driver. No entanto, cada uma dessas técnicas melhorou desempenho em alguns cenários.

Sempre que você alteração seu driver, reavaliar desempenho driver. Embora uma alteração driver não pode afetar desempenho do driver de de base, a alteração pode resultar em outras alterações sistema que prejudicar desempenho driver criando novos afunilamentos.

As técnicas de otimização geral

A seguinte lista mostra as técnicas gerais para melhorar desempenho driver:

  • Evite copiar memória.

  • Para de entrada pacotes, use NdisMIndicateReceivePacket Para indicar múltiplo pacotes recebidos pela miniporta.

    Observação

    Não defina o status dos pacotes indicados para NDIS_STATUS_RESOURCES.

    Observação

    A miniporta deve sempre apropriar transmitir dos pacotes para NDIS. O driver de miniporta deve lass a posse de pacotes NDIS, que melhora desempenho.

    Observação

    Definir o atributo NDIS_ATTRIBUTE_ALWAYS_GIVES_RX_PACKET_OWNERSHIP quando chamado NdisMSetAttributesEx Para informar ao NDIS que NDIS_STATUS_RESOURCES não são indicados.

  • Implementar MiniportSendPackets em vez de MiniportSend.
    Isso permite que protocolo camadas para interagir em modo lote.
    Registrar o MiniportSendPackets manipulador através NdisRegisterProtocol.

    Observação

    MiniportSendPackets será chamado com múltiplo NDIS_PACKET somente no cenário de gateway, quando o módulo ponte Layer 2 está envolvido. A pilha TCPIP envia um pacote em um tempo ao usar este API.

  • Criar um local função para executar armazenar em cache flushes.
    Isso minimiza as chamadas kernel para flushes armazenar em cache freqüente.

  • Microsoft sugere que você examine todas as instâncias de NdisMSleep Ou NdisStallExecution.
    Essas funções são usadas para processamento bloco na atual segmento para um intervalo especificado. Usá-los pode ter efeitos negativos sobre desempenho sistema. NdisMSleep tem granularidade milissegundo e permite que outros segmentos no sistema para executar. NdisStallExecution Permite a granularidade microsecond, mas gira o CPU ao stalling e, portanto, deve ser usado apenas onde atrasos muito curto são exigido. Não uso NdisStallExecution da vaga além da 50 milissegundos.

  • Processar disponível todos os dados ao seu MiniportInterruptHandler é chamado.

  • Executar baixa - prioridade tarefas como itens trabalho em vez de como eventos timer

  • Considere reduzindo o número máximo de pacotes processados para cada interrupção, se seu sistema tiver múltiplo miniportas e parece ser sofrer do pacote de alta latência ou de miniporta reserva estouro erros.
    Pacote de alta latência pode ser identificada por tempo alta ida e volta (RTT) em um multi-Packet UDP, testar ping-pong.

  • Estar ciente de protocolos que local uma miniporta no modo promíscuo.
    Se dois protocolos estiver ligado a uma miniporta no modo promíscuo, todos os pacotes enviados em um protocolo deve ser auto-retornados voltar para o outro protocolo. Isso irá degradar desempenho. Para determinar se um protocolo colocou uma miniporta no modo promíscuo, envie OID_GEN_CURRENT_PACKET_FILTER para todos os miniportas. Se NDIS_PACKET_TYPE_PROMISCOUS retorna, a miniporta está no modo promíscuo.

  • Registre uma interrupção dedicada, se todos os adaptadores têm dedicado interrupções.
    Isso melhorará desempenho. Para registrar uma interrupção dedicada, remover a implementação de MiniportInterruptEnableHandlere em seguida, chamar NdisMRegisterInterrupt Com ambas RequestISR e SharedInterrupt Defina como FALSE. Desative a interrupção CPU na rotina serviço de interrupção (ISR) de camada de abstração de hardware (HAL). Desativar a interrupção adaptador na MiniportInterruptDisableHandlere habilitá-lo no final do MiniportInterruptHandler processamento.

  • Registrar um ReceivePacketHandler com NDIS usando o NdisRegisterProtocol função.

  • Definir a variável de ambiente IMGNOSHAREETH para remover VMINI suporte da sua imagem.
    Suporte VMINI pode melhorar ou prejudicar desempenho em real rede driver desempenho testes. Microsoft recomenda que você não executar testes desempenho sobre uma rede VMINI.

  • Se você estiver execução um sistema fechado, such as um gateway, considere execução seu executar-imagem tempo no modo kernel. **

Observação

Para informações sobre ativação e desativação completa-modo kernel programaticamente, consulte Permissões de acesso de memória.

Uso compartilhado ist quando sua plataforma hardware tem múltiplo miniportas.
IST compartilhada é transparente para o driver de miniporta e é controlado pela HAL.

Definir o seguinte Registro entradas manualmente, como aplicável:
A seguinte entrada Registro causa NDIS para ignorar verificando executar um loop pacote voltar sempre que um pacote é enviado.

[HKEY_LOCAL_MACHINE\Comm\NDIS\Parms]
    "NeverLoopbackPackets"=dword:1

A seguinte entrada Registro deve ser configurada para otimizar retornar manipulação pacote, se todos os chamado miniportas NdisMIndicateReceivePacket São desserializado.

[HKEY_LOCAL_MACHINE\Comm\NDIS\Parms]
    "AllMiniportsDeserialized"=dword:1

A seguinte entrada Registro pode ser definida para habilitar receber otimizações caminho. Esse valor é habilitado Por padrão, mas ele pode ser desativado por configuração para 0. Esse valor é destinado dispositivos que não são dinamicamente ligado e desacoplado. Se seu driver será desacoplado do seu adaptador, ele pode resultar em um sistema falhar.

[HKEY_LOCAL_MACHINE\Comm\NDIS\Parms]
    "OptimizeReceiveHandling"=dword:1

Em ordem para o OptimizeReceiveHandling chave tenham efeito, a seguinte condições devem ser atendidas:

  • O tipo de mídia adaptador da miniporta deve ser 802_3.
  • A miniporta deve estar ligado a um protocolo único driver, such as TCP/IP. Se ele for ligado para dois ou mais protocolos, such as TCP/IP e TCP/IP 6, em seguida, essa chave está desativada.
  • O driver protocolo deve ter um ProtocolReceivePacket manipulador.
  • O driver de miniporta deve ter o sinalizador NDIS_ATTRIBUTE_ALWAYS_GIVE_RX_PACKET_OWNERSHIP definida quando ele chama NdisMSetAttributesEx. Por configuração esse sinalizador, o irá driver de miniporta nunca definido o status pacote para STATUS_RESOURCES quando ela indica os pacotes foram recebidos.
  • A miniporta deve ser desserializada.

Conscientização desses conceitos otimização pode ajudar você a melhorar desempenho driver rede:

  • Uma ocorrência alta taxa no INTERRUPTS_ENABLE em um Carlo Monte log perfil geralmente indica que o driver de miniporta está definido para trabalho em um ambiente compartilhado interrupção. Se as interrupções estão compartilhadas, uma ocorrência de alta velocidade é esperada. Se as Interrupções não estiverem compartilhadas, e registrar sua interrupção como dedicado.
  • Em um cenário gateway com o interrupção compartilhada serviço segmento (ist) habilitado, roteamento todos os trabalho é feito por um segmento. O controlador do kernel é um gráfico ferramenta que fornece uma representação visual de um remoto sistema Windows Embedded CE em um estação de trabalho desenvolvimento. CELog é o Windows Embedded CE rastreamento evento mecanismo. Essas ferramentas podem ajudam você analisar desempenho driver. Especificamente, enquanto você usar Controlador do kernel para exibição dados CELog, se opções segmento excessiva são vistas quando dados está sendo roteados, é importante entender por que essas opções excessiva estão ocorrendo. O motivo irão variar de implementação para implementação.
  • Todos os MiniportInterruptHandlers e NdisMTimer Eventos executar no mesmo segmento. MiniportSendPackets Também pode executar neste segmento. Como resultado, se o CPU interrompida durante qualquer um desses eventos, este segmento foi da vaga, que poderia evitar outras interrupções seja atendido ou dados a ser enviado.

As técnicas de otimização avançada

A seguinte lista mostra otimização técnicas que você pode usar, bem como as técnicas gerais otimização listadas anteriormente:

  • Grupo estruturas dados para a mesma página de memória para reduzir erros reserva (Cargas de TLB) look-aside de conversão
  • Se o número de instruções que são excede executado em um executar um loop ICacheSize dividido pelo número de bytes por instrução e, em seguida, se espalhar a execução em menor loops.
    De exemplo, se a ICacheSize é 8 KB e o número de bytes por instrução é 4 e, em seguida, o número de instruções executado em um executar um loop não devem ser more than 2 KB.
  • NdisMStartBufferPhysicalMapping é bastante tempo consumindo porque ela usa LockPages. Se você tiver um múltiplo sistema da miniporta, considere a possibilidade de fazer todos miniportas ciente das mapeamentos uns dos outros endereço Physical-to-Virtual. Esses mapeamentos são estabelecidos quando a miniporta chama NdisMAllocateSharedMemory. Mapeamentos de endereço Physical-to-Virtual podem ser usados para indicar se uma armazenar em cache liberado para uma determinado reserva é necessária.
  • Se o Windows Embedded CE com base no dispositivo experiências excessiva Cargas de TLB de perdas e possui software Cargas de TLB de perder manipulação, para exemplo MIPS e sh, talvez seja possível reduzir o número de perdas por carregar componentes OS na memória kernel. CELog (CELZONE_TLB, 0x8) pode apresentar uma indicação de perdas Cargas de TLB de alta.
    Para Windows Embedded CE-com dispositivos que não possuem software para manipulação Cargas de TLB de perdas, verificar com o fabricante chip sobre se o microprocessador oferece suporte a medida da placa de Cargas de TLB de perdas. Se afirmativo, o fabricante pode ter ferramentas para exibir que dados. Para obter mais informações sobre como essa dados são reunidos, consulte Evento de rastreamento. Para obter informações sobre como exibir os dados, consulte O controlador do kernel remoto.
  • Uma plataforma x 86 hardware cuida de coherence armazenar em cache para você. Você não precisará explicitamente liberado em memória cache. Para aprimoramento desempenho em potencial, considere cache a reserva acesso direto à memória (DMA). Medir desempenho em todos os cenários antes e depois fazer essa alteração, porque ele pode melhorar ou prejudicar desempenho. O resultado será dependem de cenário.
  • Decidir se ela é ideal para liberado a reserva em cache ou copiar a reserva em cache para uma região memória uncached para transferir um acesso direto à memória (DMA). A melhor abordagem varia de sistema para sistema e depende de tamanho de reserva e o custo de acessar memória uncached versus o custo de liberar a reserva armazenar em cache. Tente os dois métodos para medida, que é ideal para seu sistema. Fornecedores hardware independentes (IHVs) gravando drivers que podem ser usados em plataformas diferentes hardware devem fazer essa opção Um que pode ser configurada.
    Se você decidir implementar armazenados em cache reserva acessar com liberando, certifique-se de que seu Windows Embedded CE com dispositivo possui uma funcionalidade cache-flushing eficiente que permite que somente o intervalo específico para ser liberado.
  • Para examinar a quantidade de tempo de CPU gasto em rede codificar, OS, driver ou programa, use CELog para entrada carimbo e eventos sair.
  • Quando um dispositivo destino tem um armazenar em cache dados pequena, talvez seja eficiente para usar endereços uncached memória para buffers que são anexado a um descritor pacote. O método para obter um endereço uncached para um endereço em cache depende de como seu hardware. Se um dispositivo é usado para roteamento pacote ou pontes, codificar que envia o pacote deve verificar se o endereço da reserva é de uma região memória uncached. Se for, você não precisa para executar um armazenar em cache liberado.

See Also

Concepts

Improving Performance of an NDIS Miniport Driver
Performance Improvements for an NDIS Miniport Driver