Quels sont les inconvénients possibles de la configuration d'un (très) grand initcwnd pour les connexions à large bande passante?

9

J'ai expérimenté les paramètres TCP sous Linux (avec un noyau 3.5). Concernant essentiellement cette connexion:

Serveur: liaison montante Gigabit dans le centre de données, la bande passante réelle (en raison du partage des liaisons montantes) est d'environ 70 Mo / s lorsqu'elle est testée à partir d'un autre centre de données.

Client: LAN local Gigabit connecté à une fibre de 200 Mbits. La récupération d'un fichier de test atteint en réalité 20 Mo / s.

Latence: environ 50 ms aller-retour.

Le serveur distant est utilisé comme serveur de fichiers pour des fichiers de 10 à 100 Mo. J'ai remarqué qu'en utilisant un initcwnd de 10, le temps de transfert de ces fichiers est fortement affecté par le démarrage lent de TCP, prenant 3,5 secondes pour charger 10 Mo (vitesse maximale atteinte: 3,3 Mo / s) car il démarre lentement puis accélère comme il le souhaite est terminé avant que la vitesse maximale ne soit atteinte. Mon objectif est de régler les temps de chargement minimum de ces fichiers (donc pas le débit brut le plus élevé ni la latence aller-retour la plus basse, je suis prêt à sacrifier les deux si cela diminue le temps réel nécessaire pour charger un fichier)

J'ai donc essayé un calcul simple pour déterminer quel initcwnd idéal devrait être, en ignorant toutes les autres connexions et l'impact possible sur les autres. Le produit de retard de bande passante est de 200 Mbit / s * 50 ms = 10 Mbit ou 1,310,720 octets. Étant donné que l'initcwnd est défini en unités de MSS et en supposant que le MSS est d'environ 1400 octets, cela nécessitera un paramètre de: 1.310.720 / 1400 = 936

Cette valeur est très loin de la valeur par défaut (10 * MSS sous Linux, 64 Ko sous Windows), donc ce n'est pas une bonne idée de la définir comme ceci. Quels sont les inconvénients attendus d'une telle configuration? Par exemple:

  • Cela affectera-t-il les autres utilisateurs du même réseau?
  • Pourrait-il créer une congestion inacceptable pour d'autres connexions?
  • Flood router-buffers quelque part sur le chemin?
  • Augmenter l'impact de petites quantités de perte de paquets?
Tomas
la source
1
Pouvez-vous confirmer que vous parlez mégaoctets / s lorsque vous dites 70 MB/set non mégabits? Je cherche juste des éclaircissements.
Andy Shinn
Oui, mégaoctets / s pas mégabits.
Tomas
Si j'étais vous, j'essaierais de le multiplier par 2 fois (10, 20, 40, 80, ...) et de voir comment cela améliore vos temps de téléchargement typiques
mvp

Réponses:

1

Quels sont les inconvénients attendus d'une telle configuration? Par exemple:

Will it affect other users of the same network?

La modification de initcwnd affectera:

  • Les utilisateurs du serveur avec les paramètres changent
  • SI ces utilisateurs correspondent à l'itinéraire, la modification des paramètres est configurée.
Could it create unacceptable congestion for other connections?

Sûr.

Flood router-buffers somewhere on the path?

Pas hors de propos, mais à moins qu'ils ne soient vos routeurs, je me concentrerais sur les problèmes les plus proches de vous.

Increase the impact of small amounts of packet-loss?

Bien sûr, il peut le faire.

Le résultat est que cela augmentera le coût de la perte de paquets, à la fois intentionnelle et non intentionnelle. Votre serveur est plus simple que DOS pour quiconque est capable de terminer la prise de contact à 3 voies (quantités importantes de données pour un faible investissement (quantité de données)).

Cela augmentera également les chances qu'un groupe de ces paquets doive être retransmis car l'un des premiers paquets de la rafale sera perdu.

Slartibartfast
la source
Ok, donc pour résumer: pour un serveur privé avec initcwnd défini uniquement pour les routes correctes, c'est une bonne amélioration pour l'interactivité pour les utilisateurs.
Tomas
0

Je ne pense pas que je comprends parfaitement ce que vous demandez, alors voici une tentative de réponse:

Tout d'abord, ce que vous essayez de faire n'a de sens que du côté de l'envoi et non du côté de la réception. C'est-à-dire que vous devez changer le serveur de fichiers et non le récepteur. En supposant que c'est ce que vous faites:

Changer initcwnd (par exemple) 10 signifie que 10 paquets disparaîtront immédiatement. Si tous atteignent leur cible, vous pouvez vous retrouver avec une fenêtre beaucoup plus grande dans le premier RTT en raison du démarrage lent (l'augmentation exponentielle de la vitesse de rotation). Cependant, en cas de perte de paquets, le cwnd sera réduit de moitié et comme vous êtes en train de déborder de 10 paquets, vous aurez une quantité considérable de retransmissions, vous pouvez donc vous retrouver avec plus de problèmes que vous ne le pensez.

Si vous voulez essayer quelque chose de plus agressif et être en quelque sorte "grossier" avec les autres utilisateurs d'Internet, vous pouvez à la place changer l'algorithme de contrôle de la congestion côté serveur. Différents algorithmes gèrent cwnd d'une manière différente. Gardez à l'esprit que cela affectera tous les utilisateurs à moins que votre logiciel côté serveur ne modifie ces connexions par connexion (ce dont je doute fortement). L'avantage ici est que l'algorithme sera en vigueur même après la perte de paquets alors qu'initcwnd ne jouera pas beaucoup de rôle.

/ proc / sys / net / ipv4 / tcp_congestion_control est l'endroit où vous modifiez l'algorithme de contrôle de congestion.

FWIW pour ces petits RTT (50 ms) et pour les fichiers moyens ou grands, l'initcwnd ne devrait pas affecter beaucoup votre vitesse moyenne. S'il n'y a pas de perte de paquets, alors (c'est-à-dire le gros tuyau), cwnd doublera à chaque RTT. Avec RTT = 50 ms sur un gros tuyau, vous adapterez 20 RTT dans la première seconde, ce qui signifie qu'avec initcwnd = 2, vous vous retrouverez avec cwnd = 2 * 2 ^ 20 après 1 seconde, ce qui, je parie, est plus que vous ne pouvez manipuler ;-)

V13
la source