NetAdapterCx receber dimensionamento lateral (RSS)

O RSS (Receive side scaling) é uma tecnologia de driver de rede que permite a distribuição eficiente do processamento de recebimento de rede em várias CPUs em sistemas multiprocessadores. O RSS melhora o desempenho do sistema e aumenta a escalabilidade da rede, aproveitando todos os processadores disponíveis em um sistema e reequilibrando dinamicamente as cargas de trabalho da CPU.

Este tópico enfatiza o RSS para controladores de cliente NetAdapterCx e pressupõe um conhecimento dos conceitos e da terminologia do RSS. Para obter mais informações sobre RSS em geral, incluindo diagramas ilustrando RSS em diferentes cenários de hardware, consulte Escalonamento do Lado de Recepção (Receive Side Scaling).

Visão geral do RSS no NetAdapterCx

O RSS no NetAdapterCx concentra-se na facilidade de configuração, simplicidade de ativação e desativação e abstração da complexidade entre o processador e a interrupção. Um driver de cliente para uma NIC compatível com RSS só precisa atender a três critérios para suportar RSS no NetAdapterCx:

  1. O driver deve definir recursos RSS ao iniciar um adaptador de rede, mas antes de chamar NetAdapterStart. Isso inclui implementar quatro retornos de chamada RSS e registrá-los na estrutura de recursos RSS.
  2. As filas de caminho de dados do driver devem ser criadas e prontas para aceitar solicitações.
  3. O condutor deve estar no estado D0 energia.

O design do RSS no NetAdapterCx garante que o sistema não acione os callbacks RSS de um cliente nem ative o RSS até o final da sequência de ativação . Os clientes não precisam gerenciar solicitações de movimentação de tabela indirection ou lidar com outros eventos RSS até que tudo o que precisam esteja pronto.

Mais tarde, quando o driver estiver a descarregar, o NetAdapterCx não chamará callbacks RSS depois de as filas de dados terem sido destruídas durante a sequência de desligamento . Como as filas de dados são eliminadas na primeira etapa durante a desativação, tal significa que os clientes não precisam lidar com possíveis eventos RSS em qualquer outro estágio.

Definindo recursos RSS

Para começar a utilizar RSS no NetAdapterCx, siga estes passos:

  1. Ao iniciar o adaptador de rede, comunique ao sistema as capacidades e restrições RSS do hardware usando a estrutura NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES.
  2. Inicialize a estrutura de capacidades chamando NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES_INIT.
  3. Ao inicializar a estrutura de recursos RSS, defina os membros de retorno de chamada RSS da estrutura para registrar suas implementações para esses retornos de chamada:
    1. EvtNetAdapterReceiveScalingEnable
    2. EvtNetAdapterReceiveScalingDisable
    3. EvtNetAdapterReceiveScalingSetHashSecretKey
    4. EvtNetAdapterReceiveScalingSetIndirectionEntries
  4. Defina o SynchronizeSetIndirectionEntries da estrutura de recursos RSS conforme apropriado.
  5. Passe as estruturas dos recursos de RSS inicializadas para o método NetAdapterSetReceiveScalingCapabilities.

Ativar e desativar o RSS

Depois de definir as capacidades RSS, o sistema continuará com a sequência de inicialização para o seu driver. O NetAdapterCx começa a invocar os callbacks RSS do driver assim que o passo final da criação de filas do caminho de dados for concluído. Neste ponto, o RSS pode ser ativado e desativado conforme necessário pelo sistema.

Importante

Você não deve limpar ou redefinir sua tabela de indireção ao ativar ou desativar o RSS. A estrutura definirá o estado inicial da sua tabela de indireção.

Ativando RSS

NetAdapterCx habilita RSS ao invocar o retorno de chamada EvtNetAdapterReceiveScalingEnable do seu driver. No contexto desse retorno de chamada, você normalmente habilita bits de controle em seu hardware.

Para obter um exemplo de código de ativação do RSS, consulte EvtNetAdapterReceiveScalingEnable.

Desativando RSS

