Estou tentando melhorar minha taxa de transferência TCP através de uma "rede de alto atraso" entre máquinas Linux.
I definido tcp_mem
, tcp_wmem
e tcp_rmem
com “8192 7061504 7061504”.
Eu definir rmem_max
, wmem_max
, rmem_default
e wmem_default
para “7061504”.
I definir netdev_max_backlog
e txqueuelen
a 10000.
conjunto I tcp_congestion_control
para “escalável”.
Estou usando o “nist” (cnistnet) para simular um atraso de 100ms, e o BW que alcanço é de cerca de 200mbps (sem demora, chego a 790mbps).
Estou usando o iperf para executar os testes e o TCPTrace para analisar os resultados, e aqui está o que eu tenho:
No lado do receptor:
max win adv: 5294720 bytes
avg win adv: 5273959 bytes
sack pkts enviados: 0
No lado do remetente:
bytes de dados reais: 3085179704
bytes de dados rexmt: 9018144 owin
máximo: 5294577 bytes
médios: 3317125 bytes
RTT min: 19,2 ms
RTT máx: 218,2 ms
RTT méd: 98,0 ms
Por que alcanço apenas 200mbps? Eu suspeito que o "owin" tenha algo a ver com isso, mas não tenho certeza (esses resultados são de um teste de 2 minutos. Um teste de 1 minuto teve um "avg owin" de 1552900) ...
Estou errado em esperar que a taxa de transferência seja de quase 790mbps, mesmo que o atraso seja de 100ms?
(Tentei usar números maiores nas configurações da janela, mas isso não pareceu ter efeito)
Respostas:
Esse é um problema comum do TCP chamado "Long Fat Pipe". Se você pesquisar no Google essa frase e o TCP, encontrará muitas informações sobre esse problema e possíveis soluções.
Esse segmento tem vários cálculos e sugestões sobre o ajuste da pilha TCP do Linux para esse tipo de coisa.
fonte
O site
http://www.psc.edu/networking/projects/tcptune/
menciona que, como o Linux atualmente atualiza automaticamente as configurações de TCP, mexer com os valores provavelmente não melhorará as coisas.
Dito isto, talvez 100 ms em conjunto com uma grande largura de banda (pelo menos 790 mbps) podem levar a um enorme BDP, portanto, talvez o ajuste automático decida que algo está errado e não vai longe o suficiente.
fonte
Tente configurar o tamanho da janela do iperf para realmente usar o produto do atraso da largura de banda desse link. Tão avg. RTT * 1Gbps deve fornecer aproximadamente 10 MB. Veja se isso melhora as coisas.
fonte
A única maneira de realmente começar a entender o que está acontecendo é obter mais dados; caso contrário, você está apenas adivinhando ou pedindo que outras pessoas adivinhem. Eu recomendo obter uma visualização no nível do sistema (CPU, memória, interrupções etc.)
sar
doiostat
pacote. Além disso, você deve obter um dump de pacotes com o Wireshark ou o tcpdump. Você pode usar o Wireshark para analisá-lo, pois ele possui muitas ferramentas para isso. Você pode representar graficamente o tamanho da janela ao longo do tempo, perda de pacotes etc.Mesmo uma pequena perda de pacotes em um link de alta latência tende a prejudicar bastante a largura de banda. Embora esteja sendo simulado - isso é um pouco estranho. Muitos pacotes pequenos também podem causar altas interrupções (mesmo que também possam ser simulados?).
Em resumo, faça com que o TCPDump e o Sar vejam o que está acontecendo no nível dos pacotes e com os recursos do sistema.
fonte
Quanta memória esta máquina possui? As
tcp_mem
configurações parecem insanas, ele configurou 28 gb (7061504 * 4kb) para dados TCP globalmente. (Mas esse não é o seu problema de desempenho, pois você provavelmente não atingiu esse limite em uma execução de teste de poucos soquetes. Só queria mencionar isso, pois definir tcp_mem como valores tcp_xmem mostra um conceito errado muito comum).O 7mb que você configurou para o padrão parece ok. O máximo, no entanto, pode subir muito mais alto em tubos de atraso grandes. Para testar, usaria 64 MB como o número máximo de
tcp_wmem
etcp_rmem
, então você pode descartar que esse é seu fator limitante. (Isso incha seus buffers, portanto, só funciona se você tiver simultaneidade limitada e a conexão tiver baixa instabilidade e quedas).fonte