Receber muitos pacotes UDP & carga do ksoftirqd

1

Eu quero que meu servidor possa manipular mais de 1Mpps de um cartão de 10g. É possível? Eu tenho o Ubuntu 14.04 com o kernel 3.11 e uma máquina Xeon de 16 núcleos. Parece que o ksoftirqd se torna um gargalo em 300kpps.

Existe algum guia sobre como ajustar o servidor para lidar com essa carga?

    
por Masood_mj 18.10.2014 / 18:15

2 respostas

1

O que você precisa aqui é um mecanismo de kernel-bypass (essa é a opção mais fácil para minha opinião). Atualmente, há dois mecanismos populares que fazem isso e podem atingir o envio de pacotes na linha de preço:

  • DPDK - ele suporta seu cartão (Intel 82599 ) e deve funcionar no seu sistema operacional
  • PF_RING ZC - também suporta o seu cartão e deve funcionar no seu SO

Eu usei os dois e depois de algum tempo de aprendizado, devo dizer que eles são muito convenientes e fáceis de usar

    
por 06.02.2016 / 08:20
0

Aqui está um artigo prático, apesar de ter sido perguntado 9 meses atrás:

link

Basicamente, a resposta é sim, muito facilmente. Neste momento, eu tenho um servidor UDP recebendo 1.08Mpps, em uma máquina Xeon de 20/2 Ghz com Intel NIC 82599 10G.

Minha configuração é basicamente:   Ubuntu 14.04 com 3.13.0-57-lowlatency (LL faz a diferença)   sinalizador de kernel isolcpus excluindo os núcleos 10-19 (um nó NUMA)   Tarefas do processo do servidor UDP para o núcleo 10   Interrupções de hardware da fila RX atendidas pelo núcleo 11   RPS para fila RX mapeada para o núcleo 12

O uso da CPU é de 100% no núcleo 10, ~ 45% de interrupção de hardware no núcleo 11 e 100% de ksoftirqd no núcleo 12. O uso de todos os demais núcleos é insignificante.

Eu experimentei usar 100% de todos os 20 núcleos e alcancei cerca de 7Mpps, mas tenho certeza que poderia ser ainda mais otimizado.

Claro, você poderia simplesmente usar o DPDK e parar de mexer com todas aquelas interrupções.

    
por 23.07.2015 / 17:12

Tags