Bibliotecas de rede .NET 6 de baixo nível avaliadas para desempenho de soquete UDP
NBN é uma referência para bibliotecas de rede de baixo nível usando UDP e pode ser usado com Unity e para aplicativos de servidor autônomos .Net Core. O benchmark se concentra em latência, desempenho e escalabilidade.
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
Área de Trabalho Ubuntu / Área de Trabalho do Windows
Para as duas configurações de desktop, os benchmarks são executados em um sistema reiniciado com 5 minutos de inatividade antes de iniciar o benchmark. Eles são executados com privilégios de administrador e todos os outros processos desnecessários são eliminados antes da execução dos benchmarks. Para Ubuntu VPS, os benchmarks são executados por meio de integração contínua em uma configuração típica de servidor independente com outros processos em execução também. Após a execução dos benchmarks, uma lista de todos os processos em execução para torná-los mais reproduzíveis. Para reproduzir os benchmarks, execute sudo sh linux-benchmark.sh
ou win-benchmark.bat
. Se você deseja executar diretamente do programa compilado, execute ./NetworkBenchmarkDotNet -b Essential
.
Os dados brutos e arquivos adicionais podem ser baixados na seção de lançamento.
Executa o benchmark com 500 clientes, que fazem pingpong de 1 mensagem cada com o servidor com transmissão não confiável . O benchmark é executado até que um total de 500.000 mensagens sejam enviadas ao servidor e de volta aos clientes. O tamanho da mensagem é 32 bytes .
Este teste serve para ter uma ideia do tempo médio de ida e volta (quanto menor, melhor).
Executa o benchmark com 500 clientes, que fazem pingpong de 1 mensagem cada com o servidor com transmissão confiável . O benchmark é executado até que um total de 500.000 mensagens sejam enviadas ao servidor e de volta aos clientes. O tamanho da mensagem é 32 bytes .
Este teste serve para ter uma ideia do tempo médio de ida e volta (quanto menor, melhor).
Executa o benchmark com 500 clientes, que enviam 10 mensagens cada um para o servidor com transmissão não confiável . O benchmark é executado até que um total de 500.000 mensagens sejam enviadas ao servidor e de volta aos clientes. O tamanho da mensagem é 32 bytes .
Este teste é para desempenho de multiplexação/mescagem de mensagens (quanto maior, melhor).
Executa o benchmark com 1 cliente, que faz pingpong de 10 mensagens cada com o servidor. O benchmark é executado até que um total de 100.000 mensagens sejam enviadas ao servidor e de volta aos clientes. O tamanho da mensagem é 128 bytes .
Este teste coleta informações sobre o lixo gerado e os tempos de CPU durante a execução do benchmark. Esses resultados podem ser analisados com PerfView no Windows.
Esta é uma comparação entre todos os testes com o rendimento da mensagem (quanto maior, melhor).
.nettrace
.Thread.Sleep
no Windows cria atrasos perceptíveis. Por enquanto está excluído dos benchmarks predefinidos, até que sua execução e limpeza sejam melhoradas.Certifique-se de ter o .Net 6 SDK instalado.
Em seguida, basta abrir o arquivo da solução com Visual Studio/Rider/Visual Studio Code e construí-lo. Observe que os resultados dos benchmarks podem ser muito diferentes com um sistema operacional e hardware diferentes.
Em geral, existem dois tipos diferentes de benchmarks: benchmarks personalizados e benchmarks predefinidos. Benchmarks personalizados e definidos por meio das opções de linha de comando. Benchmarks predefinidos são definidos em código e executados através do BenchmarkDotNet. Eles são usados para as estatísticas apresentadas aqui e são mais precisos e melhor reproduzíveis do que os benchmarks personalizados. No entanto, eles também demoram mais para terminar. Você também pode executar os clientes e o servidor em máquinas diferentes para testar as bibliotecas em sua rede local ou remotamente (consulte benchmarks remotos).
Você pode executar benchmarks personalizados por meio da linha de comando. Use pode testar múltiplas configurações e suas combinações de forma fácil e rápida. Os testes serão executados apenas uma vez e não são tão precisos quanto a execução de um benchmark predefinido. Um exemplo para executar um benchmark pode 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
Os benchmarks predefinidos levam algum tempo para serem executados, mas geram números reproduzíveis. A maneira mais fácil de executar um benchmark predefinido é executar win-benchmark.bat
no Windows ou sh linux-benchmark.sh
no Windows.
Para testar uma biblioteca remotamente, você pode usar o parâmetro --execution-mode Server
e --execution-mode Client
respectivamente. Esta configuração requer primeiro iniciar o servidor com a biblioteca correta (e provavelmente uma duração de execução indefinida) no servidor de destino e, em seguida, o processo do cliente. Aqui está um exemplo:
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
Se você alterar o endereço em QuickBenchmark.cs
, também poderá executar um benchmark remoto mais sofisticado dessa maneira.
Sua biblioteca favorita está faltando ou você sente que os benchmarks não estão testando tudo o que é relevante? Vamos evoluir o benchmark juntos! Entre em contato comigo por e-mail para discutir sua ideia, abra um problema ou faça uma solicitação pull diretamente. Existem algumas regras para não tornar o benchmark muito confuso.
Sua nova biblioteca proposta ...
YourLibraryBenchmark.cs
que implementa ANetworkBenchmarkINetworkBenchmark.CreateNetworkBenchmark()
-l
(ou BenchmarkSetup.Library
) para testar sua biblioteca e se tudo funciona conforme o esperado.[Params(NetworkLibrary.Kcp2k)]
em QuickBenchmark.cs
para sua biblioteca e execute ./NetworkBenchmarkDotNet -b Quick
para ver se sua biblioteca funciona com CCU alto e benchmarks de loop com BenchmarkDotNetMIT