O whitepaper do fornecedor diz: 5Mpps sem problemas. Eu já estou atingindo uma parede a 120kpps. Onde está o gargalo?

17

O whitepaper da HP em seus adaptadores QLogic (fka Broadcom) NetXtreme II , que inclui a NIC específica que estou testando, afirma (página 7) que seu desempenho de pacotes pequenos para pacotes de até 256 bytes / pacote está acima de 5.000.000 pacotes / s.

Nos meus testes com um aplicativo em que desabilitei todo o processamento, exceto a mera parte de recebimento de UDP, posso ir até 120.000 pacotes / s apenas. Os pacotes são distribuídos igualmente por 12 grupos multicast.

Percebi que há um núcleo (de 12 núcleos cada um nos 2 soquetes) cuja carga aumenta gradualmente quando eu acelero a taxa de envio UDP e atinge o máximo em cerca de 120.000 . Mas não sei o que esse núcleo está fazendo e por quê. Não é um gargalo de thread único no meu aplicativo, porque não importa se eu executo uma única instância do aplicativo para todos os grupos de difusão seletiva ou 12 instâncias que lidam com 1 grupo de difusão seletiva cada. Portanto, o gargalo não é meu aplicativo receptor.

O MSI está ativado (verificado através da visualização "recursos por tipo" no gerenciador de dispositivos ) e o RSS também está ativado nas configurações da NIC, com 8 filas. Então, o que se apega a esse núcleo? Atualmente, todos os recursos de descarregamento da NIC estão ativados, mas desativá-los não ajudou.

Então, onde poderia estar o gargalo?

Detalhes do sistema:

  • ProLiant BL460c Gen9
  • Intel Xeon E5-2670 v3 (2 x 12cores)
  • Placa de rede HP FlexFabric 10Gb 2 portas 536FLB
  • Windows 2012 R2
Eugene Beresovsky
fonte
2
Provavelmente todas as interrupções rx e tx são tratadas pelo mesmo núcleo. Não sei muito sobre o Windows, mas deve haver alguma afinidade de SMP a ser configurada para espalhar IRQs igualmente relevantes.
Xavier Lucas

Respostas:

13

O RSS também é ativado nas configurações da NIC, com 8 filas.

Infelizmente, isso não significava que o RSS estivesse sendo empregado, pois

netsh int tcp show global

mostrou:

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : disabled

Depois de executar (btw sem reiniciar)

netsh int tcp set global rss=enabled

O RSS começou a funcionar e a carga que antes era acumulada naquele núcleo ruim agora é distribuída igualmente em muitos núcleos em um dos 2 nós NUMA.

Não verifiquei se isso me permitiria lidar com as cargas de Mpps anunciadas, mas o teto foi elevado o suficiente para comparar o que eu precisava.

Eugene Beresovsky
fonte