Mau rendimento para conexões tcp únicas

2

Eu tenho um servidor com um Gigabit Uplink, e testando com iperf3 com 100 conexões paralelas eu recebo pelo menos 600 MBit / s, dependendo do outro servidor (eu tentei alguns servidores de teste públicos). Mas quando eu executo iperf3 com uma conexão eu recebo 10-15 MBit/s , com dois 20-30 MBit/s e assim por diante.

Eu não tenho regras de iptables muito complicadas e nenhuma outra ideia, porque é tão lenta. Qual pode ser o fator limitante para conexões tcp únicas, que elas são 10 vezes mais lentas que a largura de banda possível?

    
por allo 18.02.2016 / 12:47

2 respostas

0

Eu finalmente encontrei a causa do problema.

Eu tinha um aplicativo web flask, que usa redis para transmitir eventos para o usuário. Quando o usuário desconectou, o aplicativo manteve viva a conexão do pubsub do redis, sem ler mais os dados.

Isso leva a um longo Send-Q / Recv-Q , que aparentemente faz com que a pilha tcp fique lenta e produza avisos de kernel: " TCP: sem memória - considere ajustar tcp_mem ".

  • Correção de curto prazo: elimine os processos com as longas filas de pacotes.
  • Solução a longo prazo: Corrigindo os programas que se comportam mal.
por 24.06.2016 / 19:43
0

Sessões TCP individuais são limitadas pelo tamanho da janela de cada sessão, que representa o número máximo de bytes que podem estar "em voo" entre os dois pontos finais a qualquer momento. Portanto, se você tiver alta latência em seu link, poderá atingir um limite por sessão que é windowSize / RTT.

A única maneira de contornar isso (desde que você geralmente não pode fazer muito sobre o RTT) é usar mais sessões, ou aumentar significativamente o tamanho da janela usando o dimensionamento de janelas. Não sei quais são as configurações do iPerf em relação a isso, ou se você pode ter um firewall ou outro filtro entre os pontos de extremidade que impeça o escalonamento, mesmo se o iPerf e seu servidor o suportarem.

    
por 18.02.2016 / 14:07

Tags