Wie kann ich den Systemanruf-Overhead reduzieren, wenn eine große Anzahl von UDP-Paketen gesendet wird? (sowohl Windows als auch Linux) - Linux, Windows, Sockets, UDP

Zum Beispiel sende ich 100000 UDP-Pakete unter Windows. Für jedes Paket muss ich anrufen WSASendTo() einmal, also wahrscheinlich viel system call overheadist vorgestellt. Gibt es eine Möglichkeit, Massensendungen zu senden und diesen Overhead zu reduzieren? Ich konnte nach dem googlen für eine Weile keine Lösung für Windows finden. Außerdem würde ich gerne wissen, ob dies unter Linux möglich ist. Vielen Dank.

Antworten:

2 für die Antwort № 1

Unter Windows können Sie das neue registrierte Windows-E / A-API (RIO) auf Server 2012 und Windows 8 und höher verwenden.

Ich habe viel darüber geschrieben Hier und haben mehrere Leistungsvergleiche mit den vorherigen APIs durchgeführt, die unter Windows verfügbar sind. Die Leistungstests können gefunden werden Hier.

Zusammenfassend: "Die registrierten E / A-Netzwerkerweiterungen, RIO,ist eine neue API, die Winsock hinzugefügt wurde, um High-Speed-Networking für höhere Netzwerkleistung mit geringerer Latenz und Jitter zu unterstützen. Diese Erweiterungen zielen hauptsächlich auf Serveranwendungen ab und verwenden vorregistrierte Datenpuffer und Abschlusswarteschlangen, um die Leistung zu erhöhen. Die erhöhte Leistung ergibt sich aus der Notwendigkeit, Speicherseiten zu sperren und zu kopieren OVERLAPPED Strukturen in den Kernel-Raum wenn individuellAnfragen werden ausgegeben, die sich stattdessen auf vorab gesperrte Puffer, Abschlusswarteschlangen mit fester Größe, optionale Ereignisbenachrichtigung bei Vervollständigungen und die Möglichkeit, mehrere Vervollständigungen vom Kernel-Space auf einmal in den Benutzerbereich zurückzugeben, verlassen. "

Die Ergebnisse meiner Leistungstests scheinen zu implizieren, dass es funktioniert.


0 für die Antwort № 2

Benutzen TransmitPackets() in Windows.


Am beliebtesten