helios-io / helios

reactive socket middleware for .NET

Home Page:http://helios-io.github.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Need to decrease allocations inside Helios reactors

Aaronontheweb opened this issue · comments

Some specs fresh off the build server for the dev branch:

Helios.Tests.Performance.Socket.TcpThroughputSpec+OneWayThroughputBenchmark

Tests a full request/response sequence for 1000 messages
4/13/2016 1:06:35 AM

System Info

NBench=NBench, Version=0.2.1.0, Culture=neutral, PublicKeyToken=null
OS=Microsoft Windows NT 6.2.9200.0
ProcessorCount=4
CLR=4.0.30319.42000,IsMono=False,MaxGcGeneration=2
WorkerThreads=32767, IOThreads=4

NBench Settings

RunMode=Iterations, TestMode=Measurement
NumberOfIterations=13, MaximumRunTime=00:00:01

Data


Totals

Metric Units Max Average Min StdDev
TotalBytesAllocated bytes 2,702,000.00 2,632,565.54 2,620,128.00 21,170.43
TotalCollections [Gen0] collections 0.00 0.00 0.00 0.00
TotalCollections [Gen1] collections 0.00 0.00 0.00 0.00
TotalCollections [Gen2] collections 0.00 0.00 0.00 0.00
[Counter] MessagesReceived operations 1,000.00 1,000.00 1,000.00 0.00

Per-second Totals

Metric Units / s Max / s Average / s Min / s StdDev / s
TotalBytesAllocated bytes 293,906,498.14 284,017,997.22 260,700,740.08 8,730,090.93
TotalCollections [Gen0] collections 0.00 0.00 0.00 0.00
TotalCollections [Gen1] collections 0.00 0.00 0.00 0.00
TotalCollections [Gen2] collections 0.00 0.00 0.00 0.00
[Counter] MessagesReceived operations 109,933.60 107,882.67 99,339.39 3,068.69

Raw Data

TotalBytesAllocated

Run # bytes bytes / s ns / bytes
1 2,624,928.00 288,396,580.90 3.47
2 2,632,736.00 288,686,689.26 3.46
3 2,632,368.00 288,178,663.31 3.47
4 2,628,328.00 287,161,087.32 3.48
5 2,625,344.00 283,508,347.55 3.53
6 2,624,344.00 260,700,740.08 3.84
7 2,626,480.00 277,303,489.42 3.61
8 2,626,336.00 284,287,801.87 3.52
9 2,624,952.00 288,329,525.48 3.47
10 2,702,000.00 293,906,498.14 3.40
11 2,624,152.00 288,482,476.58 3.47
12 2,631,256.00 289,053,718.55 3.46
13 2,620,128.00 274,238,345.44 3.65

TotalCollections [Gen0]

Run # collections collections / s ns / collections
1 0.00 0.00 9,101,800.00
2 0.00 0.00 9,119,700.00
3 0.00 0.00 9,134,500.00
4 0.00 0.00 9,152,800.00
5 0.00 0.00 9,260,200.00
6 0.00 0.00 10,066,500.00
7 0.00 0.00 9,471,500.00
8 0.00 0.00 9,238,300.00
9 0.00 0.00 9,104,000.00
10 0.00 0.00 9,193,400.00
11 0.00 0.00 9,096,400.00
12 0.00 0.00 9,103,000.00
13 0.00 0.00 9,554,200.00

TotalCollections [Gen1]

Run # collections collections / s ns / collections
1 0.00 0.00 9,101,800.00
2 0.00 0.00 9,119,700.00
3 0.00 0.00 9,134,500.00
4 0.00 0.00 9,152,800.00
5 0.00 0.00 9,260,200.00
6 0.00 0.00 10,066,500.00
7 0.00 0.00 9,471,500.00
8 0.00 0.00 9,238,300.00
9 0.00 0.00 9,104,000.00
10 0.00 0.00 9,193,400.00
11 0.00 0.00 9,096,400.00
12 0.00 0.00 9,103,000.00
13 0.00 0.00 9,554,200.00

TotalCollections [Gen2]

Run # collections collections / s ns / collections
1 0.00 0.00 9,101,800.00
2 0.00 0.00 9,119,700.00
3 0.00 0.00 9,134,500.00
4 0.00 0.00 9,152,800.00
5 0.00 0.00 9,260,200.00
6 0.00 0.00 10,066,500.00
7 0.00 0.00 9,471,500.00
8 0.00 0.00 9,238,300.00
9 0.00 0.00 9,104,000.00
10 0.00 0.00 9,193,400.00
11 0.00 0.00 9,096,400.00
12 0.00 0.00 9,103,000.00
13 0.00 0.00 9,554,200.00

[Counter] MessagesReceived

Run # operations operations / s ns / operations
1 1,000.00 109,868.38 9,101.80
2 1,000.00 109,652.73 9,119.70
3 1,000.00 109,475.07 9,134.50
4 1,000.00 109,256.18 9,152.80
5 1,000.00 107,989.03 9,260.20
6 1,000.00 99,339.39 10,066.50
7 1,000.00 105,579.90 9,471.50
8 1,000.00 108,245.02 9,238.30
9 1,000.00 109,841.83 9,104.00
10 1,000.00 108,773.69 9,193.40
11 1,000.00 109,933.60 9,096.40
12 1,000.00 109,853.89 9,103.00
13 1,000.00 104,666.01 9,554.20

Throughput is reasonable, but not great, at 100k messages per second.

