Skip to content

Commit acc286a

Browse files
authored
Merge pull request #6 from JohannesDeml/litenetlib-performance
Litenetlib performance
2 parents a6ec82f + 551caf8 commit acc286a

File tree

12 files changed

+205
-88
lines changed

12 files changed

+205
-88
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "LiteNetLib"]
2+
path = LiteNetLib
3+
url = git@github.com:RevenantX/LiteNetLib.git

Benchmarks/ubuntu-0.2.1.md

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
## Benchmarks
2+
3+
To reproduce the benchmarks, run `./NetCoreNetworkBenchmark -b`
4+
5+
6+
```
7+
OS: Ubuntu 20.04.1 LTS
8+
CPU: Intel® Core™ i5-3570K CPU @ 3.40GHz × 4
9+
Mainboard: Gigabyte Z77X-D3H Gb LAN (Atheros)
10+
RAM: G.Skill 16GB (2 x 8 GB) DDR3-1600 (Part number: F3-1600C11-8GNT)
11+
```
12+
### Benchmark 1 (v 0.2.1)
13+
* `./NetCoreNetworkBenchmark -t PingPong -l LiteNetLib -a 127.0.0.1 -p 3333 -c 1000 -s 32 -x Random -m 1 -d 60`
14+
* OS: Linux 5.4.0-52-generic #57-Ubuntu SMP Thu Oct 15 10:57:00 UTC 2020 X64
15+
* Framework: .NET Core 3.1.9
16+
* Test: PingPong
17+
* Address: 127.0.0.1, Port: 3333
18+
* Number of clients: 1000
19+
* Parallel messages per client: 1
20+
* Message size: 32 bytes
21+
* Message Payload: Random
22+
* Defined duration: 60 seconds
23+
24+
#### ENet
25+
```
26+
Duration: 60.008 s
27+
Messages sent by clients: 11,613,436
28+
Messages server received: 11,612,476
29+
Messages sent by server: 11,612,475
30+
Messages clients received: 11,612,436
31+
32+
Total data: 354.38 MB
33+
Data throughput: 5.91 MB/s
34+
Message throughput: 193,515 msg/s
35+
Message latency: 5.168 μs
36+
```
37+
38+
#### LiteNetLib
39+
```
40+
Duration: 60.092 s
41+
Messages sent by clients: 3,915,508
42+
Messages server received: 3,915,362
43+
Messages sent by server: 3,914,945
44+
Messages clients received: 3,914,508
45+
46+
Total data: 119.46 MB
47+
Data throughput: 1.99 MB/s
48+
Message throughput: 65,142 msg/s
49+
Message latency: 15.351 μs
50+
```
51+
52+
#### NetCoreServer
53+
```
54+
Duration: 60.005 s
55+
Messages sent by clients: 6,604,598
56+
Messages server received: 6,603,735
57+
Messages sent by server: 6,603,733
58+
Messages clients received: 6,603,617
59+
60+
Total data: 201.53 MB
61+
Data throughput: 3.36 MB/s
62+
Message throughput: 110,051 msg/s
63+
Message latency: 9.087 μs
64+
```
65+
66+
### Benchmark 2 (v 0.2.1)
67+
* `./NetCoreNetworkBenchmark -t PingPong -l NetCoreServer -a 127.0.0.1 -p 3333 -c 100 -s 32 -x Random -m 1000 -d 60`
68+
* OS: Linux 5.4.0-52-generic #57-Ubuntu SMP Thu Oct 15 10:57:00 UTC 2020 X64
69+
* Framework: .NET Core 3.1.9
70+
* Test: PingPong
71+
* Address: 127.0.0.1, Port: 3333
72+
* Number of clients: 100
73+
* Parallel messages per client: 1,000
74+
* Message size: 32 bytes
75+
* Message Payload: Random
76+
* Defined duration: 60 seconds
77+
78+
#### ENet
79+
```
80+
Duration: 60.017 s
81+
Messages sent by clients: 129,111,780
82+
Messages server received: 129,011,781
83+
Messages sent by server: 129,011,780
84+
Messages clients received: 129,011,780
85+
86+
Total data: 3937.13 MB
87+
Data throughput: 65.60 MB/s
88+
Message throughput: 2,149,574 msg/s
89+
Message latency: 0.465 μs
90+
```
91+
92+
#### LiteNetLib
93+
```
94+
Duration: 60.012 s
95+
Messages sent by clients: 28,786,912
96+
Messages server received: 28,696,204
97+
Messages sent by server: 28,687,309
98+
Messages clients received: 28,686,912
99+
100+
Total data: 875.46 MB
101+
Data throughput: 14.59 MB/s
102+
Message throughput: 478,019 msg/s
103+
Message latency: 2.092 μs
104+
```
105+
106+
#### NetCoreServer
107+
```
108+
Duration: 60.591 s
109+
Messages sent by clients: 7,296,041
110+
Messages server received: 7,197,985
111+
Messages sent by server: 7,197,984
112+
Messages clients received: 7,196,543
113+
114+
Total data: 219.62 MB
115+
Data throughput: 3.62 MB/s
116+
Message throughput: 118,773 msg/s
117+
Message latency: 8.419 μs
118+
```
119+

