Сетевые библиотеки низкого уровня .NET 6 протестированы на производительность сокетов UDP
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
Для двух настольных систем тесты выполняются на перезапущенной системе с паузой в 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 байта .
Этот тест предназначен для проверки производительности мультиплексирования/слияния сообщений (чем выше, тем лучше).
Запускает тест с одним клиентом, который отправляет по 10 сообщений каждому серверу. Тест выполняется до тех пор, пока на сервер и обратно клиентам не будет отправлено в общей сложности 100 000 сообщений. Размер сообщения составляет 128 байт .
Этот тест собирает информацию о сгенерированном мусоре и времени процессора во время выполнения теста. Эти результаты можно проанализировать с помощью PerfView в Windows.
Это сравнение всех тестов с их пропускной способностью (чем выше, тем лучше).
.nettrace
.Thread.Sleep
в Windows создает заметные задержки, особенно. На данный момент он исключен из предопределенных тестов, пока его выполнение и очистка не будут улучшены.Убедитесь, что у вас установлен .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
Заранее определенные тесты требуют некоторого времени для запуска, но генерируют воспроизводимые результаты. Самый простой способ запустить предопределенный тест — запустить win-benchmark.bat
в Windows или sh linux-benchmark.sh
в Windows.
Чтобы протестировать библиотеку удаленно, вы можете использовать параметр --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
, реализующий ANetworkBenchmark.INetworkBenchmark.CreateNetworkBenchmark()
-l
(или BenchmarkSetup.Library
), чтобы проверить вашу библиотеку и убедиться, что все работает так, как ожидалось.[Params(NetworkLibrary.Kcp2k)]
в QuickBenchmark.cs
на свою библиотеку и запустите ./NetworkBenchmarkDotNet -b Quick
проверить, работает ли ваша библиотека с высокими CCU и циклическими тестами с помощью BenchmarkDotNet.Массачусетский технологический институт