Uso de filtros ethtool para balancear as filas da NIC

1

Eu tenho um aplicativo de servidor com multitarefa sendo executado no Linux 4.4.0 com uma NIC X540-AT2 (o servidor tem um thread por núcleo). Como o Linux tem o RSS ativado, ele usa uma fila de recebimento de NICs para cada núcleo no sistema (16 núcleos e, portanto, 16 filas RX).

Meu objetivo é permitir que um aplicativo cliente seja executado em um host separado para "sugerir" em qual fila os pacotes devem ser direcionados (ou seja, algum tipo de balanceamento de carga de fila de recebimento direcionado para o cliente).

Para conseguir isso, eu tenho jogado com a tabela de diretor de fluxo da NIC sem sorte (alguma idéia?):

  • tag

    VLAN: O host do servidor atribui cada identificador VLAN a uma fila RX separada (usando ethtool --config-ntuple ) e o aplicativo cliente atribui uma tag VLAN a cada pacote para identificar a fila de recebimento de destino (atingindo assim o balanceamento direcionado ao cliente desejado).

    Infelizmente, o servidor nunca recebe nenhum dos pacotes do cliente, já que está escutando na interface NIC principal, que não possui VLANs atribuídas a ele no sistema. Existe uma maneira de descartar as tags de VLAN depois que os pacotes são recebidos, para que eles sejam usados apenas para minhas necessidades de equilíbrio?

  • Campo TOS (bits 8-15 do cabeçalho IPv4): Eu também tentei usar o campo TOS do IPv4 para fazer o mesmo. O host do servidor usa o ethtool para direcionar cada valor de TOS para uma fila separada, e o cliente cria pacotes enviados para ter um valor TOS de acordo com a fila de recebimento desejada no servidor.

    Infelizmente, parece que o ethtool está ignorando meus valores de TOS nos filtros (o TOS é sempre 0 nas regras):

    $ sudo ethtool -U em2 flow-type tcp4 tos 1 action 10
    Added rule with ID 2045
    $ ethtool --show-ntuple em2
    16 RX rings available
    Total 1 rules
    Filter: 2045
            Rule Type: TCP over IPv4
            Src IP addr: 0.0.0.0 mask: 255.255.255.255
            Dest IP addr: 0.0.0.0 mask: 255.255.255.255
            TOS: 0x0 mask: 0xff
            Src port: 0 mask: 0xffff
            Dest port: 0 mask: 0xffff
            VLAN EtherType: 0x0 mask: 0xffff
            VLAN: 0x0 mask: 0xffff
            User-defined: 0x0 mask: 0xffffffffffffffff
            Action: Direct to queue 10
    
  • user-def: Eu também tentei com o user-def superar o "problema" do campo TOS, mas parece que eu só posso usar isso nos últimos dois bytes:

    $ sudo ethtool -U em2 flow-type tcp4 user-def 2  action 10
    Added rule with ID 2045
    $ ethtool --show-ntuple em2
    16 RX rings available
    Total 1 rules
    Filter: 2045
            Rule Type: TCP over IPv4
            Src IP addr: 0.0.0.0 mask: 255.255.255.255
            Dest IP addr: 0.0.0.0 mask: 255.255.255.255
            TOS: 0x0 mask: 0xff
            Src port: 0 mask: 0xffff
            Dest port: 0 mask: 0xffff
            VLAN EtherType: 0x0 mask: 0xffff
            VLAN: 0x0 mask: 0xffff
            User-defined: 0x2 mask: 0xffffffffffffff00
            Action: Direct to queue 10
    

    E quando tento comparar alguns outros bytes, ele é simplesmente ignorado (definido pelo usuário é sempre zero e a máscara está cheia):

    $ sudo ethtool -U em2 flow-type tcp4 user-def 2 m 0xf0ffffffffffffff  action 10
    Added rule with ID 2045
    $ ethtool --show-ntuple em2
    16 RX rings available
    Total 1 rules
    Filter: 2045
            Rule Type: TCP over IPv4
            Src IP addr: 0.0.0.0 mask: 255.255.255.255
            Dest IP addr: 0.0.0.0 mask: 255.255.255.255
            TOS: 0x0 mask: 0xff
            Src port: 0 mask: 0xffff
            Dest port: 0 mask: 0xffff
            VLAN EtherType: 0x0 mask: 0xffff
            VLAN: 0x0 mask: 0xffff
            User-defined: 0x0 mask: 0xffffffffffffffff
            Action: Direct to queue 10
    

Alguma ideia de como posso resolver os problemas acima? (qualquer uma das abordagens VLAN ou TOS funcionaria para mim).

Editar : Pergunta esclarecida conforme solicitado pelo @Hauke Laging.

    
por Lluís Vilanova 15.10.2017 / 10:27

1 resposta

0

Você deve deixar claro que tipo de filas deseja equilibrar e com qual efeito.

Além disso, você deve mencionar o que você pode configurar no servidor. Você mencionou a VLAN. Parece que você não pode configurar a VLAN no servidor.

Existem várias possibilidades para enviar pacotes para o mesmo sistema de diferentes maneiras:

  1. Usando diferentes portas TCP / UDP (se o TCP / UDP for usado). Isso pode ser feito de forma transparente para o aplicativo usando o DNAT no cliente e no servidor.
  2. Usando endereços IP diferentes no servidor. Isso pode ser feito de forma transparente para o aplicativo usando o DNAT no cliente e no servidor.
  3. Criando várias interfaces de túnel no cliente e no servidor ( ip link add type ipip ) e enviando os pacotes por várias interfaces.
  4. O enfileiramento de ingresso pode ser feito com o dispositivo ifb e a modelagem de tráfego (com base nas "informações" acima).
por 15.10.2017 / 13:31