NetAdapterCx recebe o RSS (dimensionamento lateral)

O RSS (dimensionamento lateral de recebimento) é 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 rebalanceando dinamicamente as cargas de trabalho da CPU.

Este tópico realça os drivers de cliente RSS for NetAdapterCx e pressupõe conhecimento de conceitos e terminologia do RSS. Para obter mais informações sobre o RSS em geral, incluindo diagramas que ilustram o RSS em diferentes cenários de hardware, consulte Receber Dimensionamento Lateral.

Visão geral do RSS no NetAdapterCx

O RSS no NetAdapterCx se concentra na facilidade de configuração, na simplicidade da habilitação e na desabilitação e na abstração da complexidade do processador para interromper. Um driver de cliente para uma NIC compatível com RSS só precisa atender a três critérios para dar suporte ao RSS no NetAdapterCx:

  1. O driver deve definir recursos do 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 do RSS.
  2. As filas de datapath do driver devem ser criadas e prontas para aceitar solicitações.
  3. O driver deve estar no estado de energia D0 .

O design do RSS no NetAdapterCx garante que o sistema não chamará os retornos de chamada RSS de um cliente e habilitará o RSS até o final da sequência de energia. Os clientes não precisam gerenciar solicitações de movimentação de tabela de indireção ou lidar com outros eventos RSS até que tudo o que precisam esteja pronto.

Posteriormente, quando o driver estiver descarregando, o NetAdapterCx não chamará retornos de chamada RSS depois que as filas de datapath forem destruídas durante a sequência de desligar. Como as filas de datapath são interrompidas como a primeira etapa durante a desligar, isso significa que os clientes não precisam lidar com possíveis eventos RSS em qualquer outro estágio durante a desligar.

Definindo recursos do RSS

Para começar a usar o RSS no NetAdapterCx, siga estas etapas:

  1. Ao iniciar o adaptador de rede, informe o sistema sobre as funcionalidades e restrições do RSS do hardware usando a estrutura NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES .
  2. Inicialize a estrutura de recursos chamando NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES_INIT.
  3. Ao inicializar a estrutura de recursos do 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 SynchronizeSetIndirectionEntries da estrutura de recursos RSS conforme apropriado.
  5. Passe as estruturas de recursos de RSS inicializadas para o método NetAdapterSetReceiveScalingCapabilities .

Habilitar e desabilitar o RSS

Depois de definir os recursos do RSS, o sistema continuará com a sequência de energia do driver. O NetAdapterCx começa a invocar os retornos de chamada RSS do driver depois que a etapa final da criação de filas de datapath for concluída. Neste ponto, o RSS pode ser habilitado e desabilitado conforme necessário pelo sistema.

Importante

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

Habilitando o RSS

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

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

Desabilitando o RSS

NetAdapterCx desabilita o RSS invocando o retorno de chamada EvtNetAdapterReceiveScalingDisable do driver. Aqui, você normalmente desabilita o bit de controle em seu hardware definido anteriormente em EvtNetAdapterReceiveScalingEnable.

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

Definindo a chave secreta de hash

Depois que o RSS estiver habilitado, NetAdapterCx invocará o retorno de chamada EvtNetAdapterReceiveScalingSetHashSecretKey para fornecer ao driver a chave secreta de hash que sua NIC deve usar na verificação de cálculos de hash. Esse retorno de chamada pode ser invocado a qualquer momento quando o RSS estiver em execução 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.

Mover entradas de 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 no RSS, ele calcula primeiro um novo mapeamento para cada entrada de 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. O NetAdapterCx armazena a nova tabela de indireção, com entradas mapeadas para receber IDs de fila, em uma estrutura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES e a passa para o driver quando invoca a função de retorno de chamada EvtNetAdapterReceiveScalingSetIndirectionEntries .

Nesse retorno de chamada, você move cada entrada na tabela de indireção da NIC para a fila de recebimento especificada. Cada estrutura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY na matriz NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES contém o índice de hash dessa entrada na tabela, a nova fila de recebimento à qual atribuir a entrada e um campo de status indicando se essa movimentação individual foi bem-sucedida ou não.

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

Suporte à CPU heterogênea

Importante

O Suporte à 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, das informações aqui fornecidas.

Sistemas de CPU heterogêneos usam vários tipos de núcleos que têm diferentes velocidades e funcionalidades de relógio. Em comparação com sistemas multiprocessadores homogêneos em que cada núcleo é idêntico um ao outro, 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 prévia do WDK versão 25197, o NetAdapterCx oferece suporte ao sistema de CPU heterogêneo utilizando com eficiência os vários tipos principais. 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 de energia podem lidar com o tráfego. Quando há mais tráfego, núcleos maiores e com mais desempenho são necessários para sondar continuamente os pacotes recebidos.

Para aceitar o suporte heterogêneo do sistema, o administrador do sistema deve definir a palavra-chave INF padronizada*RSSProfile como NdisRssProfileBalanced. Esse é o perfil padrão para sistemas heterogêneos. Para permitir que o sistema decida os melhores núcleos a serem usados, você não pode definir palavras-chave avançadas do RSS.

Os outros perfis RSS também têm suporte para sistemas heterogêneos. Se você quiser controlar as configurações avançadas, como o número do processador base RSS e o número máximo do processador RSS no sistema, deverá usar um perfil RSS diferente.

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