Durchsatzoptimierung Datenverbindung

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
webben216
User
Beiträge: 2
Registriert: Freitag 13. Januar 2023, 18:18

Hallo zusammen,

ich arbeite gerade an einer Anwendung, bei der ich zwischen zwei Systemen in einem lokalen Netzwerk Datenpakete in beide Richtungen schnellstmöglich übertragen möchte. Der Ablauf ist wie folgt:

- Client sendet etwa 500 kB an Server
- Server führt Operationen auf den Daten aus
- Server schickt Daten an Client zurück

Auf welcher Basis kann man das maximum an Performance am ehesten herausholen? Die Bandbreite beträgt etwa 500 MBit, die Latenz 1-2 ms und eine Verschlüsselung ist nicht notwendig. Komprimierung wird außerhalb abgewickelt.

Über urllib3, flask und gunicorn habe ich bisher moderate Ergebnisse erzieht, mit websocket, flask_sock und gunicorn um etwa 40% schlechtere.

Weitere Ideen:
- eigene Implementierung auf Basis der socket-Bibliothek.
- Programmierung eines eigenen Moduls, welches C++ Boost.Asio verwendet.

Welche Lösungsvorschläge habt ihr? Vielen Dank für alle Antworten.
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

"schnellstmöglich" ist eine schlechte Anforderung, "schnell genug" wäre besser, und dann müßte man definieren, was schnell genug ist.
HTTP hat einen kleinen Overhead, der bei 500kB nicht weiter ins Gewicht fallen sollte. Jede weitere Anstrengung, da etwas "optimieren" zu wollen, sollte gut begründet sein.

Wenn irgendwo nominell 500MBit steht, heißt das bei weitem nicht, dass es möglich ist, diese Bandbreite auch zu nutzen, vor allem nicht, wenn in Deinem lokalen Netz auch noch weitere Rechner hängen.
webben216
User
Beiträge: 2
Registriert: Freitag 13. Januar 2023, 18:18

Sirius3 hat geschrieben: Freitag 13. Januar 2023, 22:48 "schnellstmöglich" ist eine schlechte Anforderung, "schnell genug" wäre besser, und dann müßte man definieren, was schnell genug ist.
HTTP hat einen kleinen Overhead, der bei 500kB nicht weiter ins Gewicht fallen sollte. Jede weitere Anstrengung, da etwas "optimieren" zu wollen, sollte gut begründet sein.

Wenn irgendwo nominell 500MBit steht, heißt das bei weitem nicht, dass es möglich ist, diese Bandbreite auch zu nutzen, vor allem nicht, wenn in Deinem lokalen Netz auch noch weitere Rechner hängen.
Sagen wir es so: Jede gewonnene Millisekunde durch vermiedenen Overhead verbessert die Anwendung sehr wesentlich. Eine spezifische Lösung, die auf auf einer niedrigen Schicht aufbaut, ist kein Problem.

Die 500 MBit sind der gemessene durchschnittliche Durchsatz bei der Übertragung von großen Dateien. Die Varianz ist sehr klein.
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie hast Du denn diesen durchschnittlichen Durchsatz ermittelt? Und wie stark weicht der von Deiner anderen Lösung ab? Und warum benutzt Du dann diese andere Lösung, wenn Du doch schon ein Programm hast, das besser ist?

Bevor man anfängt irgendwo etwas zu optimieren, muß man zuerst messen, wo wieviel Zeit vergeht; erst dann macht es überhaupt Sinn sich zu überlegen, welche Stelle, die relativ viel Zeit verbraucht zu verbessern.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

@webben216: Sirius3 hat recht. Es macht keinen Sinn sich über Optimierungen Gedanken zu machen, wenn man noch gar nicht gemessen hat.

Wenn du jetzt auf ganz anderem Wege Daten über das Netzwerk gesendet hast, um herauszufinden, welche Bandbreite du hast, ist das ziemlich sinnlos. Es klingt nämlich so. Es ist ein großer Unterschied eine Verbindung aufzubauen und da nur 5KB oder 5GB drüber zu senden.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Grundsaetzlich sehe ich keinen Grund, auf C++ zu wechseln, weil Netzwerkkommunikation IO-bound ist. Was nun en detail die beste Lösung für den Durchsatz ist, hängt sehr von den verwendeten Systemen ab. Es gibt zB sowas wie https://www.kernel.org/doc/html/v4.18/n ... ocopy.html, und andere Tricks.

Und dann hast du hier Anforderungen, die im Konflikt miteinander stehen: Latenz vs Durchsatz. Auf Durchsatz zu optimieren beutetet, Pakete hintenanzustellen, statt dringlich zu bearbeiten. Ob deine Millisekunden-empfindliche Anwendung in der Summe besser läuft, weil eine einzelne Workload schneller durchgeht, aber andere dafür anstehen müssen, musst du selbst rausfinden.
Antworten