Performances de Loopback Linux avec TCP_NODELAY activé
Je suis récemment tombé sur une intéressante TCP problème de performance lors de l'exécution des tests de performance qui a comparé les performances du réseau rapport de bouclage de la performance. Dans mon cas, la performance du réseau a dépassé le bouclage de la performance (1Gig réseau, même sous-réseau). Dans le cas, je m'occupe des latences sont cruciales, afin TCP_NODELAY est activé. La meilleure théorie que nous avons est que de contrôle de congestion TCP qui est maintenant en place les paquets. Nous avons fait une analyse des paquets et nous pouvons certainement voir que les paquets sont organisées, mais la raison n'est pas évidente. Maintenant, les questions...
1) Dans ce cas, et pourquoi, serait de communication de bouclage être plus lent que sur le réseau?
2) Lors de l'envoi aussi rapide que possible, pourquoi ne basculement TCP_NODELAY ont beaucoup plus d'impact sur le débit maximum au cours de bouclage que sur le réseau?
3) Comment pouvons-nous détecter et d'analyser de contrôle de congestion TCP comme une explication possible de la mauvaise performance?
4) quelqu'un at-il d'autres théories sur la raison de ce phénomène? Si oui, n'importe quelle méthode pour prouver la théorie?
Voici quelques exemples de données générées par un simple point-à-point c++ application:
De Transport de la Taille du Message (octets) TCP NoDelay Tampon d'envoi (en octets) de l'Expéditeur de l'Hôte Récepteur Hôte Débit (en octets/s) Taux de Messages (messages/sec) TCP 128 Sur 16777216 HostA HostB 118085994 922546 TCP 128 Off 16777216 HostA HostB 118072006 922437 TCP 128 Sur 4096 HostA HostB 11097417 86698 TCP 128 Off 4096 HostA HostB 62441935 487827 TCP 128 Sur 16777216 HostA HostA 20606417 160987 TCP 128 Off 16777216 HostA HostA 239580949 1871726 TCP 128 Sur 4096 HostA HostA 18053364 141041 TCP 128 Off 4096 HostA HostA 214148304 1673033 UnixStream 128 - 16777216 HostA HostA 89215454 696995 UnixDatagram 128 - 16777216 HostA HostA 41275468 322464 NamedPipe 128 - - HostA HostA 73488749 574130
Voici quelques pièces plus d'informations utiles:
- Je ne vois que cette question avec les petits
messages - HostA et HostB les deux ont le même
kit de quincaillerie (Xeon [email protected], 32 cœurs total/128 Gig Mem/1Gig Nic) - OS est RHEL 5.4 noyau 2.6.18-164.2.1.el5)
Merci
source d'informationauteur rns
Vous devez vous connecter pour publier un commentaire.
1) Dans ce cas, et pourquoi, serait de communication de bouclage être plus lent que sur le réseau?
De bouclage met le paquet d'installation+tcp chksum de calcul pour les deux tx+rx sur la même machine, donc il a besoin de faire 2x moins de puissance de traitement, alors qu'avec 2 machines à diviser la tx/rx entre eux. Cela peut avoir un impact négatif sur loopback.
2) Lors de l'envoi aussi rapide que possible, pourquoi ne basculement TCP_NODELAY ont beaucoup plus d'impact sur le débit maximum au cours de bouclage que sur le réseau?
Pas sûr de savoir comment vous êtes venu à cette conclusion, mais le bouclage vs réseau sont mises en œuvre de manière très différente, et si vous essayez de les pousser à la limite, vous atteindrez les différentes questions. Une interface de Loopback (comme indiqué dans la réponse à 1) cause tx+rx charge de traitement sur la même machine. D'autre part, les cartes réseau ont un nombre de limites en termes de la façon dont beaucoup de circulation des paquets qu'ils peuvent avoir dans leur circulaire tampons, etc, qui va entraîner complètement différents goulots d'étranglement (et cela varie grandement d'une puce à trop, et même de l'interrupteur d'entre eux)
3) Comment pouvons-nous détecter et d'analyser de contrôle de congestion TCP comme une explication possible de la mauvaise performance?
De contrôle de Congestion seulement des coups de pied si il y a des pertes de paquets. Voyez-vous la perte de paquets? Sinon, vous êtes probablement frapper des limites sur la taille de la fenêtre tcp vs la latence du réseau de facteurs.
4) quelqu'un at-il d'autres théories sur la raison de ce phénomène? Si oui, n'importe quelle méthode pour prouver la théorie?
Je ne comprends pas le phénomène de vous voir ici. Tout ce que je vois dans votre tableau, c'est que vous avez certaines prises avec un gros tampon d'envoi, ce qui peut être parfaitement légitime. Sur une machine rapide, votre demande sera certainement capable de générer plus de données que le réseau de la pompe, de sorte que je ne suis pas sûr de ce que vous êtes à la classer comme un problème ici.
Une dernière remarque: les petits messages de créer beaucoup plus de performances sur votre réseau, pour diverses raisons, telles que:
1 ou 2) je ne suis pas sûr de savoir pourquoi vous êtes la peine de l'utilisation de bouclage à tous, personnellement, je ne sais pas comment de près, il va imiter une réelle interface et la façon valide, il sera. Je sais que Microsoft désactive NAGLE pour l'interface de bouclage (si vous aimez). Jetez un oeil à ce lienil y a une discussion à ce sujet.
3) je serait près à regarder le premier quelques paquets dans les deux cas et voir si vous obtenez un grave retard dans les cinq premiers paquets. Voir ici
Le est le même problème, j'ai fait face,aussi. Lors du transfert de 2 MO de données entre deux composants s'exécutant dans le même RHEL6 de la machine, il a fallu 7 secondes. Lorsque la taille des données est grand, le temps n'est pas acceptable. Il a pris 1 min de transfert de 10 MO de données.
Puis j'ai essayé avec
TCP_NODELAY
désactivé. Il a résolu le problèmeCela ne se produit pas lorsque les deux composants sont sur deux machines différentes.