Socket-Udp-Datenrate
-
Hallo,
ich möchte mit Hilfe eines Sockets per UDP das Senden möglichst grosser Datenmengen zwischen 2 PC`s testen.
Dazu erstelle ich mir einen Socket, und rufe in einer Endlosschleife den Befehl sendto(...) mit jeweils 64k Datenpaketen auf. Der Empfang auf dem angeschlossenen PC klappt grundsätzlich auch.
Leider komme ich dabei nur auf eine Datenrate von ca. 85 MByte/sec(680 MBit)was einer Netzwerkauslastung von etwa 73% entspricht. Theoretisch sollte aber doch ein höherer Datendurchsatz möglich sein(1GBit)?Firewall und Virenscanner sind aus.
Im Wireshark sehe ich, daß ich nach jedem Senden eines 64k-Paketes ein Delay von ca. 500µs habe, zwischen dem Senden der einzelnen 1500 Byte Fragmente nur 1 Ms.
Woher könnte die verhältnismässig lange Wartezeit kommen, und was kann ich dagegen tun?
-
Ich würde raten, dass die Wartezeit davon kommt, dass sendto synchron ist (also wartet bis die Operation fertig ist). Danach steht die Netzwerkkarte ohne Daten da und macht Pause. Dann wird der Puffer von deiner Anwendung in die Netzwerkkarte kopiert und dann gehts weiter. Lösung: Du musst den neuen Puffer angeben bevor der alte leer ist, sodass keine Pause entsteht. Entweder mit 2 Threads senden oder nach einer asynchronen Version von sendto suchen.
-
War auch mein erster Gedanke, aber 500µs (0.5ms!) Pause bloss deswegen? Das wäre schon reichlich krass.
EDIT: Andrerseits... je mehr ich darüber nachdenke... ja, das wird der Grund sein. Ich könnte mir vorstellen dass der LAN Adapter immer Interrupt-Coalescing macht, und den "haben fertig" Interrupt immer verzögert, auch wenn die Send-Queue durch das Verschicken des Pakets komplett leer geworden ist. (Vielleicht in der Hoffnung in den 500µs Pause bereits ne Antwort erhalten zu haben, die dann noch im selben Interrupt mit verarbeitet werden könnte.)