Quando o kernel corta o datagrama UDP em blocos MTU?

3

Preciso da sua ajuda / dicas / observações sobre um problema que estou tendo. Obrigado

Aqui está um contexto: Eu tenho dois aplicativos (A1 e A2) lidando com PDUs com um tamanho máximo de 1700 bytes. Cada aplicativo está em um cartão diferente (C1 e C2) conectado diretamente entre si usando Ethernet de 1 Gbps, e os dois aplicativos enviam e recebem usando soquetes UDP. Card C2 é muito mais poderoso o C1, A1 & A2 são iguais.

Embora as PDUs possam ter até 1700 bytes, quando cada aplicativo envia e recebe PDUs, elas NUNCA são maiores que 1450 bytes. Portanto, com um MTU típico de 1500 bytes, há um mapeamento de 1 para 1 entre PDUs e quadros Ethernet.

Tudo funciona bem com vários datarates, exceto o mais alto (~ 125Mbps FYI), onde o cartão menos potente C1 alcança 100% do uso da CPU em torno de 90Mbps.

Comecei a analisar como melhorar o desempenho global, observando a comunicação da rede. Antes de tudo entrar em uma condição de trabalho, decidi começar a usar soquetes UDP conectados, pois li que, de alguma forma, eles eram mais rápidos, ignorando alguns passos no kernel. Então eu suponho que eles são melhores, já que eu nunca tive tempo para implementar sua contraparte não conectada.

Observação 0: Estou aberto a qualquer resposta argumentando por que os soquetes UDP conectados são mais rápidos

Eu então comecei a aumentar o MTU entre C1 e C2 == > Nenhuma melhoria desde que eu ainda send PDUs de 1450 bytes max sobre o fio.

Próxima etapa: agregação de PDU. Em vez de enviar PDUs 1 por 1, eu os agrupo em grandes datagramas UDP de ~ 60KB e os envio por fio com uma MTU de 1500 == > Sem melhorias (o Kernel corta o grande datagrama em algum ponto para acabar com um frame ethernet com um comprimento típico. Sem perda de pacote no outro lado, então meu mecanismo deve estar bem.

Pergunta 1: Apenas por curiosidade, quando o kernel corta meus dados em dados menores (semelhantes a MTU)? Pouco antes de enviá-lo para o IP? Antes da Ethernet? Lower (então a NIC está encarregada disso?)

Última etapa: Envie as PDUs agregadas usando uma MTU grande nos dois lados (3000 5000 6000 8192). Existe o problema. Quanto mais eu aumentar meu MTU, mais erros eu tenho!

Pergunta 2: Alguém já experimentou isso? Espera-se que ambos os módulos de cartão suportem quadros jumbo de ethernet. Como poderia ser ? Alguma dica sobre onde olhar?

FYI, o gargalo C1 executa o kernel 2.6.23, então opções como sendmmsg não são uma opção.

Para mais informações, tenho dois conjuntos de 2 cartões. C2 recupera 125 Mbps de um gerador de tráfego (1 PDU por vez), envia para C1 (1 PDU por vez), que envia o fluxo de dados no ar (várias PDUs por vez). C1 'captura os dados no ar (não é possível dizer como, é mágico) (vários PDus de cada vez, depois enviam-nos para C2' (um de cada vez, mas tentando enviar muitos de cada vez, uma vez que não está funcionando C2 'finaliza o loop enviando dados de volta ao gerador de tráfego, que compara com os dados enviados anteriormente e imprime muitos detalhes.

Obrigado pelo seu tempo,

SOKS

    
por SOKS 05.04.2017 / 19:00

0 respostas

Tags