4 votes

Pourquoi UDP est-il plus lent que TCP sur le serveur Ubuntu ?

Je transfère des données entre deux serveurs Ubuntu (12.04) via iperf sur un réseau local de 1Gb.

iperf -s    <->     iperf -c <addr> -n2G
TCP speed = 925 Mbits/sec

iperf -su   <->     iperf -uc<addr> -b1G -n2G
UDP speed = 810 Mbits/sec
Jitter = 0.016 ms
Lost = 0 .. 0.01%

Je m'attendais à ce que UDP soit beaucoup plus rapide que TCP. Quelqu'un pourrait-il expliquer pourquoi UDP est plus lent que TCP sur un serveur Ubuntu ?

12voto

pehrs Points 8739

Chaque trame passe par plusieurs tampons lors de son envoi : Le tampon d'application, le tampon de protocole, le tampon d'interface logicielle et le tampon d'interface matérielle. Lorsque vous commencez à solliciter la pile en envoyant des données à grande vitesse, vous remplissez ces tampons et bloquez ou perdez des données. Vous disposez également de stratégies pour la rapidité et l'interrogation qui peuvent avoir un impact sur vos performances. Par exemple, en utilisant un tampon plus grand et en interrogeant moins souvent, vous pouvez obtenir de bien meilleures performances tout en sacrifiant la latence.

Dans le noyau Linux, TCP est optimisé pour les transferts de masse à grande vitesse, tandis que UDP est optimisé pour une faible latence. Cela a un impact sur la taille des tampons et sur la manière dont les données sont interrogées et transférées. En plus de cela, vous avez souvent un déchargement matériel pour TCP. Je m'attendrais à des performances nettement supérieures pour TCP par rapport à UDP.

Notez que l'envoi de données à haut débit via UDP est généralement une mauvaise idée, à moins que vous n'implémentiez votre propre contrôle de congestion. TCP protège votre réseau des effondrements dus à la congestion. Utilisez UDP lorsque vous avez de petites quantités de données ou des exigences élevées en matière de rapidité.

10voto

TheDeveloper Points 151

Comme il a été dit plus haut, iperf se limite de par sa conception. Dans src/Client.cpp , méthode

void Client::Run( void )

appelle

ReportPacket( mSettings->reporthdr, reportstruct );

après avoir écrit chaque datagramme UDP.

ReportPacket() est plutôt lent et cela ralentit l'ensemble.

Dans iperf3, les écritures en rafale sont introduites pour UDP, vous pouvez spécifier le nombre d'écritures en rafale dans le champ -b paramètre de ligne de commande, comme -b 10240M/2000

sinon, vous pouvez utiliser netperf avec -t UDP_STREAM .

8voto

berebere Points 81

Le problème se trouve dans iperf lui-même. Lorsque vous envoyez un flux UDP, iperf effectue une comptabilité interne pour chaque datagramme du flux. En revanche, lorsque vous envoyez un flux TCP, iperf n'effectue la comptabilisation qu'une seule fois par flux. Dans mes mesures, il s'est avéré que iperf-UDP perd beaucoup de temps à effectuer les mesures par datagramme, d'où les performances plus lentes.

Si vous voulez vraiment comparer les performances de TCP et UDP, il est préférable d'écrire votre propre programme de test. et assurez-vous que la quantité de calculs est la même dans les deux cas.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X