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 .
fonte
Respostas:
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
Captura de tela desse vídeo (44:33):
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:
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)
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
(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:
fonte
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:
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:
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
Btw eles também afirmam que
e Argon usam o switch Arista 7124FX , que (além de um FPGA) possui um SO
fonte
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.
fonte