NetAdapterCx RSS (Receive Side Scaling)

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 multiprocessador. 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 destaca RSSs para drivers de cliente NetAdapterCx e pressupõe o conhecimento de conceitos e terminologia de RSS. Para obter mais informações sobre RSS em geral, incluindo diagramas ilustrando RSS em diferentes cenários de hardware, consulte Receive Side Scaling.

Visão geral do RSS no NetAdapterCx

O RSS no NetAdapterCx se concentra na facilidade de configuração, na simplicidade de habilitação e desativação e na abstração da complexidade do processador para a interrupção. Um driver de cliente para uma NIC compatível com RSS só precisa atender a três critérios para oferecer suporte a 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 de 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 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 fim da sequência de inicialização. Os clientes não precisam gerenciar solicitações de movimentação de tabela de indirecionamento nem manipular outros eventos RSS até que tudo o que precisam esteja pronto.

Posteriormente, quando o driver estiver sendo descarregado, o NetAdapterCx não chamará retornos de chamada de RSS depois que as filas de caminho de dados tiverem sido destruídas durante a sequência de desligamento. Como as filas de caminho de dados são derrubadas como a primeira etapa durante a desativação, isso significa que os clientes não precisam lidar com possíveis eventos RSS em nenhum outro estágio durante a desativação.

Definir recursos de RSS

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

  1. Ao iniciar o adaptador de rede, informe o sistema sobre os recursos e restrições de 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 RSS, defina os membros de retorno de chamada RSS da estrutura para registrar suas implementações para estes retornos de chamada:
    1. EvtNetAdapterReceiveScalingEnable
    2. EvtNetAdapterReceiveScalingDisable
    3. EvtNetAdapterReceiveScalingSetHashSecretKey
    4. EvtNetAdapterReceiveScalingSetIndirectionEntries
  4. Defina SynchronizeSetIndirectionEntries da estrutura dos recursos de RSS conforme apropriado.
  5. Passe as estruturas de recursos de RSS inicializadas para o método NetAdapterSetReceiveScalingCapabilities.

Como habilitar e desabilitar a RSS

Depois de definir os recursos de RSS, o sistema continuará com a sequência de inicialização do driver. O NetAdapterCx começa a invocar os retornos de chamada de RSS do driver assim que a etapa final da criação de filas de caminho de dados é concluída. Nesse ponto, o RSS pode ser ativado e desativado conforme necessário pelo sistema.

Importante

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

Como habilitar 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 no seu hardware.

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

Desabilitar o RSS

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

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

Definir 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 poderá ser invocado a qualquer momento quando o RSS estiver em execução, se a chave secreta de hash for alterada.

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

Mover todas as entradas da tabela de indireção

Enquanto o RSS está sendo executado 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 as filas de recebimento para os processadores. Quando o driver de protocolo precisa reequilibrar 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 o NetAdapterCx, que lida com a complexidade de mapear filas de recebimento e vetores de interrupção de hardware para o processador correto em nome do driver de cliente de 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 ele 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 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 de CPU heterogênea

Importante

O 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 nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.

Sistemas de CPU heterogênea usam vários tipos de núcleos que têm velocidades de relógio e funcionalidades diferentes. Em comparação com sistemas multiprocessadores homogêneos, onde cada núcleo é idêntico um ao outro, sistemas de CPU heterogênea podem se ajustar melhor a cargas de computação dinâmica e usar menos energia.

A partir da versão de visualização WDK 25197, o NetAdapterCx oferece suporte a sistemas de CPU heterogênea utilizando os vários tipos de núcleo com eficiência. Enquanto o RSS está em execução, o sistema decide qual processador usar, dependendo da carga de trabalho de tráfego recebida pelo driver de 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 mais desempenho são necessários para sondar continuamente os pacotes que estão sendo recebidos.

Para aceitar o suporte a sistemas heterogêneos, 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 de RSS.

Os outros perfis de RSS também são compatíveis com sistemas heterogêneos. Se você quiser controlar configurações avançadas, como o número do processador base RSS e o número máximo do processador de RSS no sistema, use outro perfil de RSS.

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