Distribuir pacotes IP em diferentes filas NIC com MSI (Message Signaled Interrupts)

2

NetXtreme II A NIC Ethernet Gigabit BCM5709 suporta o recurso MSI (Message Signaled Interrupts) e possui 8 filas. Cada fila tem seu próprio manipulador de interrupção em / proc / interrupts. O que eu estou tentando realizar é dizer ao NIC quais pacotes devem ir para qual fila.

Perguntas:

  1. É possível especificar manualmente quais pacotes IP devem ir para qual fila por tipo de protocolo encapsulado (por exemplo, pacotes IPsec entram em uma fila, enquanto pacotes TCP entram em outra fila)?
  2. Se for possível - como posso fazê-lo no Linux?
  3. Se não for possível - devo ver as placas NIC compatíveis com MSI-X para resolver este problema?

Mais detalhes:

Temos uma interface que está finalizando o IPSec e encaminhando / encerrando as conexões TCP. A descriptografia de pacote IPSec está embutida (isso significa que a descriptografia é feita sob o mesmo contexto ksoftirqd / X). Estamos tentando descobrir se poderemos melhorar o desempenho total se os pacotes IPSec forem agendados em outra CPU que os pacotes TCP. Uma limitação a mais é que o código IPSec não é MP-safe, portanto não posso executá-lo sob mais de um ksoftirqd / X. Por padrão, parece que os pacotes são distribuídos / hashed pelo IP de origem nas 8 filas NIC. O gargalo é o IPSec que sufoca o tráfego TCP enquanto decifra / criptografa os pacotes IPSec em ~ 100% da CPU no contexto do ksoftirqd / X.

O SO é o Ubuntu 10.10 (2.6.32-27-server) e o NIC é o Broadcom BCM5709.

    
por Hans Solo 07.02.2011 / 23:47

1 resposta

2

Se alguém mais estiver tentando descobrir como fazer com que a pilha TCP / IP do Linux Networking seja dimensionada em vários núcleos de CPU ...

O MSI pode ser explorado por duas tecnologias de NIC subjacentes para distribuir pacotes em várias filas. Cada fila NIC é manipulada por uma interrupção diferente em um núcleo de CPU dedicado para obter escalabilidade:

  1. RSS (Receive Side Scaling) - distribui pacotes para diferentes filas por IP de origem e destino e, se aplicável, por portas de origem e de destino TCP / UDP.
  2. VMDq (filas de dispositivo de máquina virtual) - distribui pacotes por endereço MAC ou tags de VLAN. Usado principalmente pelos hipervisores de VM, mas não vejo nenhum motivo para que ele não possa ser usado em configurações de não-VM.

O problema com o RSS é que ele sempre usa IP de origem para gerar um hash. Hash é usado para encontrar em qual fila este pacote deve ir. Isso significa que não é possível controlar quais pacotes devem ir para qual fila, a menos que ele também tenha controle sobre os IPs de origem.

O VMDq parece ser mais apropriado para o meu problema, porque ele distribui pacotes pelo endereço MAC de destino. Pode ser tão simples quanto atribuir dois endereços IP diferentes à mesma interface.

Fonte:

por 10.02.2011 / 23:28