UDP ソケットのパフォーマンスについてベンチマークされた低レベルの .NET 6 ネットワーク ライブラリ
NBN は、UDP を使用した低レベル ネットワーキング ライブラリのベンチマークであり、Unity および .Net Core スタンドアロン サーバー アプリケーションで使用できます。このベンチマークは、レイテンシー、パフォーマンス、およびスケーラビリティに焦点を当てています。
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 デスクトップ / Windows デスクトップ
2 つのデスクトップ セットアップでは、ベンチマークは、ベンチマークを開始する前に 5 分間のアイドル時間を設けて、再起動されたシステム上で実行されます。これらは管理者権限で実行され、ベンチマークを実行する前に他の不要なプロセスはすべて強制終了されます。 Ubuntu VPS の場合、ベンチマークは、他のプロセスも実行されている一般的なインディー サーバー セットアップでの継続的統合を通じて実行されます。ベンチマークの実行後、再現性を高めるための実行中のすべてのプロセスのリスト。ベンチマークを再現するには、 sudo sh linux-benchmark.sh
またはwin-benchmark.bat
を実行します。コンパイルされたプログラムから直接実行する場合は、 ./NetworkBenchmarkDotNet -b Essential
を実行します。
生データと追加ファイルはリリースセクションからダウンロードできます。
500 台のクライアントでベンチマークを実行し、各クライアントはサーバーとの間で1 つのメッセージを信頼性の低い送信でピンポンします。ベンチマークは、合計500,000のメッセージがサーバーに送信され、クライアントに返されるまで実行されます。メッセージのサイズは32 バイトです。
このテストは、平均往復時間を把握するためのものです (短いほど良い)。
500 台のクライアントでベンチマークを実行し、各クライアントがサーバーとの間で1 つのメッセージを信頼性の高い送信でピンポン送信します。ベンチマークは、合計500,000のメッセージがサーバーに送信され、クライアントに返されるまで実行されます。メッセージのサイズは32 バイトです。
このテストは、平均往復時間を把握するためのものです (短いほど良い)。
500 台のクライアントでベンチマークを実行し、サーバーとの間でそれぞれ10 個のメッセージをピンポン送信しますが、送信の信頼性は低くなります。ベンチマークは、合計500,000のメッセージがサーバーに送信され、クライアントに返されるまで実行されます。メッセージのサイズは32 バイトです。
このテストは、多重化/メッセージ マージのパフォーマンスを目的としています (高いほど優れています)。
1 台のクライアントでベンチマークを実行し、サーバーとそれぞれ10 個のメッセージをピンポンします。ベンチマークは、合計100,000 個のメッセージがサーバーに送信され、クライアントに返されるまで実行されます。メッセージのサイズは128 バイトです。
このテストは、ベンチマークの実行中に生成されたガベージと CPU 時間に関する情報を収集します。これらの結果は、Windows 上の PerfView を使用して分析できます。
これは、すべてのテスト間のメッセージ スループットの比較です (高いほど優れています)。
.nettrace
ファイルを開きます。Thread.Sleep
使用すると、顕著な遅延が発生します。現時点では、実行とクリーンアップが改善されるまで、事前定義されたベンチマークから除外されています。.Net 6 SDK がインストールされていることを確認してください。
次に、Visual Studio/Rider/Visual Studio Code でソリューション ファイルを開き、ビルドするだけです。ベンチマークの結果は、オペレーティング システムやハードウェアが異なると大きく異なる場合があることに注意してください。
一般に、ベンチマークにはカスタム ベンチマークと事前定義ベンチマークの 2 種類があります。カスタム ベンチマーク。コマンド ライン オプションを通じて定義できます。事前定義されたベンチマークはコードで設定され、BenchmarkDotNet を通じて実行されます。これらはここで示される統計に使用され、カスタム ベンチマークよりも正確で再現性が高くなります。ただし、完了までに時間がかかります。クライアントとサーバーを別のマシンで実行して、ローカル ネットワークまたはリモートでライブラリをテストすることもできます (リモート ベンチマークを参照)。
コマンドラインからカスタム ベンチマークを実行できます。複数の設定とその組み合わせを簡単かつ迅速な方法でテストできます。テストは 1 回だけ実行されるため、事前定義されたベンチマークを実行するほど正確ではありません。ベンチマークを実行する例は次のようになります./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
というスクリプトを追加します。INetworkBenchmark.CreateNetworkBenchmark()
に追加します。-l
引数 (またはBenchmarkSetup.Library
) を使用してライブラリをテストし、すべてが期待どおりに動作するかどうかをテストします。QuickBenchmark.cs
の[Params(NetworkLibrary.Kcp2k)]
ライブラリに変更し、 ./NetworkBenchmarkDotNet -b Quick
確認できます。マサチューセッツ工科大学