LiteNetLib

Submodule LiteNetLib added at 252c8eb

NetCoreNetworkBenchmark.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
Microsoft Visual Studio Solution File, Format Version 12.00
33
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetCoreNetworkBenchmark", "NetCoreNetworkBenchmark\NetCoreNetworkBenchmark.csproj", "{A1025393-381A-4EB0-98C7-36A0FA7A4685}"
44
EndProject
5+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiteNetLib", "LiteNetLib\LiteNetLib\LiteNetLib.csproj", "{79DF5167-DF79-489F-AAF5-2F39236ED7B6}"
6+
EndProject
57
Global
68
GlobalSection(SolutionConfigurationPlatforms) = preSolution
79
Debug|Any CPU = Debug|Any CPU
@@ -12,5 +14,9 @@ Global
1214
{A1025393-381A-4EB0-98C7-36A0FA7A4685}.Debug|Any CPU.Build.0 = Debug|Any CPU
1315
{A1025393-381A-4EB0-98C7-36A0FA7A4685}.Release|Any CPU.ActiveCfg = Release|Any CPU
1416
{A1025393-381A-4EB0-98C7-36A0FA7A4685}.Release|Any CPU.Build.0 = Release|Any CPU
17+
{79DF5167-DF79-489F-AAF5-2F39236ED7B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
18+
{79DF5167-DF79-489F-AAF5-2F39236ED7B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
19+
{79DF5167-DF79-489F-AAF5-2F39236ED7B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
20+
{79DF5167-DF79-489F-AAF5-2F39236ED7B6}.Release|Any CPU.Build.0 = Release|Any CPU
1521
EndGlobalSection
1622
EndGlobal

NetCoreNetworkBenchmark/BenchmarkConfiguration.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ internal class BenchmarkConfiguration
3535
/// </summary>
3636
public string Address = "127.0.0.1";
3737

38-
public bool PrintSteps = true;
38+
public bool Verbose = true;
3939

4040
public string Name = "Custom";
4141

42-
public int NumClients = 1000;
42+
public int NumClients = 100;
4343
public int ParallelMessagesPerClient = 1;
4444
public int MessageByteSize = 32;
4545
public MessagePayload MessagePayload = MessagePayload.Ones;
@@ -48,7 +48,7 @@ internal class BenchmarkConfiguration
4848
public int TickRateServer = 60;
4949

5050
public byte[] Message { get; private set; }
51-
public int TestDurationInSeconds = 2;
51+
public int TestDurationInSeconds = 10;
5252

5353
public BenchmarkConfiguration()
5454
{

NetCoreNetworkBenchmark/LiteNetLib/EchoClient.cs

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ internal class EchoClient
2121
private readonly EventBasedNetListener listener;
2222
private readonly NetManager netManager;
2323
private NetPeer peer;
24-
private Task listenTask;
2524

2625
public EchoClient(int id, BenchmarkConfiguration config)
2726
{
@@ -33,6 +32,9 @@ public EchoClient(int id, BenchmarkConfiguration config)
3332

3433
listener = new EventBasedNetListener();
3534
netManager = new NetManager(listener);
35+
netManager.IPv6Enabled = IPv6Mode.Disabled;
36+
netManager.UnsyncedEvents = true;
37+
netManager.DisconnectTimeout = 10000;
3638

3739
IsConnected = false;
3840
IsDisposed = false;
@@ -45,7 +47,8 @@ public EchoClient(int id, BenchmarkConfiguration config)
4547

4648
public void Start()
4749
{
48-
listenTask = Task.Factory.StartNew(ConnectAndListen, TaskCreationOptions.LongRunning);
50+
netManager.Start();
51+
peer = netManager.Connect(config.Address, config.Port, "ConnectionKey");
4952
IsDisposed = false;
5053
}
5154

@@ -55,8 +58,9 @@ public void StartSendingMessages()
5558

5659
for (int i = 0; i < parallelMessagesPerClient; i++)
5760
{
58-
Send(message, DeliveryMethod.Unreliable);
61+
Send(message, DeliveryMethod.ReliableUnordered);
5962
}
63+
netManager.TriggerUpdate();
6064
}
6165

6266
public Task Disconnect()
@@ -66,13 +70,6 @@ public Task Disconnect()
6670
return Task.CompletedTask;
6771
}
6872

69-
if (peer == null)
70-
{
71-
Console.WriteLine($"Client {id} does not know peer even though it was connected, should not happen.");
72-
IsConnected = false;
73-
return Task.CompletedTask;
74-
}
75-
7673
var clientDisconnected = Task.Factory.StartNew(() =>
7774
{
7875
peer.Disconnect();
@@ -92,15 +89,8 @@ public Task Stop()
9289
return stopClient;
9390
}
9491

95-
public async void Dispose()
92+
public void Dispose()
9693
{
97-
while (!listenTask.IsCompleted)
98-
{
99-
await Task.Delay(10);
100-
}
101-
102-
listenTask.Dispose();
103-
10494
listener.PeerConnectedEvent -= OnPeerConnected;
10595
listener.PeerDisconnectedEvent -= OnPeerDisconnected;
10696
listener.NetworkReceiveEvent -= OnNetworkReceive;
@@ -109,30 +99,11 @@ public async void Dispose()
10999
IsDisposed = true;
110100
}
111101

112-
private void ConnectAndListen()
113-
{
114-
netManager.Start();
115-
peer = netManager.Connect(config.Address, config.Port, "LiteNetLib");
116-
117-
while (benchmarkData.Running || IsConnected)
118-
{
119-
netManager.PollEvents();
120-
Thread.Sleep(tickRate);
121-
}
122-
}
123-
124102
private void Send(byte[] bytes, DeliveryMethod deliverymethod)
125103
{
126-
if (peer == null)
104+
if (!IsConnected)
127105
{
128-
Interlocked.Increment(ref benchmarkData.Errors);
129-
if (netManager.FirstPeer == null)
130-
{
131-
Console.WriteLine($"Client {id} is missing the reference to the server");
132-
return;
133-
}
134-
135-
peer = netManager.FirstPeer;
106+
return;
136107
}
137108

138109
peer.Send(bytes, deliverymethod);
@@ -146,6 +117,11 @@ private void OnPeerConnected(NetPeer peer)
146117

147118
private void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
148119
{
120+
if (disconnectInfo.Reason == DisconnectReason.Timeout && benchmarkData.Running)
121+
{
122+
Utilities.WriteVerboseLine($"Client {id} disconnected due to timeout. Probably the server is overwhelmed by the requests.");
123+
Interlocked.Increment(ref benchmarkData.Errors);
124+
}
149125
this.peer = null;
150126
IsConnected = false;
151127
}
@@ -156,6 +132,7 @@ private void OnNetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMeth
156132
{
157133
Interlocked.Increment(ref benchmarkData.MessagesClientReceived);
158134
Send(message, deliverymethod);
135+
netManager.TriggerUpdate();
159136
}
160137

161138
reader.Recycle();
@@ -165,6 +142,7 @@ private void OnNetworkError(IPEndPoint endpoint, SocketError socketerror)
165142
{
166143
if (benchmarkData.Running)
167144
{
145+
Utilities.WriteVerboseLine($"Error Client {id}: {socketerror}");
168146
Interlocked.Increment(ref benchmarkData.Errors);
169147
}
170148
}

NetCoreNetworkBenchmark/LiteNetLib/EchoServer.cs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,10 @@ internal class EchoServer
1111
{
1212
private readonly BenchmarkConfiguration config;
1313
private readonly BenchmarkData benchmarkData;
14-
private readonly Thread serverThread;
1514
private readonly EventBasedNetListener listener;
1615
private readonly NetManager netManager;
1716
private readonly byte[] message;
1817
private readonly int tickRate;
19-
private bool isRunning;
2018

2119
public EchoServer(BenchmarkConfiguration config)
2220
{
@@ -27,48 +25,40 @@ public EchoServer(BenchmarkConfiguration config)
2725
listener = new EventBasedNetListener();
2826
netManager = new NetManager(listener);
2927
netManager.UpdateTime = tickRate;
30-
message = new byte[config.MessageByteSize];
28+
netManager.IPv6Enabled = IPv6Mode.Disabled;
29+
netManager.UnsyncedEvents = true;
3130

32-
serverThread = new Thread(this.Start);
33-
serverThread.Name = "LiteNetLib Server";
31+
message = new byte[config.MessageByteSize];
3432

3533
listener.ConnectionRequestEvent += OnConnectionRequest;
3634
listener.NetworkReceiveEvent += OnNetworkReceive;
3735
listener.NetworkErrorEvent += OnNetworkError;
3836
}
3937

40-
public Task StartServerThread()
38+
public Task StartServer()
4139
{
42-
serverThread.Start();
43-
var serverStarted = Task.Run(() =>
40+
Start();
41+
var serverStopped = Task.Run(() =>
4442
{
45-
while (!serverThread.IsAlive)
43+
while (!netManager.IsRunning)
4644
{
4745
Task.Delay(10);
4846
}
4947
});
50-
return serverStarted;
48+
return serverStopped;
5149
}
5250

5351
private void Start()
5452
{
55-
isRunning = true;
5653
netManager.Start(config.Port);
57-
58-
while (isRunning)
59-
{
60-
netManager.PollEvents();
61-
Thread.Sleep(tickRate);
62-
}
6354
}
6455

65-
public Task StopServerThread()
56+
public Task StopServer()
6657
{
67-
isRunning = false;
6858
netManager.Stop();
6959
var serverStopped = Task.Run(() =>
7060
{
71-
while (serverThread.IsAlive)
61+
while (netManager.IsRunning)
7262
{
7363
Task.Delay(10);
7464
}
@@ -104,6 +94,7 @@ private void OnNetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMeth
10494
Buffer.BlockCopy(reader.RawData, reader.UserDataOffset, message, 0, reader.UserDataSize);
10595
peer.Send(message, deliverymethod);
10696
Interlocked.Increment(ref benchmarkData.MessagesServerSent);
97+
netManager.TriggerUpdate();
10798
}
10899

109100
reader.Recycle();

0 commit comments

Comments
 (0)