Bibliotecas de redes .NET 6 de bajo nivel comparadas para el rendimiento del socket UDP
NBN es un punto de referencia para bibliotecas de redes de bajo nivel que utilizan UDP y se puede utilizar con Unity y para aplicaciones de servidor independientes .Net Core. El punto de referencia se centra en la latencia, el rendimiento y la escalabilidad.
VPS Ubuntu
$> 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
Escritorio Ubuntu/Escritorio Windows
Para las dos configuraciones de escritorio, las evaluaciones comparativas se ejecutan en un sistema reiniciado con un tiempo de inactividad de 5 minutos antes de iniciar la evaluación comparativa. Se ejecutan con privilegios de administrador y todos los demás procesos innecesarios se eliminan antes de ejecutar las pruebas comparativas. Para Ubuntu VPS, los puntos de referencia se ejecutan mediante integración continua en una configuración de servidor independiente típica con otros procesos en ejecución también. Una vez ejecutados los puntos de referencia, se muestra una lista de todos los procesos en ejecución para hacerlos más reproducibles. Para reproducir los puntos de referencia, ejecute sudo sh linux-benchmark.sh
o win-benchmark.bat
. Si desea ejecutar directamente desde el programa compilado, ejecute ./NetworkBenchmarkDotNet -b Essential
.
Los datos sin procesar y los archivos adicionales se pueden descargar desde la sección de lanzamiento.
Ejecuta el punto de referencia con 500 clientes, que envían 1 mensaje cada uno al servidor con una transmisión no confiable . La prueba se ejecuta hasta que se envían un total de 500.000 mensajes al servidor y se devuelven a los clientes. El tamaño del mensaje es de 32 bytes .
Esta prueba sirve para tener una idea del tiempo medio de ida y vuelta (cuanto menor, mejor).
Ejecuta el punto de referencia con 500 clientes, que envían 1 mensaje cada uno al servidor con una transmisión confiable . La prueba se ejecuta hasta que se envían un total de 500.000 mensajes al servidor y se devuelven a los clientes. El tamaño del mensaje es de 32 bytes .
Esta prueba sirve para tener una idea del tiempo medio de ida y vuelta (cuanto menor, mejor).
Ejecuta el punto de referencia con 500 clientes, que hacen pingpong a 10 mensajes cada uno con el servidor con una transmisión no confiable . La prueba se ejecuta hasta que se envían un total de 500.000 mensajes al servidor y se devuelven a los clientes. El tamaño del mensaje es de 32 bytes .
Esta prueba es para el rendimiento de multiplexación/fusión de mensajes (cuanto más alto, mejor).
Ejecuta el punto de referencia con 1 cliente, que hace pingpong a 10 mensajes cada uno con el servidor. La prueba se ejecuta hasta que se envían un total de 100.000 mensajes al servidor y se devuelven a los clientes. El tamaño del mensaje es de 128 bytes .
Esta prueba recopila información sobre la basura generada y los tiempos de CPU mientras se ejecuta el punto de referencia. Esos resultados se pueden analizar con PerfView en Windows.
Esta es una comparación entre todas las pruebas con su rendimiento de mensajes (cuanto más alto, mejor).
.nettrace
.Thread.Sleep
en Windows crea retrasos notables. Por ahora queda excluido de los benchmarks predefinidos, hasta que se mejore su ejecución y limpieza.Asegúrese de tener instalado el SDK .Net 6.
Luego simplemente abra el archivo de la solución con Visual Studio/Rider/Visual Studio Code y compílelo. Tenga en cuenta que los resultados de las pruebas comparativas pueden ser muy diferentes con un sistema operativo y hardware diferentes.
En general, existen dos tipos diferentes de puntos de referencia: puntos de referencia personalizados y puntos de referencia predefinidos. Puntos de referencia personalizados y definidos a través de las opciones de la línea de comandos. Los puntos de referencia predefinidos se establecen en código y se ejecutan a través de BenchmarkDotNet. Se utilizan para las estadísticas presentadas aquí y son más precisos y mejor reproducibles que los puntos de referencia personalizados. Sin embargo, también tardan más en terminar. También puede ejecutar los clientes y el servidor en diferentes máquinas para probar las bibliotecas a través de su red local o de forma remota (consulte las pruebas comparativas remotas).
Puede ejecutar pruebas comparativas personalizadas a través de la línea de comandos. Su uso permite probar múltiples configuraciones y sus combinaciones de una manera fácil y rápida. Las pruebas solo se ejecutarán una vez y no son tan precisas como ejecutar un punto de referencia predefinido. Un ejemplo para ejecutar un punto de referencia podría ser ./NetworkBenchmarkDotNet --library ENet --transmission Unreliable --clients 100 --duration 10
./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
Los puntos de referencia predefinidos tardan algún tiempo en ejecutarse, pero generan números reproducibles. La forma más sencilla de ejecutar un punto de referencia predefinido es ejecutar win-benchmark.bat
en Windows o sh linux-benchmark.sh
en Windows.
Para probar una biblioteca de forma remota, puede utilizar el parámetro --execution-mode Server
y --execution-mode Client
respectivamente. Esta configuración requiere iniciar primero el servidor con la biblioteca correcta (y probablemente una duración de ejecución indefinida) en su servidor de destino y luego el proceso del cliente. Aquí hay un ejemplo:
Servidor: ./NetworkBenchmarkDotNet --library ENet --transmission Reliable --execution-mode Server --address YOUR_ADDRESS -d -1
Cliente: ./NetworkBenchmarkDotNet --library ENet --transmission Reliable --execution-mode Client --address YOUR_ADDRESS --clients 100 -d 10
Si cambia la dirección en QuickBenchmark.cs
, también puede ejecutar una prueba remota más sofisticada de esta manera.
¿Falta tu biblioteca favorita o sientes que los puntos de referencia no prueban todo lo relevante? ¡Evolucionemos juntos el punto de referencia! Contáctame por correo electrónico para discutir tu idea, abre un problema o realiza una solicitud de extracción directamente. Existen algunas reglas para no abarrotar demasiado el punto de referencia.
Su nueva biblioteca propuesta...
YourLibraryBenchmark.cs
que implemente ANetworkBenchmarkINetworkBenchmark.CreateNetworkBenchmark()
-l
(o BenchmarkSetup.Library
) para probar su biblioteca y comprobar si todo funciona como se esperaba.[Params(NetworkLibrary.Kcp2k)]
en QuickBenchmark.cs
a su biblioteca y ejecute ./NetworkBenchmarkDotNet -b Quick
para ver si su biblioteca funciona con CCU alta y puntos de referencia en bucle con BenchmarkDotNetMIT