Ich habe einen Server mit einer 10-GbE-Verbindung zu einem Switch und 10 Clients mit jeweils einer 1-GbE-Verbindung zu demselben Switch.
Wenn ich nuttcp parallel auf jedem der Clients ausführe, kann ich 10 TCP-Datenströme gleichzeitig mit nahezu Drahtgeschwindigkeit (dh knapp 100 Megabyte pro Sekunde von allen 10 Clients gleichzeitig) auf den Server übertragen.
Wenn ich jedoch die Richtung umkehre und Daten vom Server an die Clients sende - dh 10 TCP-Streams, von denen einer an jeden Client geht -, steigt die TCP-Neuübertragung sprunghaft an und die Leistung sinkt auf 30, 20 oder sogar 10 Megabyte pro Sekunde pro Kunde. Ich möchte diese Zahlen ermitteln, da dieses Verkehrsmuster für bestimmte Anwendungen repräsentativ ist, die mir wichtig sind.
Ich habe überprüft, ob mein Server eine 10-GbE-Verbindung sättigen kann, indem ich dasselbe Experiment über eine 10-GbE-Verbindung zu einem ähnlichen Server durchgeführt habe. Ich habe überprüft, dass an keinem meiner Ports Fehler vorliegen.
Wenn ich die TCP-Fenstergröße des Empfängers zwangsweise festklemme (einschränke), kann ich die Bandbreite etwas höher einstellen (30-40 Megabyte / s). und wenn ich es extrem niedrig klemme, kann ich die Neuübertragungen auf Null bringen (mit der lächerlich niedrigen Bandbreite).
Daher bin ich ziemlich sicher, dass ich die Puffer in meinem Switch überlaufe, was zu einem Paketverlust aufgrund einer Überlastung führt. Ich dachte jedoch, dass die Überlastungskontrolle von TCP dies gut bewältigen sollte und sich schließlich bei etwas über 50% der Drahtgeschwindigkeit stabilisierte.
Meine erste Frage ist also sehr einfach: Welcher TCP-Überlastungskontrollalgorithmus ist für meine Situation am besten geeignet? Es gibt eine Menge davon, aber sie scheinen hauptsächlich auf verlustbehaftete Netzwerke oder Netzwerke mit hoher Bandbreite und hoher Latenz oder drahtlose Netzwerke ausgerichtet zu sein ... Nichts davon trifft auf meine Situation zu.
Zweite Frage: Kann ich noch etwas ausprobieren?