É possível processar milhões de datagramas por segundo com o Windows?

11

Estou investigando se posso implementar um aplicativo HPC no Windows que receba pequenos datagramas de difusão seletiva UDP (principalmente de 100 a 400 bytes) a uma taxa alta, usando uma dúzia ou até talvez 200 grupos de difusão seletiva (por exemplo, usando MSI-X e RSS). dimensionar para vários núcleos), faz algum processamento por pacote e depois o envia. Enviando via TCP, eu consegui subir o máximo que precisava (6,4 Gb / s) sem bater na parede, mas receber datagramas com altas taxas de pps acabou sendo um problema.

Em um teste recente em uma máquina NUMA de alta especificação com uma NIC Ethernet de 10 Gb de 2 portas no Windows 2012 R2, só consegui receber centenas de milhares de datagramas UDP por segundo (queda antecipada, ou seja, sem realmente processar os dados, para remova a sobrecarga de processamento do meu aplicativo da equação para ver o quão rápido ele fica) usando núcleos 2x12, e a parte do kernel dos 12 grupos multicast testados parecia ser distribuída por 8 ou 10 núcleos de um nó NUMA (as filas máx. RSS foram definidas 16) - embora com um aplicativo .net, os aplicativos nativos possam ir mais rápido.

Mas mesmo Len Holgate conseguiu receber pacotes UDP a 500kpps em seus testes de alto desempenho do Windows RIO , usando uma carga útil UDP de 1024 bytes.

No whitepaper da QLogic (sistema operacional em teste não mencionado), os limites para o "roteamento de pacotes super pequenos e múltiplos encadeados" (de modo que inclui o recebimento e o envio subsequente?) São fixados em 5,7Mpps . Em artigos sobre redes Linux , os limites são definidos em 1Mpps a 2Mpps por núcleo (aumentando de forma linear ou mais linear) ou até 15Mpps com soluções especiais que ignoram o kernel.

Por exemplo, netmap

pode gerar tráfego na taxa de linha ( 14,88Mpps ) em um link de 10GigE com apenas um único núcleo rodando a 900Mhz. Isso equivale a cerca de 60 a 65 ciclos de clock por pacote e escala bem com núcleos e frequência de clock (com 4 núcleos, a taxa de linha é alcançada em menos de 450 MHz). Taxas semelhantes são alcançadas no lado de recebimento .

Até que ponto posso levar (as versões mais recentes) do Windows / Windows Server, em particular recebendo multicast UDP, conforme descrito no parágrafo principal?

Editar Há uma postagem no blog cloudflare - e uma seção de comentários interessantes - sobre como fazê-lo no Linux: como receber um milhão de pacotes por segundo e a página de comentários de notícias de hackers correspondente .

Eugene Beresovsky
fonte
@ Ramhound Em teoria, provavelmente é possível no Windows. Mas como é possível na prática? Até agora, já deparei com alguns relatórios de pessoas que atingem esses níveis no linux em hardware padrão, mas nenhum deles chegando perto do Windows. E como você acha que eu poderia reduzir o escopo da pergunta? É apenas isso: "Quais são as taxas mais altas de recebimento de multicast UDP no Windows?". A maior parte do texto na minha pergunta são apenas exemplos que devem mostrar que é possível com o linux - e que eu fiz minha lição de casa.
Eugene Beresovsky
@ Ramhound 'Se possível no Linux, possível no Windows'. Eu discordo respectivamente .. um sistema que instantaneamente vem à mente é o iptables .. sim, boa sorte imitando esse sistema no Windows. ^ _ ^
NiCk Newman
Na verdade, eu não estava me esforçando tanto, então você sempre pode pegar todo o código que tenho disponível para os testes do RIO que fiz e continuar pressionando.
precisa

Respostas:

5

De acordo com a Microsoft, testes em seu laboratório mostraram que "em um servidor específico no teste inicial" do RIO , eles conseguiram lidar com

  • 2Mpps sem perda no Windows Server 2008R2, ou seja, sem RIO
  • 4Mpps no Windows Server 8 (pré-lançamento) usando o RIO

