Low-Level-.NET-6-Netzwerkbibliotheken, die auf UDP-Socket-Leistung getestet wurden
NBN ist ein Benchmark für Low-Level-Netzwerkbibliotheken mit UDP und kann mit Unity und für eigenständige .Net Core-Serveranwendungen verwendet werden. Der Benchmark konzentriert sich auf Latenz, Leistung und Skalierbarkeit.
Ubuntu VPS
$> hostnamectl
Chassis: vm
Virtualization: kvm
Operating System: Ubuntu 22.04.2 LTS
Kernel: Linux 5.15.0-48-generic
Architecture: x86-64
Hardware Vendor: netcup
Hardware Model: KVM Server
Ubuntu-Desktop / Windows-Desktop
Für die beiden Desktop-Setups werden die Benchmarks auf einem neu gestarteten System mit 5 Minuten Leerlaufzeit ausgeführt, bevor der Benchmark gestartet wird. Sie werden mit Administratorrechten ausgeführt und alle unnötigen anderen Prozesse werden beendet, bevor die Benchmarks ausgeführt werden. Für Ubuntu VPS werden die Benchmarks durch kontinuierliche Integration auf einem typischen Indie-Server-Setup ausgeführt, wobei auch andere Prozesse ausgeführt werden. Nachdem die Benchmarks ausgeführt wurden, wird eine Liste aller laufenden Prozesse angezeigt, um sie besser reproduzierbar zu machen. Um die Benchmarks zu reproduzieren, führen Sie sudo sh linux-benchmark.sh
oder win-benchmark.bat
aus. Wenn Sie das kompilierte Programm direkt ausführen möchten, führen Sie ./NetworkBenchmarkDotNet -b Essential
aus.
Die Rohdaten und zusätzliche Dateien können im Release-Bereich heruntergeladen werden.
Führt den Benchmark mit 500 Clients durch, die jeweils 1 Nachricht mit unzuverlässiger Übertragung an den Server senden. Der Benchmark läuft, bis insgesamt 500.000 Nachrichten an den Server und zurück an die Clients gesendet wurden. Die Nachrichtengröße beträgt 32 Byte .
Dieser Test dient dazu, eine Vorstellung von der durchschnittlichen Hin- und Rücklaufzeit zu bekommen (je niedriger, desto besser).
Führt den Benchmark mit 500 Clients durch, die jeweils 1 Nachricht mit zuverlässiger Übertragung an den Server senden. Der Benchmark läuft, bis insgesamt 500.000 Nachrichten an den Server und zurück an die Clients gesendet wurden. Die Nachrichtengröße beträgt 32 Byte .
Dieser Test dient dazu, eine Vorstellung von der durchschnittlichen Hin- und Rücklaufzeit zu bekommen (je niedriger, desto besser).
Führt den Benchmark mit 500 Clients durch, die jeweils 10 Nachrichten mit unzuverlässiger Übertragung an den Server senden. Der Benchmark läuft, bis insgesamt 500.000 Nachrichten an den Server und zurück an die Clients gesendet wurden. Die Nachrichtengröße beträgt 32 Byte .
Dieser Test dient der Multiplexing-/Nachrichtenzusammenführungsleistung (je höher, desto besser).
Führt den Benchmark mit einem Client aus, der jeweils 10 Nachrichten an den Server sendet. Der Benchmark läuft so lange, bis insgesamt 100.000 Nachrichten an den Server und zurück an die Clients gesendet wurden. Die Nachrichtengröße beträgt 128 Byte .
Dieser Test sammelt Informationen über generierten Müll und CPU-Zeiten während der Ausführung des Benchmarks. Diese Ergebnisse können mit PerfView unter Windows analysiert werden.
Dies ist ein Vergleich aller Tests mit ihrem Nachrichtendurchsatz (je höher, desto besser).
.nettrace
Dateien zu öffnen.Thread.Sleep
unter Windows führt zu spürbaren Verzögerungen. Es ist vorerst von den vordefinierten Benchmarks ausgeschlossen, bis seine Ausführung und Bereinigung verbessert werden.Stellen Sie sicher, dass das .Net 6 SDK installiert ist.
Öffnen Sie dann einfach die Lösungsdatei mit Visual Studio/Rider/Visual Studio Code und erstellen Sie sie. Beachten Sie, dass die Ergebnisse der Benchmarks je nach Betriebssystem und Hardware sehr unterschiedlich sein können.
Im Allgemeinen gibt es zwei verschiedene Arten von Benchmarks: Benutzerdefinierte und vordefinierte Benchmarks. Benutzerdefinierte Benchmarks können über die Befehlszeilenoptionen definiert werden. Vordefinierte Benchmarks werden im Code festgelegt und über BenchmarkDotNet ausgeführt. Sie werden für die hier dargestellten Statistiken verwendet und sind genauer und besser reproduzierbar als benutzerdefinierte Benchmarks. Allerdings dauert es auch länger, bis sie fertig sind. Sie können die Clients und den Server auch auf verschiedenen Computern ausführen, um die Bibliotheken über Ihr lokales Netzwerk oder aus der Ferne zu testen (siehe Remote-Benchmarks).
Sie können benutzerdefinierte Benchmarks über die Befehlszeile ausführen. Mit der App können Sie mehrere Einstellungen und deren Kombinationen auf einfache und schnelle Weise testen. Die Tests werden nur einmal ausgeführt und sind nicht so genau wie die Ausführung eines vordefinierten Benchmarks. Ein Beispiel für die Ausführung eines Benchmarks könnte ./NetworkBenchmarkDotNet --library ENet --transmission Unreliable --clients 100 --duration 10
sein
./NetworkBenchmarkDotNet --help
) Usage:
NetworkBenchmarkDotNet [options]
Options:
-b, --benchmark Run predefined benchmarks [default:
<All|Custom|Essential|Performance|Qui Custom]
ck|Sampling>
-m, --execution-mode Control what parts to run [default:
<Client|Complete|Server> Complete]
-t, --test <Manual|PingPong> Test type [default: PingPong]
--transmission <Reliable|Unreliable> Transmission type [default:
Unreliable]
-l, --library Library target [default: ENet]
<ENet|Kcp2k|LiteNetLib|NetCoreServer>
-d, --duration <duration> Test duration in seconds (-1 for
manual stopping) [default: 10]
--address <address> IP Address, can be ipv4 (e.g.
127.0.0.1) or ipv6 (e.g. ::1)
[default: ::1]
--port <port> Socket Port [default: 3330]
--clients <clients> # Simultaneous clients [default: 500]
--parallel-messages #Parallel messages per client
<parallel-messages> [default: 1]
--message-byte-size Message byte size sent by clients
<message-byte-size> [default: 32]
--message-payload <Ones|Random|Zeros> Message load sent by clients
[default: Random]
--verbose Verbose output of test steps and
errors [default: True]
--client-tick-rate <client-tick-rate> Client ticks per second if supported
[default: 60]
--server-tick-rate <server-tick-rate> Server ticks per second if supported
[default: 60]
--use-native-sockets Use native Sockets (LiteNetLib only)
[default: True]
--version Show version information
-?, -h, --help Show help and usage information
Die Ausführung vordefinierter Benchmarks nimmt einige Zeit in Anspruch, generiert aber reproduzierbare Zahlen. Der einfachste Weg, einen vordefinierten Benchmark auszuführen, besteht darin, win-benchmark.bat
unter Windows oder sh linux-benchmark.sh
unter Windows auszuführen.
Um eine Bibliothek aus der Ferne zu testen, können Sie die Parameter --execution-mode Server
bzw. --execution-mode Client
verwenden. Dieses Setup erfordert, dass Sie zuerst den Server mit der richtigen Bibliothek (und wahrscheinlich einer unbestimmten Ausführungsdauer) auf Ihrem Zielserver und dann den Client-Prozess starten. Hier ist ein Beispiel:
Server: ./NetworkBenchmarkDotNet --library ENet --transmission Reliable --execution-mode Server --address YOUR_ADDRESS -d -1
Client: ./NetworkBenchmarkDotNet --library ENet --transmission Reliable --execution-mode Client --address YOUR_ADDRESS --clients 100 -d 10
Wenn Sie die Adresse in QuickBenchmark.cs
ändern, können Sie auf diese Weise auch einen anspruchsvolleren Remote-Benchmark ausführen.
Ihre Lieblingsbibliothek fehlt oder Sie haben das Gefühl, dass die Benchmarks nicht alles Relevante testen? Lassen Sie uns gemeinsam den Maßstab weiterentwickeln! Kontaktieren Sie mich entweder per E-Mail, um Ihre Idee zu besprechen, ein Problem zu eröffnen oder direkt eine Pull-Anfrage zu stellen. Damit der Benchmark nicht zu unübersichtlich wird, gibt es ein paar Regeln.
Ihre neue vorgeschlagene Bibliothek ...
YourLibraryBenchmark.cs
hinzu, das ANetworkBenchmark implementiertINetworkBenchmark.CreateNetworkBenchmark()
hinzu.-l
(oder BenchmarkSetup.Library
), um Ihre Bibliothek zu testen und festzustellen, ob alles wie erwartet funktioniert.[Params(NetworkLibrary.Kcp2k)]
in QuickBenchmark.cs
in Ihre Bibliothek und führen Sie ./NetworkBenchmarkDotNet -b Quick
sehen Sie, ob Ihre Bibliothek mit hoher CCU und Schleifenbenchmarks mit BenchmarkDotNet funktioniertMIT