But the number that concerns me is memory allocation, sitting at 2,624,928.00 bytes per 1000 messages. That includes both sending and receiving of the message.... But the other part that's a bit scary is that there's no observable garbage collection at all, whcih leads me to believe there might be a memory leak.

It's possible that this is just the result of Helios expanding its receive buffer, but I doubt it.

Either way, about damn time we had NBench coverage for this project.

UDP results are similar

Helios.Tests.Performance.Socket.UdpThroughputSpec+OneWayThroughputBenchmark

Tests a full request/response sequence for 1000 messages
4/13/2016 1:06:36 AM

System Info

NBench=NBench, Version=0.2.1.0, Culture=neutral, PublicKeyToken=null
OS=Microsoft Windows NT 6.2.9200.0
ProcessorCount=4
CLR=4.0.30319.42000,IsMono=False,MaxGcGeneration=2
WorkerThreads=32767, IOThreads=4

NBench Settings

RunMode=Iterations, TestMode=Measurement
NumberOfIterations=13, MaximumRunTime=00:00:01

Data


Totals

Metric Units Max Average Min StdDev
TotalBytesAllocated bytes 2,683,304.00 2,621,415.38 2,594,768.00 22,950.99
TotalCollections [Gen0] collections 0.00 0.00 0.00 0.00
TotalCollections [Gen1] collections 0.00 0.00 0.00 0.00
TotalCollections [Gen2] collections 0.00 0.00 0.00 0.00
[Counter] MessagesReceived operations 1,000.00 1,000.00 1,000.00 0.00

Per-second Totals

Metric Units / s Max / s Average / s Min / s StdDev / s
TotalBytesAllocated bytes 296,714,067.72 284,466,083.54 273,768,026.26 6,026,048.40
TotalCollections [Gen0] collections 0.00 0.00 0.00 0.00
TotalCollections [Gen1] collections 0.00 0.00 0.00 0.00
TotalCollections [Gen2] collections 0.00 0.00 0.00 0.00
[Counter] MessagesReceived operations 111,282.98 108,515.75 104,880.07 2,063.00

Raw Data

TotalBytesAllocated

Run # bytes bytes / s ns / bytes
1 2,619,344.00 277,284,891.60 3.61
2 2,647,944.00 280,805,955.59 3.56
3 2,611,552.00 285,640,285.25 3.50
4 2,602,200.00 285,755,073.36 3.50
5 2,610,296.00 273,768,026.26 3.65
6 2,632,584.00 286,855,100.57 3.49
7 2,608,960.00 276,610,227.00 3.62
8 2,683,304.00 296,714,067.72 3.37
9 2,622,592.00 286,262,293.29 3.49
10 2,594,768.00 288,753,519.32 3.46
11 2,610,552.00 286,921,140.85 3.49
12 2,621,992.00 287,111,899.52 3.48
13 2,612,312.00 285,576,605.63 3.50

TotalCollections [Gen0]

Run # collections collections / s ns / collections
1 0.00 0.00 9,446,400.00
2 0.00 0.00 9,429,800.00
3 0.00 0.00 9,142,800.00
4 0.00 0.00 9,106,400.00
5 0.00 0.00 9,534,700.00
6 0.00 0.00 9,177,400.00
7 0.00 0.00 9,431,900.00
8 0.00 0.00 9,043,400.00
9 0.00 0.00 9,161,500.00
10 0.00 0.00 8,986,100.00
11 0.00 0.00 9,098,500.00
12 0.00 0.00 9,132,300.00
13 0.00 0.00 9,147,500.00

TotalCollections [Gen1]

Run # collections collections / s ns / collections
1 0.00 0.00 9,446,400.00
2 0.00 0.00 9,429,800.00
3 0.00 0.00 9,142,800.00
4 0.00 0.00 9,106,400.00
5 0.00 0.00 9,534,700.00
6 0.00 0.00 9,177,400.00
7 0.00 0.00 9,431,900.00
8 0.00 0.00 9,043,400.00
9 0.00 0.00 9,161,500.00
10 0.00 0.00 8,986,100.00
11 0.00 0.00 9,098,500.00
12 0.00 0.00 9,132,300.00
13 0.00 0.00 9,147,500.00

TotalCollections [Gen2]

Run # collections collections / s ns / collections
1 0.00 0.00 9,446,400.00
2 0.00 0.00 9,429,800.00
3 0.00 0.00 9,142,800.00
4 0.00 0.00 9,106,400.00
5 0.00 0.00 9,534,700.00
6 0.00 0.00 9,177,400.00
7 0.00 0.00 9,431,900.00
8 0.00 0.00 9,043,400.00
9 0.00 0.00 9,161,500.00
10 0.00 0.00 8,986,100.00
11 0.00 0.00 9,098,500.00
12 0.00 0.00 9,132,300.00
13 0.00 0.00 9,147,500.00

[Counter] MessagesReceived

Run # operations operations / s ns / operations
1 1,000.00 105,860.43 9,446.40
2 1,000.00 106,046.79 9,429.80
3 1,000.00 109,375.68 9,142.80
4 1,000.00 109,812.88 9,106.40
5 1,000.00 104,880.07 9,534.70
6 1,000.00 108,963.32 9,177.40
7 1,000.00 106,023.18 9,431.90
8 1,000.00 110,577.88 9,043.40
9 1,000.00 109,152.43 9,161.50
10 1,000.00 111,282.98 8,986.10
11 1,000.00 109,908.23 9,098.50
12 1,000.00 109,501.44 9,132.30
13 1,000.00 109,319.49 9,147.50

Done, fixed as part of 2.1