NetAdapterCx desativa o RSS ao invocar do driver o retorno de chamada EvtNetAdapterReceiveScalingDisable. Aqui, você normalmente desabilita o bit de controle em seu hardware que você definiu anteriormente em EvtNetAdapterReceiveScalingEnable.

Para obter um exemplo de código de desativação do RSS, consulte EvtNetAdapterReceiveScalingDisable.

Definindo a chave secreta de hash

Quando o RSS está ativado, o NetAdapterCx invoca o retorno de chamada EvtNetAdapterReceiveScalingSetHashSecretKey para fornecer ao driver a chave secreta de hash que a sua NIC deve usar para validar os cálculos de hash. Esta callback pode ser invocada a qualquer momento enquanto o RSS estiver a correr se a chave secreta de hash for alterada.

Para obter um exemplo de código de configuração da chave secreta de hash, consulte EvtNetAdapterReceiveScalingSetHashSecretKey.

Movendo entradas da tabela de indireção

Enquanto o RSS está em execução no sistema, os drivers de protocolo de camada superior monitoram a carga de trabalho do processador e mantêm uma tabela de indireção que mapeia filas de recebimento para processadores. Quando o driver de protocolo precisa reequilibrar a carga de trabalho do processador em RSS, ele primeiro calcula um novo mapeamento para cada entrada da tabela de indireção para um novo processador. Em seguida, o protocolo passa essas informações para NetAdapterCx, que lida com a complexidade do mapeamento de filas de recebimento e vetores de interrupção de hardware para o processador correto em nome do driver do cliente NIC. NetAdapterCx armazena a nova tabela de indireção, com entradas mapeadas para receber IDs de fila, numa estrutura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES e passa-a para o seu driver quando invoca a função de retorno de chamada EvtNetAdapterReceiveScalingSetIndirectionEntries.

Neste retorno de chamada, move-se cada entrada na tabela de desvio da NIC para a fila de receção especificada. Cada estrutura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY na matriz NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES contém o índice de hash para essa entrada na tabela, a nova fila de receção à qual atribuir a entrada e um campo de status que indica se essa mudança individual foi bem-sucedida ou não.

O método de atribuição de entradas de índice a filas de recebimento de hardware depende do design da sua NIC e do número de filas de recebimento que ela possui. Para obter mais informações e um exemplo de código, consulte EvtNetAdapterReceiveScalingSetIndirectionEntries.

Suporte a CPU heterogênea

Importante

Suporte de CPU heterogênea é um recurso de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.

Sistemas de CPU heterogêneos usam vários tipos de núcleos que têm diferentes velocidades de clock e funcionalidades. Em comparação com sistemas multiprocessadores homogêneos onde cada núcleo é idêntico entre si, os sistemas de CPU heterogêneos podem se ajustar melhor às cargas de computação dinâmica e usar menos energia.

A partir da versão 25197 do WDK Preview, o NetAdapterCx oferece suporte a sistemas de CPU heterogêneos utilizando de forma eficiente os vários tipos de núcleo. Enquanto o RSS está em execução, o sistema decide qual processador usar dependendo da carga de trabalho de tráfego recebida pelo driver cliente. Quando há menos tráfego sendo recebido, núcleos menores e mais eficientes em termos de energia podem lidar com o tráfego. Quando há mais tráfego, núcleos maiores e com maior desempenho são necessários para pesquisar continuamente os pacotes recebidos.

Para optar pelo suporte heterogêneo do sistema, o administrador do sistema deve definir a *RSSProfilepalavra-chave INF padronizada para NdisRssProfileBalanced. Este é o perfil padrão para sistemas heterogêneos. Para permitir que o sistema decida os melhores núcleos a utilizar, não é possível definir palavras-chave avançadas RSS.

Os outros perfis RSS também são suportados para sistemas heterogéneos. Se pretender controlar definições avançadas como o número do processador base RSS e o número máximo do processador RSS no sistema, deverá utilizar um perfil RSS diferente.

Você também pode usar NdisRssProfileBalanced em um sistema de CPU homogêneo. Neste caso, o sistema decide quais processadores usar para RSS.