RSS (dimensionamento lateral de recebimento) do NetAdapterCx

O Receive Side Scaling (RSS) é uma tecnologia de driver de rede que permite a distribuição eficiente do processamento de recebimento de rede entre 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 cargas de trabalho de CPU.

Este tópico destaca os drivers de cliente RSS para NetAdapterCx e assume o conhecimento dos 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 Receive Side Scaling.

Visão geral do RSS no NetAdapterCx

O RSS no NetAdapterCx concentra-se na facilidade de configuração, simplicidade de habilitação e desabilitação, e abstração da complexidade das interrupções de processador. Um driver 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 RSS callbacks e registrá-los na estrutura de capacidades 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 projeto do RSS no NetAdapterCx garante que o sistema não execute os callbacks RSS de um cliente e habilite o RSS até o final da sequência de inicialização. Os clientes não precisam gerenciar solicitações de movimentação de tabela de indireção ou lidar com outros eventos do RSS até que tudo o que eles precisam esteja pronto.

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

Definindo recursos do RSS

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

  1. Ao iniciar o adaptador de rede, informe ao sistema sobre as funcionalidades e restrições do 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 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 o SynchronizeSetIndirectionEntries da estrutura de funcionalidades do RSS conforme apropriado.
  5. Passe as estruturas de capacidades do RSS inicializadas para o método NetAdapterSetReceiveScalingCapabilities .

Habilitar e desabilitar o RSS

Depois de definir as capacidades do RSS, o sistema continuará com a sequência de inicialização do driver. NetAdapterCx começa a invocar os callbacks RSS do driver após a conclusão da etapa final da criação de filas de datapath. 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 ao invocar o retorno de chamada EvtNetAdapterReceiveScalingEnable do seu driver. No contexto desse callback, 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 desabilitará o bit de controle em seu hardware definido anteriormente em EvtNetAdapterReceiveScalingEnable.

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

Definindo a chave secreta de hash

Depois que o RSS estiver habilitado, o 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 de segredo de hash, consulte EvtNetAdapterReceiveScalingSetHashSecretKey.

Movendo 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 recepção para processadores. Quando o driver de protocolo precisa rebalancear a carga de trabalho do processador no RSS, ele primeiro calcula 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 das filas de recepção e vetores de interrupção de hardware para o processador correto em nome do driver cliente da Placa de Interface de Rede (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 .

Neste callback, você move cada entrada em 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 que indica se esse movimento individual foi bem-sucedido ou não.

O método de atribuir entradas de índice a filas de recebimento de hardware depende do design de sua NIC e do número de filas de recebimento que ele 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, 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 e funcionalidades de relógio. Em comparação com sistemas homogêneos e multiprocessadores 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 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 optar por 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, não é possível definir palavras-chave avançadas do RSS.

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

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