Captura de tela desse vídeo (44:33):

insira a descrição da imagem aqui

Portanto, a resposta para minha pergunta Is it possible to process millions of datagrams per second with Windows?seria: Sim , e aparentemente antes do RIO, no Windows Server 2008R2.

Mas, além das figuras oficiais, especialmente em softwares não lançados, que precisam ser tomadas com uma pitada de sal, com apenas as informações esparsas fornecidas nesta apresentação, muitas perguntas sobre o teste e, portanto, como interpretar adequadamente os resultados, permanecem. Os mais relevantes são:

  1. Os valores são para envio? Recebendo? Ou talvez para Roteamento (ou seja, Receber + Enviar)?
  2. Qual o tamanho do pacote? -> Provavelmente o mais baixo possível, como geralmente é feito ao tentar fazer com que os números dos pps se gabem
  3. Quantas conexões (se TCP) / fluxos de pacotes (se UDP) ? -> Provavelmente o número necessário para distribuir a carga de trabalho, para que todos os núcleos presentes possam ser usados
  4. Qual configuração de teste? Especificações e fiação da máquina e da placa de rede

O primeiro é crucial, porque os Envios e Recebimentos exigem etapas diferentes e podem mostrar diferenças substanciais no desempenho. Para as outras figuras, provavelmente podemos assumir que o menor tamanho de pacote, com pelo menos um fluxo de conexão / pacote por núcleo, estava sendo usado em uma máquina de alta especificação para obter os valores máximos possíveis de Mpps.


Edit Acabei de encontrar um documento da Intel sobre High Performance Packet Processing no Linux e, de acordo com isso, o (Linux)

plataforma pode sustentar uma taxa de transação de cerca de 2 milhões de transações por segundo

usando a pilha de rede padrão do Linux (em um host físico com 2x8 núcleos). Uma transação neste teste de solicitação / resposta inclui ambos

  1. recepção de um pacote UDP
  2. encaminhamento subsequente desse pacote

(usando o netserver do netperf). O teste estava executando 100 transações em paralelo. Há muito mais detalhes no artigo, para os interessados. Eu gostaria que tivéssemos algo assim para o Windows comparar ... Enfim, aqui está o gráfico mais relevante para esse teste de solicitação / resposta:

insira a descrição da imagem aqui

Eugene Beresovsky
fonte
2

tl; dr

Para dar uma resposta definitiva, mais testes parecem necessários. Porém, evidências circunstanciais sugerem que o Linux é o sistema operacional usado praticamente exclusivamente na comunidade de latência ultrabaixa, que também processa rotineiramente as cargas de trabalho de Mpps. Isso não significa que seja impossível com o Windows, mas o Windows provavelmente ficará para trás um pouco, mesmo que seja possível obter números de Mpps. Mas isso precisa ser testado e, por exemplo, descobrir a que custo (CPU) esses números podem ser alcançados.

NB: Esta não é uma resposta que pretendo aceitar. O objetivo é dar a qualquer pessoa interessada em uma resposta à pergunta algumas dicas sobre onde estamos e onde investigar mais.


Len Holgate, que de acordo com o Google parece ser o único que testou o RIO para obter mais desempenho das redes Windows (e publicou os resultados), apenas esclareceu em um comentário em seu blog que estava usando um único combo IP / Port para enviar os pacotes UDP.

Em outras palavras, seus resultados devem ser comparáveis ​​às figuras de núcleo único em testes no Linux (embora ele esteja usando 8 threads - o que, sem ter verificado seu código ainda, parece prejudicial ao desempenho ao lidar com apenas um único fluxo de pacotes UDP e não fazendo qualquer processamento pesado dos pacotes, e ele menciona que apenas alguns threads são realmente usados, o que faria sentido). Isso apesar dele dizer:

Eu não estava tentando tanto obter o desempenho máximo apenas para comparar o desempenho relativo entre APIs antigas e novas e, portanto, não fui tão minucioso em meus testes.

