Desejo alterar o valor do TCP RTO (tempo limite da retransmissão) para uma conexão, e algumas leituras feitas sugerem que eu poderia fazer isso, mas não revela onde e como alterá-lo.
Eu olhei para as /proc/sys/net/ipv4
variáveis, mas nenhuma delas está relacionada ao RTO. Eu apreciaria se alguém pudesse me dizer como alterar esse valor.
linux
linux-kernel
tcp
obiigbe91
fonte
fonte
ip route replace
- parece que aip route
sintaxe mudou um pouco. Eu fui capaz de fazer a modificação com sucesso. Só para nota, você deve comentar sobre a resposta, não a pergunta se você quer me PING - Basicamente, eu vi isso por acidente, pura sorte que era recente :)Respostas:
A razão pela qual você não pode alterar o RTO especificamente é porque não é um valor estático. Em vez disso (exceto o SYN inicial, naturalmente), ele é baseado no RTT (Round Trip Time) para cada conexão. Na verdade, é baseado em uma versão suavizada do RTT e na variação do RTT com algumas constantes lançadas na mistura. Portanto, é um valor dinâmico calculado para cada conexão TCP, e eu recomendo este artigo que entra em mais detalhes sobre o cálculo e o RTO em geral.
Também relevante é a RFC 6298, que afirma (entre muitas outras coisas):
O kernel sempre define o RTO para 1 segundo? Bem, com o Linux, você pode mostrar os valores atuais de RTO para suas conexões abertas executando o
ss -i
comando:A descrição acima é a saída de uma VM na qual estou conectado com o SSH e tem algumas conexões abertas no google.com. Como você pode ver, o RTO é de fato definido como 200-ish (milissegundos). Você notará que não é arredondado para o valor de 1 segundo da RFC e também pode achar que é um pouco alto. Isso ocorre porque há limites mínimos (200 milissegundos) e máximos (120 segundos) em jogo quando se trata do RTO para Linux (há uma grande explicação sobre isso no artigo que eu linkei acima).
Portanto, você não pode alterar diretamente o valor do RTO, mas para redes com perdas (como a sem fio), você pode tentar ajustar o F-RTO (isso já pode estar ativado, dependendo da sua distribuição). Na verdade, existem duas opções relacionadas ao F-RTO que você pode ajustar (bom resumo aqui ):
Dependendo do que você está tentando otimizar, elas podem ou não ser úteis.
EDIT: acompanhamento da capacidade de ajustar os valores rto_min / max para TCP dos comentários.
Você não pode alterar o RTO mínimo global para TCP (aparte, você pode fazê-lo para SCTP - eles são expostos no sysctl), mas a boa notícia é que você pode ajustar o valor mínimo do RTO em uma rota por rota base. Aqui está minha tabela de roteamento na minha VM CentOS:
Eu posso alterar o valor rto_min na rota padrão da seguinte maneira:
E agora, minha tabela de roteamento fica assim:
Por fim, vamos iniciar uma conexão e verificar
ss -i
se isso foi respeitado:Sucesso! O rto na conexão HTTP (após a alteração) é de 15 ms, enquanto a conexão SSH (antes da alteração) é de mais de 200 como antes.
Eu realmente gosto dessa abordagem - ela permite que você defina o valor mais baixo nas rotas apropriadas, em vez de globalmente, onde isso pode atrapalhar outro tráfego. Da mesma forma (consulte a página de manual do ip ), você pode ajustar a estimativa inicial do rtt e o rttvar inicial da rota (usada ao calcular o RTO dinâmico). Embora não seja uma solução completa em termos de ajustes, acho que a maioria das peças importantes está lá. Você não pode ajustar a configuração máxima, mas acho que em geral não será tão útil.
fonte
rto_max
? Como definimos um tempo limite máximo global?net.ipv4.tcp_retries1
enet.ipv4.tcp_retries2
ou IIRC semelhante) permitido, acho que você pode obter um equivalente a um máximo de RTO.