Je veux modifier la valeur TCP RTO (délai de retransmission) pour une connexion, et certaines lectures que j'ai faites suggèrent que je pourrais le faire, mais ne révèlent pas où et comment la changer.
J'ai regardé les /proc/sys/net/ipv4
variables, mais aucune des variables n'est liée à RTO. J'apprécierais que quelqu'un me dise comment modifier cette valeur.
linux
linux-kernel
tcp
obiigbe91
la source
la source
ip route replace
- laip route
syntaxe semble avoir un peu changé. J'ai réussi à effectuer la modification avec succès. Juste pour noter, vous devriez commenter la réponse, pas la question si vous voulez me cingler - j'ai essentiellement vu cela par accident, par pure chance que c'était récent :)Réponses:
La raison pour laquelle vous ne pouvez pas modifier spécifiquement le RTO est qu'il ne s'agit pas d'une valeur statique. Au lieu de cela (sauf pour le SYN initial, naturellement), il est basé sur le RTT (Round Trip Time) pour chaque connexion. En fait, il est basé sur une version lissée de RTT et la variance RTT avec quelques constantes jetées dans le mix. Par conséquent, c'est une valeur calculée et dynamique pour chaque connexion TCP, et je recommande fortement cet article qui va plus en détail sur le calcul et le RTO en général.
La RFC 6298 est également pertinente et indique (entre autres):
Le noyau définit-il toujours RTO à 1 seconde alors? Eh bien, avec Linux, vous pouvez afficher les valeurs RTO actuelles pour vos connexions ouvertes en exécutant la
ss -i
commande:Ce qui précède est la sortie d'une machine virtuelle à laquelle je suis connecté avec SSH et a quelques connexions ouvertes sur google.com. Comme vous pouvez le voir, le RTO est en fait réglé sur 200 ish (millisecondes). Vous remarquerez que ce n'est pas arrondi à la valeur de 1 seconde du RFC, et vous pouvez également penser que c'est un peu élevé. C'est parce qu'il y a des limites min (200 millisecondes) et max (120 secondes) en jeu quand il s'agit de RTO pour Linux (il y a une grande explication à cela dans l'article que j'ai lié ci-dessus).
Donc, vous ne pouvez pas modifier directement la valeur RTO, mais pour les réseaux avec perte (comme le sans fil), vous pouvez essayer de modifier le F-RTO (cela peut déjà être activé en fonction de votre distribution). Il existe en fait deux options liées au F-RTO que vous pouvez modifier (bon résumé ici ):
Selon ce que vous essayez d'optimiser, cela peut être utile ou non.
EDIT: suivi de la possibilité de modifier les valeurs rto_min / max pour TCP à partir des commentaires.
Vous ne pouvez pas changer le RTO minimum global pour TCP (en passant, vous pouvez le faire pour SCTP - ceux-ci sont exposés dans sysctl), mais la bonne nouvelle est que vous pouvez modifier la valeur minimale du RTO sur une route par route base. Voici ma table de routage sur ma machine virtuelle CentOS:
Je peux modifier la valeur rto_min sur l'itinéraire par défaut comme suit:
Et maintenant, ma table de routage ressemble à ceci:
Enfin, commençons une connexion et vérifions
ss -i
pour voir si cela a été respecté:Succès! La rto sur la connexion HTTP (après le changement) est de 15 ms, tandis que la connexion SSH (avant le changement) est de 200+ comme avant.
En fait, j'aime cette approche - elle vous permet de définir la valeur inférieure sur les itinéraires appropriés plutôt que globalement là où cela pourrait gâcher le trafic. De même (voir la page de manuel ip ), vous pouvez modifier l’estimation rtt initiale et la rttvar initiale pour l’itinéraire (utilisé lors du calcul du RTO dynamique). Bien que ce ne soit pas une solution complète en termes de peaufinage, je pense que la plupart des éléments importants sont là. Vous ne pouvez pas modifier le paramètre maximum, mais je pense que cela ne sera généralement pas aussi utile dans tous les cas.
la source
rto_max
? Comment définir un délai maximum global?net.ipv4.tcp_retries1
et /net.ipv4.tcp_retries2
ou IIRC similaire) autorisé, je pense que vous pouvez obtenir un équivalent d'un maximum de RTO.