Ich habe nichts Ungewöhnliches an meiner Hardware- oder Kernelkonfiguration gemacht (alle Standardeinstellungen, Neuinstallation des Betriebssystems, Linux-Kernel 3.11 TCP / IP-Stack) und durchschnittlich 3,83 Millionen Nachrichten pro Sekunde über TCP, während ich nur einen Durchschnitt von 0,75 habe Millionen Nachrichten pro Sekunde über UDP. Dies scheint völlig zu trotzen, was ich von den beiden Protokollen erwarte.
Was ist die wahrscheinlichste Ursache für den drastischen Unterschied und wie kann ich ihn unter Ubuntu 13.10 diagnostizieren?
#TCP RESULTS
Recv Send Send Utilization Service Demand
Socket Socket Message Elapsed Send Recv Send Recv
Size Size Size Time Throughput local remote local remote
bytes bytes bytes secs. 10^6bits/s % S % S us/KB us/KB
87380 65536 64 10.00 1963.43 32.96 17.09 5.500 2.852
#UDP RESULTS
Socket Message Elapsed Messages CPU Service
Size Size Time Okay Errors Throughput Util Demand
bytes bytes secs # # 10^6bits/sec % SS us/KB
4194304 64 10.00 7491010 0 383.5 28.97 24.751
212992 10.00 1404941 71.9 25.03 21.381
Für diesen Test habe ich zwei Testserver, die identisch und direkt über ein 10G-Crossover-Kabel verbunden sind. Die in diesem Fall verwendeten NICs sind Intel X520 mit werkseitigen Konfigurationen und werden an einen PCIe 3.0 x8-Steckplatz auf der Hauptplatine angeschlossen, der über einen NUMA-Controller mit der CPU kommuniziert.
quelle
netperf
für die Benchmarks UDP_STREAM- und TCP_STREAM-Tests verwendet, die auf dieselbe CPU und 64-Byte-Nachrichtengrößen festgelegt sind.Antworten:
Abgesehen davon, dass Sie keine detaillierten Informationen zu Ihrem Testaufbau erhalten, scheint das Hauptproblem darin zu liegen, dass Sie eine Nachrichtengröße von 64 Byte verwenden. Dies ist weit entfernt von der üblichen MTU von 1500 Bytes und macht UDP sehr ineffizient: Während TCP mehrere Sends in einem einzigen Paket auf der Leitung zusammenführt (außer wenn TCP_NODELAY festgelegt ist), um die Verbindung effizient zu nutzen, führt jede UDP-Nachricht zu ein separates Paket. In Zahlen: Etwa 23 Nachrichten mit einer Größe von 64 Byte werden zu einem einzelnen TCP-Paket mit MTU-Größe kombiniert, während für UDP 23 einzelne Pakete für dieselbe Datenmenge benötigt werden. Jedes dieser Pakete bedeutet Overhead beim Senden vom Host, Senden auf der Leitung und Empfangen durch den Peer. Und wie in Ihrem Fall zu sehen ist, gehen ungefähr 80% der UDP-Pakete verloren, da Ihre Hardware nicht schnell genug ist, um all diese Pakete zu senden und zu empfangen.
Was Sie also aus diesem Benchmark lernen können, ist:
Was Ihre Erwartung betrifft, sollte UDP besser sein: Haben Sie sich jemals gefragt, warum alle wichtigen Dateiübertragungen (ftp, http, ...) mit TCP-basierten Protokollen durchgeführt werden? Der Benchmark zeigt Ihnen den Grund.
Warum wird UDP überhaupt verwendet?
quelle