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
우분투 데스크탑 / Windows 데스크탑
두 가지 데스크톱 설정의 경우 벤치마크는 벤치마크를 시작하기 전 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로 솔루션 파일을 열고 빌드하면 됩니다. 벤치마크 결과는 운영 체제와 하드웨어에 따라 매우 다를 수 있습니다.
일반적으로 벤치마크에는 맞춤형 벤치마크와 사전 정의된 벤치마크라는 두 가지 유형이 있습니다. 사용자 정의 벤치마크는 명령줄 옵션을 통해 정의됩니다. 사전 정의된 벤치마크는 코드에 설정되어 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
라는 스크립트를 추가합니다.INetworkBenchmark.CreateNetworkBenchmark()
에 구현 생성자를 추가합니다.-l
인수(또는 BenchmarkSetup.Library
)를 사용하여 라이브러리를 테스트하고 모든 것이 예상대로 작동하는지 확인하세요.QuickBenchmark.cs
의 [Params(NetworkLibrary.Kcp2k)]
라이브러리로 변경하고 ./NetworkBenchmarkDotNet -b Quick
확인합니다.MIT