Mas o que está abandonando a zona de conforto (relativa) do IOCP padrão para o mundo mais difícil da RIO, além de "se esforçar"? Pelo menos no que diz respeito a um único fluxo de pacotes UDP.

Eu acho que o que ele quer dizer - como ele tentou várias abordagens de design em vários testes do RIO - é que ele não ajustou, por exemplo, as configurações de NIC para reduzir o último desempenho. Que, por exemplo, no caso de Receive Buffer Size, pode ter um enorme impacto positivo no desempenho de recebimento de UDP e nos números de perda de pacotes.

O problema, porém, ao tentar comparar diretamente seus resultados com os de outros testes Linux / Unix / BSD é o seguinte: A maioria dos testes, ao tentar empurrar o limite de "pacotes por segundo", usa o menor tamanho possível de pacote / quadro, ou seja, uma Ethernet quadro de 64 bytes. Len testou pacotes de 1024 bytes (-> um quadro de 1070 bytes), que (especialmente para o No-Nagle UDP) podem obter valores muito mais altos de "bits por segundo", mas podem não forçar o limite de pps o máximo possível com pacotes menores . Portanto, não seria justo comparar esses números como estão.

Resumindo os resultados de minha busca no Windows UDP, recebo desempenho até agora:

  • Ninguém realmente está usando o Windows ao tentar desenvolver aplicativos de latência ultra baixa e / ou alto rendimento, hoje em dia eles estão usando o Linux
  • Hoje em dia, praticamente todos os testes e relatórios de desempenho com resultados reais (ou seja, não são meros anúncios de produtos) estão em Linux ou BSD (obrigado Len por ser pioneiro e fornecer pelo menos um ponto de referência!)
  • O UDP (soquetes padrão) no Windows é mais rápido / mais lento que no Linux? Ainda não sei dizer, teria que fazer meus próprios testes
  • O UDP de alto desempenho (RIO x netmap) no Windows é mais rápido / mais lento que no Linux? O Linux lida facilmente com velocidade de linha total de 10 Gb com um único núcleo a 900 MHz, Windows, no melhor caso publicado, pode subir até 43% ou 492 kpps para um tamanho de pacote UDP grande de 1024, ou seja, números de bps para tamanhos menores provavelmente serão significativamente pior, embora os números de pps provavelmente aumentem (a menos que o manuseio de interrupção ou algum outro custo adicional do espaço do kernel seja o fator limitante).

Quanto ao motivo pelo qual eles usam o Linux, isso deve ser porque o desenvolvimento de soluções que envolvem alterações no kernel como netmap ou RIO - necessário quando o desempenho é levado ao limite - é quase impossível com um sistema fechado como o Windows, a menos que seus salários cheguem a Redmond, ou você tem algum contrato especial com a Microsoft. É por isso que o RIO é um produto MS.

Por fim, apenas para dar alguns exemplos extremos do que eu descobri foi e está acontecendo no Linux:

Já há 15 anos, alguns estavam recebendo 680kpps usando uma CPU Pentium III de 800 MHz e barramento frontal de 133 MHz em uma placa de rede de 1 GbE. Edit : Eles estavam usando o Click , um roteador no modo kernel que ignora grande parte da pilha de rede padrão, ou seja, eles "trapacearam".

Em 2013, a Argon Design conseguiu obter

assinale para negociar latências tão baixas quanto 35ns [nano segundos]

Btw eles também afirmam que

A grande maioria do código de computação existente para negociação atualmente é escrita para arquiteturas de processadores Linux on x86.

e Argon usam o switch Arista 7124FX , que (além de um FPGA) possui um SO

construído sobre um kernel Linux padrão.

Eugene Beresovsky
fonte
0

Você certamente precisará "medir" diferentes configurações e cenários. Isso pode ser feito com o AFAIK com dois equipamentos fornecidos por duas empresas. IXIA e Spirent . Eles oferecem geradores de tráfego baseados em hardware, capazes de bombear tráfego na velocidade da linha. Eles oferecem teste de rampa, onde você pode detectar a velocidade com que seu sistema específico pode entrar em colapso. Os dispositivos são caros, mas você pode alugá-los.

Pat
fonte