针对 UDP 套接字性能进行基准测试的低级 .NET 6 网络库
NBN 是使用 UDP 的低级网络库的基准,可与 Unity 和 .Net Core 独立服务器应用程序一起使用。该基准测试重点关注延迟、性能和可扩展性。
乌班图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 桌面 / Windows 桌面
对于两个桌面设置,基准测试在重新启动的系统上运行,在开始基准测试之前有 5 分钟的空闲时间。它们以管理员权限运行,并且在运行基准测试之前所有不必要的其他进程都会被终止。对于 Ubuntu VPS,基准测试是通过在典型的独立服务器设置上持续集成并运行其他进程来运行的。运行基准测试后,会列出所有正在运行的进程,以使其更具可重复性。要重现基准测试,请运行sudo sh linux-benchmark.sh
或win-benchmark.bat
。如果您想直接从编译后的程序执行,请运行./NetworkBenchmarkDotNet -b Essential
。
原始数据和附加文件可以从发布部分下载。
使用500 个客户端运行基准测试,每个客户端与服务器 pingpong 1 条消息,且传输不可靠。该基准测试将持续运行,直至总共500,000 条消息发送至服务器并返回至客户端。消息大小为32 字节。
此测试用于了解平均往返时间(越短越好)。
使用500 个客户端运行基准测试,每个客户端与服务器 pingpong 1 条消息,并进行可靠传输。该基准测试将持续运行,直至总共500,000 条消息发送至服务器并返回至客户端。消息大小为32 字节。
此测试用于了解平均往返时间(越短越好)。
使用500 个客户端运行基准测试,每个客户端与服务器 pingpong 10 条消息,且传输不可靠。该基准测试将持续运行,直至总共500,000 条消息发送至服务器并返回至客户端。消息大小为32 字节。
此测试针对复用/消息合并性能(越高越好)。
使用1 个客户端运行基准测试,每个客户端与服务器交互10 条消息。该基准测试将持续运行,直至总共100,000 条消息发送至服务器并返回至客户端。消息大小为128 字节。
此测试收集有关运行基准测试时生成的垃圾和 CPU 时间的信息。这些结果可以使用 Windows 上的 PerfView 进行分析。
这是所有测试与其消息吞吐量之间的比较(越高越好)。
.nettrace
文件。Thread.Sleep
会产生明显的延迟。目前,它被排除在预定义的基准测试之外,直到其执行和清理得到改进。确保您已安装 .Net 6 SDK。
然后只需使用 Visual Studio/Rider/Visual Studio Code 打开解决方案文件并构建它。请注意,对于不同的操作系统和硬件,基准测试的结果可能会非常不同。
一般来说,有两种不同类型的基准:自定义基准和预定义基准。自定义基准并通过命令行选项进行定义。预定义基准在代码中设置并通过 BenchmarkDotNet 执行。它们用于此处提供的统计数据,并且比自定义基准更准确且可重复性更好。然而,它们也需要更长的时间才能完成。您还可以在不同的计算机上运行客户端和服务器,以通过本地网络或远程测试库(请参阅远程基准测试)。
您可以通过命令行运行自定义基准测试。用户可以以简单快捷的方式测试多个设置及其组合。这些测试只会运行一次,并且不如运行预定义的基准测试那么准确。运行基准测试的示例可能是./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
预定义的基准测试需要一些时间来运行,但会生成可重现的数字。运行预定义基准测试的最简单方法是在 Windows 上运行win-benchmark.bat
或在 Windows 上运行sh linux-benchmark.sh
。
要远程测试库,可以分别使用参数--execution-mode Server
和--execution-mode Client
。此设置需要首先在目标服务器上启动具有正确库(并且可能是不确定的执行持续时间)的服务器,然后启动客户端进程。这是一个例子:
服务器: ./NetworkBenchmarkDotNet --library ENet --transmission Reliable --execution-mode Server --address YOUR_ADDRESS -d -1
客户端: ./NetworkBenchmarkDotNet --library ENet --transmission Reliable --execution-mode Client --address YOUR_ADDRESS --clients 100 -d 10
如果您更改QuickBenchmark.cs
中的地址,您还可以通过这种方式运行更复杂的远程基准测试。
您最喜欢的库丢失了,或者您觉得基准测试没有测试所有相关的内容?让我们一起发展基准!您可以通过电子邮件联系我讨论您的想法,或者提出问题,或者直接提出拉取请求。为了不使基准测试过于混乱,有一些规则。
您提议的新图书馆...
YourLibraryBenchmark.cs
的脚本,该脚本实现 ANetworkBenchmarkINetworkBenchmark.CreateNetworkBenchmark()
-l
参数(或BenchmarkSetup.Library
)来测试您的库以及一切是否按预期工作。QuickBenchmark.cs
中的[Params(NetworkLibrary.Kcp2k)]
更改为您的库并运行./NetworkBenchmarkDotNet -b Quick
查看您的库是否适用于高 CCU 并使用 BenchmarkDotNet 进行循环基准测试麻省理工学院