anycable 0.5.2 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +166 -2
- data/MIT-LICENSE +1 -1
- data/README.md +19 -60
- data/bin/anycable +13 -0
- data/bin/anycabled +30 -0
- data/lib/anycable.rb +69 -18
- data/lib/anycable/broadcast_adapters.rb +33 -0
- data/lib/anycable/broadcast_adapters/redis.rb +42 -0
- data/lib/anycable/cli.rb +329 -0
- data/lib/anycable/config.rb +93 -17
- data/lib/anycable/exceptions_handling.rb +37 -0
- data/lib/anycable/health_server.rb +52 -31
- data/lib/anycable/middleware.rb +19 -0
- data/lib/anycable/middleware_chain.rb +58 -0
- data/lib/anycable/rpc/rpc_pb.rb +1 -1
- data/lib/anycable/rpc/rpc_services_pb.rb +1 -1
- data/lib/anycable/rpc_handler.rb +77 -32
- data/lib/anycable/server.rb +132 -39
- data/lib/anycable/socket.rb +1 -1
- data/lib/anycable/version.rb +2 -2
- metadata +34 -59
- data/.gitignore +0 -40
- data/.hound.yml +0 -3
- data/.rubocop.yml +0 -71
- data/.travis.yml +0 -13
- data/Gemfile +0 -8
- data/Makefile +0 -5
- data/PITCHME.md +0 -139
- data/PITCHME.yaml +0 -1
- data/Rakefile +0 -8
- data/anycable.gemspec +0 -32
- data/assets/Memory3.png +0 -0
- data/assets/Memory5.png +0 -0
- data/assets/RTT3.png +0 -0
- data/assets/RTT5.png +0 -0
- data/assets/Scheme1.png +0 -0
- data/assets/Scheme2.png +0 -0
- data/assets/cpu_chart.gif +0 -0
- data/assets/cpu_chart2.gif +0 -0
- data/assets/evlms.png +0 -0
- data/benchmarks/.gitignore +0 -1
- data/benchmarks/2017-02-12.md +0 -308
- data/benchmarks/2018-03-04.md +0 -192
- data/benchmarks/2018-05-27-rpc-bench.md +0 -57
- data/benchmarks/HowTo.md +0 -23
- data/benchmarks/ansible.cfg +0 -9
- data/benchmarks/benchmark.yml +0 -67
- data/benchmarks/hosts +0 -5
- data/benchmarks/servers.yml +0 -36
- data/circle.yml +0 -8
- data/etc/bug_report_template.rb +0 -76
- data/lib/anycable/handler/exceptions_handling.rb +0 -43
- data/lib/anycable/pubsub.rb +0 -26
- data/protos/rpc.proto +0 -55
data/PITCHME.yaml
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
theme : moon
|
data/Rakefile
DELETED
data/anycable.gemspec
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
lib = File.expand_path('../lib', __FILE__)
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require 'anycable/version'
|
6
|
-
|
7
|
-
Gem::Specification.new do |spec|
|
8
|
-
spec.name = "anycable"
|
9
|
-
spec.version = Anycable::VERSION
|
10
|
-
spec.authors = ["palkan"]
|
11
|
-
spec.email = ["dementiev.vm@gmail.com"]
|
12
|
-
|
13
|
-
spec.summary = "Polyglot replacement for ActionCable server"
|
14
|
-
spec.description = "Polyglot replacement for ActionCable server"
|
15
|
-
spec.homepage = "http://github.com/anycable/anycable"
|
16
|
-
spec.license = "MIT"
|
17
|
-
|
18
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
|
-
spec.require_paths = ["lib"]
|
20
|
-
|
21
|
-
spec.add_dependency "anyway_config", "~> 1.1", ">= 1.1.1"
|
22
|
-
spec.add_dependency "grpc", "~> 1.6"
|
23
|
-
spec.add_dependency "redis", ">= 3.2"
|
24
|
-
|
25
|
-
spec.add_development_dependency "bundler", "~> 1"
|
26
|
-
spec.add_development_dependency "rake", ">= 10.0"
|
27
|
-
spec.add_development_dependency "rack", "~> 2.0"
|
28
|
-
spec.add_development_dependency "rspec", ">= 3.5"
|
29
|
-
spec.add_development_dependency "rubocop", "~> 0.58.0"
|
30
|
-
spec.add_development_dependency "simplecov", ">= 0.3.8"
|
31
|
-
spec.add_development_dependency "pry-byebug"
|
32
|
-
end
|
data/assets/Memory3.png
DELETED
Binary file
|
data/assets/Memory5.png
DELETED
Binary file
|
data/assets/RTT3.png
DELETED
Binary file
|
data/assets/RTT5.png
DELETED
Binary file
|
data/assets/Scheme1.png
DELETED
Binary file
|
data/assets/Scheme2.png
DELETED
Binary file
|
data/assets/cpu_chart.gif
DELETED
Binary file
|
data/assets/cpu_chart2.gif
DELETED
Binary file
|
data/assets/evlms.png
DELETED
Binary file
|
data/benchmarks/.gitignore
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
*.retry
|
data/benchmarks/2017-02-12.md
DELETED
@@ -1,308 +0,0 @@
|
|
1
|
-
# WebSocket Shootout Benchmark (2017-02-12)
|
2
|
-
|
3
|
-
Code: https://github.com/palkan/websocket-shootout
|
4
|
-
Client/Server instances: c3.4xlarge (16 vCPU, 30 GiB RAM).
|
5
|
-
|
6
|
-
Ruby: 2.3.4
|
7
|
-
Rails: 5.1.0
|
8
|
-
|
9
|
-
The benchmark measures broadcasting RTT for 10k clients.
|
10
|
-
|
11
|
-
**NOTE**: memory and CPU usage was measured by looking at `htop` output.
|
12
|
-
|
13
|
-
## Action Cable (8 workers)
|
14
|
-
|
15
|
-
```
|
16
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/cable --server-type=actioncable
|
17
|
-
|
18
|
-
clients: 1000 95per-rtt: 700ms min-rtt: 2ms median-rtt: 264ms max-rtt: 854ms
|
19
|
-
clients: 2000 95per-rtt: 1155ms min-rtt: 1ms median-rtt: 490ms max-rtt: 1358ms
|
20
|
-
clients: 3000 95per-rtt: 1584ms min-rtt: 1ms median-rtt: 769ms max-rtt: 1644ms
|
21
|
-
clients: 4000 95per-rtt: 1787ms min-rtt: 1ms median-rtt: 1089ms max-rtt: 2053ms
|
22
|
-
clients: 5000 95per-rtt: 2258ms min-rtt: 2ms median-rtt: 1387ms max-rtt: 2594ms
|
23
|
-
clients: 6000 95per-rtt: 3068ms min-rtt: 2ms median-rtt: 1733ms max-rtt: 3190ms
|
24
|
-
clients: 7000 95per-rtt: 3907ms min-rtt: 1ms median-rtt: 1734ms max-rtt: 4332ms
|
25
|
-
clients: 8000 95per-rtt: 4479ms min-rtt: 1ms median-rtt: 2137ms max-rtt: 5469ms
|
26
|
-
clients: 9000 95per-rtt: 5734ms min-rtt: 1ms median-rtt: 2356ms max-rtt: 8234ms
|
27
|
-
clients: 10000 95per-rtt: 5292ms min-rtt: 1ms median-rtt: 2784ms max-rtt: 6454ms
|
28
|
-
|
29
|
-
Missing received broadcasts: expected 6600000, got 6572168
|
30
|
-
```
|
31
|
-
|
32
|
-
CPU: ~70%
|
33
|
-
|
34
|
-
MEM: ~ 4 GiB
|
35
|
-
|
36
|
-
## Action Cable (16 workers)
|
37
|
-
|
38
|
-
```
|
39
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/cable --server-type=actioncable
|
40
|
-
|
41
|
-
clients: 1000 95per-rtt: 575ms min-rtt: 1ms median-rtt: 115ms max-rtt: 846ms
|
42
|
-
clients: 2000 95per-rtt: 1144ms min-rtt: 1ms median-rtt: 250ms max-rtt: 1457ms
|
43
|
-
clients: 3000 95per-rtt: 1274ms min-rtt: 1ms median-rtt: 439ms max-rtt: 1673ms
|
44
|
-
clients: 4000 95per-rtt: 1768ms min-rtt: 21ms median-rtt: 626ms max-rtt: 2083ms
|
45
|
-
clients: 5000 95per-rtt: 1462ms min-rtt: 1ms median-rtt: 892ms max-rtt: 1767ms
|
46
|
-
clients: 6000 95per-rtt: 2579ms min-rtt: 1ms median-rtt: 834ms max-rtt: 2771ms
|
47
|
-
clients: 7000 95per-rtt: 3033ms min-rtt: 1ms median-rtt: 1008ms max-rtt: 3325ms
|
48
|
-
clients: 8000 95per-rtt: 3275ms min-rtt: 1ms median-rtt: 1160ms max-rtt: 4268ms
|
49
|
-
clients: 9000 95per-rtt: 4406ms min-rtt: 1ms median-rtt: 1342ms max-rtt: 5018ms
|
50
|
-
clients: 10000 95per-rtt: 5414ms min-rtt: 1ms median-rtt: 1504ms max-rtt: 7039ms
|
51
|
-
|
52
|
-
Missing received broadcasts: expected 6600000, got 6589644
|
53
|
-
```
|
54
|
-
|
55
|
-
CPU: ~80-100%
|
56
|
-
|
57
|
-
MEM: ~ 5 GiB
|
58
|
-
|
59
|
-
## ActionCable / Patched (8 workers)
|
60
|
-
|
61
|
-
About patch: https://github.com/rails/rails/issues/26999
|
62
|
-
|
63
|
-
```
|
64
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/cable --server-type=actioncable
|
65
|
-
|
66
|
-
clients: 1000 95per-rtt: 161ms min-rtt: 1ms median-rtt: 44ms max-rtt: 236ms
|
67
|
-
clients: 2000 95per-rtt: 292ms min-rtt: 1ms median-rtt: 43ms max-rtt: 389ms
|
68
|
-
clients: 3000 95per-rtt: 359ms min-rtt: 1ms median-rtt: 96ms max-rtt: 556ms
|
69
|
-
clients: 4000 95per-rtt: 467ms min-rtt: 1ms median-rtt: 97ms max-rtt: 657ms
|
70
|
-
clients: 5000 95per-rtt: 699ms min-rtt: 1ms median-rtt: 101ms max-rtt: 854ms
|
71
|
-
clients: 6000 95per-rtt: 556ms min-rtt: 1ms median-rtt: 77ms max-rtt: 713ms
|
72
|
-
clients: 7000 95per-rtt: 717ms min-rtt: 1ms median-rtt: 95ms max-rtt: 1145ms
|
73
|
-
clients: 8000 95per-rtt: 679ms min-rtt: 1ms median-rtt: 19ms max-rtt: 1089ms
|
74
|
-
clients: 9000 95per-rtt: 561ms min-rtt: 1ms median-rtt: 25ms max-rtt: 938ms
|
75
|
-
clients: 10000 95per-rtt: 1038ms min-rtt: 1ms median-rtt: 59ms max-rtt: 2197ms
|
76
|
-
|
77
|
-
Missing received broadcasts: expected 6600000, got 5649743
|
78
|
-
```
|
79
|
-
|
80
|
-
CPU: ~70%
|
81
|
-
|
82
|
-
MEM: ~ 4 GiB
|
83
|
-
|
84
|
-
## ActionCable / Patched (16 workers)
|
85
|
-
|
86
|
-
```
|
87
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/cable --server-type=actioncable
|
88
|
-
|
89
|
-
clients: 1000 95per-rtt: 228ms min-rtt: 1ms median-rtt: 53ms max-rtt: 425ms
|
90
|
-
clients: 2000 95per-rtt: 277ms min-rtt: 1ms median-rtt: 63ms max-rtt: 407ms
|
91
|
-
clients: 3000 95per-rtt: 349ms min-rtt: 1ms median-rtt: 28ms max-rtt: 640ms
|
92
|
-
clients: 4000 95per-rtt: 459ms min-rtt: 1ms median-rtt: 56ms max-rtt: 699ms
|
93
|
-
clients: 5000 95per-rtt: 485ms min-rtt: 1ms median-rtt: 52ms max-rtt: 588ms
|
94
|
-
clients: 6000 95per-rtt: 493ms min-rtt: 1ms median-rtt: 86ms max-rtt: 572ms
|
95
|
-
clients: 7000 95per-rtt: 466ms min-rtt: 1ms median-rtt: 90ms max-rtt: 739ms
|
96
|
-
clients: 8000 95per-rtt: 530ms min-rtt: 1ms median-rtt: 26ms max-rtt: 1225ms
|
97
|
-
clients: 9000 95per-rtt: 459ms min-rtt: 1ms median-rtt: 39ms max-rtt: 622ms
|
98
|
-
clients: 10000 95per-rtt: 477ms min-rtt: 1ms median-rtt: 71ms max-rtt: 632ms
|
99
|
-
|
100
|
-
Missing received broadcasts: expected 6600000, got 5662008
|
101
|
-
```
|
102
|
-
|
103
|
-
CPU: ~80-100%
|
104
|
-
|
105
|
-
MEM: ~ 5 GiB
|
106
|
-
|
107
|
-
## Action Cable / AnyCable-Go
|
108
|
-
|
109
|
-
```
|
110
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/cable --server-type=actioncable
|
111
|
-
|
112
|
-
clients: 1000 95per-rtt: 172ms min-rtt: 2ms median-rtt: 9ms max-rtt: 220ms
|
113
|
-
clients: 2000 95per-rtt: 228ms min-rtt: 2ms median-rtt: 16ms max-rtt: 498ms
|
114
|
-
clients: 3000 95per-rtt: 367ms min-rtt: 2ms median-rtt: 14ms max-rtt: 798ms
|
115
|
-
clients: 4000 95per-rtt: 426ms min-rtt: 2ms median-rtt: 24ms max-rtt: 965ms
|
116
|
-
clients: 5000 95per-rtt: 652ms min-rtt: 2ms median-rtt: 30ms max-rtt: 1062ms
|
117
|
-
clients: 6000 95per-rtt: 580ms min-rtt: 2ms median-rtt: 44ms max-rtt: 1306ms
|
118
|
-
clients: 7000 95per-rtt: 813ms min-rtt: 2ms median-rtt: 40ms max-rtt: 2270ms
|
119
|
-
clients: 8000 95per-rtt: 657ms min-rtt: 2ms median-rtt: 39ms max-rtt: 2457ms
|
120
|
-
clients: 9000 95per-rtt: 792ms min-rtt: 2ms median-rtt: 117ms max-rtt: 1557ms
|
121
|
-
clients: 10000 95per-rtt: 727ms min-rtt: 2ms median-rtt: 66ms max-rtt: 3391ms
|
122
|
-
|
123
|
-
Missing received broadcasts: expected 6600000, got 6588881
|
124
|
-
```
|
125
|
-
|
126
|
-
CPU: 15-25%
|
127
|
-
|
128
|
-
MEM: ~500 MiB
|
129
|
-
|
130
|
-
## JavaScript / uWS (clustered)
|
131
|
-
|
132
|
-
```
|
133
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334
|
134
|
-
|
135
|
-
clients: 1000 95per-rtt: 207ms min-rtt: 0ms median-rtt: 8ms max-rtt: 611ms
|
136
|
-
clients: 2000 95per-rtt: 393ms min-rtt: 2ms median-rtt: 20ms max-rtt: 750ms
|
137
|
-
clients: 3000 95per-rtt: 425ms min-rtt: 4ms median-rtt: 25ms max-rtt: 1196ms
|
138
|
-
clients: 4000 95per-rtt: 483ms min-rtt: 4ms median-rtt: 29ms max-rtt: 626ms
|
139
|
-
clients: 5000 95per-rtt: 481ms min-rtt: 5ms median-rtt: 26ms max-rtt: 1397ms
|
140
|
-
clients: 6000 95per-rtt: 824ms min-rtt: 5ms median-rtt: 54ms max-rtt: 1847ms
|
141
|
-
clients: 7000 95per-rtt: 635ms min-rtt: 6ms median-rtt: 37ms max-rtt: 1602ms
|
142
|
-
clients: 8000 95per-rtt: 782ms min-rtt: 5ms median-rtt: 142ms max-rtt: 1439ms
|
143
|
-
clients: 9000 95per-rtt: 610ms min-rtt: 7ms median-rtt: 72ms max-rtt: 1552ms
|
144
|
-
clients: 10000 95per-rtt: 1216ms min-rtt: 7ms median-rtt: 91ms max-rtt: 2195ms
|
145
|
-
|
146
|
-
Missing received broadcasts: expected 6600000, got 6599571
|
147
|
-
```
|
148
|
-
|
149
|
-
CPU: 7-8%
|
150
|
-
|
151
|
-
MEM: ~400 MiB
|
152
|
-
|
153
|
-
## Go / WebSocket
|
154
|
-
|
155
|
-
```
|
156
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/json
|
157
|
-
|
158
|
-
clients: 1000 95per-rtt: 27ms min-rtt: 7ms median-rtt: 16ms max-rtt: 44ms
|
159
|
-
clients: 2000 95per-rtt: 193ms min-rtt: 12ms median-rtt: 28ms max-rtt: 235ms
|
160
|
-
clients: 3000 95per-rtt: 231ms min-rtt: 15ms median-rtt: 35ms max-rtt: 433ms
|
161
|
-
clients: 4000 95per-rtt: 293ms min-rtt: 19ms median-rtt: 43ms max-rtt: 425ms
|
162
|
-
clients: 5000 95per-rtt: 618ms min-rtt: 27ms median-rtt: 47ms max-rtt: 2253ms
|
163
|
-
clients: 6000 95per-rtt: 297ms min-rtt: 34ms median-rtt: 72ms max-rtt: 619ms
|
164
|
-
clients: 7000 95per-rtt: 449ms min-rtt: 38ms median-rtt: 74ms max-rtt: 5360ms
|
165
|
-
clients: 8000 95per-rtt: 539ms min-rtt: 43ms median-rtt: 89ms max-rtt: 1351ms
|
166
|
-
clients: 9000 95per-rtt: 534ms min-rtt: 48ms median-rtt: 96ms max-rtt: 2978ms
|
167
|
-
clients: 10000 95per-rtt: 414ms min-rtt: 57ms median-rtt: 123ms max-rtt: 3424ms
|
168
|
-
|
169
|
-
Missing received broadcasts: expected 6600000, got 6593825
|
170
|
-
```
|
171
|
-
|
172
|
-
CPU: one core – ~80-100%, other cores – ~7-10%
|
173
|
-
|
174
|
-
MEM: ~400 MiB
|
175
|
-
|
176
|
-
## Erlang / Cowboy
|
177
|
-
|
178
|
-
```
|
179
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/ws/cable
|
180
|
-
|
181
|
-
clients: 1000 95per-rtt: 204ms min-rtt: 2ms median-rtt: 11ms max-rtt: 585ms
|
182
|
-
clients: 2000 95per-rtt: 219ms min-rtt: 3ms median-rtt: 20ms max-rtt: 620ms
|
183
|
-
clients: 3000 95per-rtt: 348ms min-rtt: 6ms median-rtt: 19ms max-rtt: 1447ms
|
184
|
-
clients: 4000 95per-rtt: 440ms min-rtt: 8ms median-rtt: 32ms max-rtt: 961ms
|
185
|
-
clients: 5000 95per-rtt: 574ms min-rtt: 10ms median-rtt: 30ms max-rtt: 1233ms
|
186
|
-
clients: 6000 95per-rtt: 672ms min-rtt: 12ms median-rtt: 40ms max-rtt: 1493ms
|
187
|
-
clients: 7000 95per-rtt: 542ms min-rtt: 13ms median-rtt: 76ms max-rtt: 1392ms
|
188
|
-
clients: 8000 95per-rtt: 737ms min-rtt: 16ms median-rtt: 57ms max-rtt: 1527ms
|
189
|
-
clients: 9000 95per-rtt: 634ms min-rtt: 17ms median-rtt: 74ms max-rtt: 1479ms
|
190
|
-
clients: 10000 95per-rtt: 792ms min-rtt: 17ms median-rtt: 79ms max-rtt: 3805ms
|
191
|
-
|
192
|
-
Missing received broadcasts: expected 6600000, got 6575292
|
193
|
-
```
|
194
|
-
|
195
|
-
cCPU: 20-30%
|
196
|
-
|
197
|
-
MEM: ~500 MiB
|
198
|
-
|
199
|
-
## Ruby / Plezi (1x8)
|
200
|
-
|
201
|
-
```
|
202
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/
|
203
|
-
|
204
|
-
clients: 1000 95per-rtt: 84ms min-rtt: 3ms median-rtt: 42ms max-rtt: 95ms
|
205
|
-
clients: 2000 95per-rtt: 211ms min-rtt: 4ms median-rtt: 60ms max-rtt: 318ms
|
206
|
-
clients: 3000 95per-rtt: 525ms min-rtt: 2ms median-rtt: 93ms max-rtt: 527ms
|
207
|
-
clients: 4000 95per-rtt: 502ms min-rtt: 5ms median-rtt: 123ms max-rtt: 601ms
|
208
|
-
clients: 5000 95per-rtt: 807ms min-rtt: 1ms median-rtt: 156ms max-rtt: 869ms
|
209
|
-
clients: 6000 95per-rtt: 942ms min-rtt: 6ms median-rtt: 167ms max-rtt: 1126ms
|
210
|
-
clients: 7000 95per-rtt: 1100ms min-rtt: 1ms median-rtt: 249ms max-rtt: 1181ms
|
211
|
-
clients: 8000 95per-rtt: 1094ms min-rtt: 7ms median-rtt: 298ms max-rtt: 1134ms
|
212
|
-
clients: 9000 95per-rtt: 1265ms min-rtt: 1ms median-rtt: 342ms max-rtt: 1407ms
|
213
|
-
clients: 10000 95per-rtt: 1523ms min-rtt: 2ms median-rtt: 388ms max-rtt: 1555ms
|
214
|
-
|
215
|
-
Missing received broadcasts: expected 6600000, got 6599226
|
216
|
-
```
|
217
|
-
|
218
|
-
CPU: ~10-15% (only 1/2 of cores affected)
|
219
|
-
|
220
|
-
MEM: ~300 MiB
|
221
|
-
|
222
|
-
## Ruby / Plezi (8x8)
|
223
|
-
|
224
|
-
```
|
225
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/
|
226
|
-
|
227
|
-
clients: 1000 95per-rtt: 46ms min-rtt: 1ms median-rtt: 8ms max-rtt: 115ms
|
228
|
-
clients: 2000 95per-rtt: 152ms min-rtt: 1ms median-rtt: 17ms max-rtt: 241ms
|
229
|
-
clients: 3000 95per-rtt: 207ms min-rtt: 1ms median-rtt: 26ms max-rtt: 254ms
|
230
|
-
clients: 4000 95per-rtt: 211ms min-rtt: 1ms median-rtt: 54ms max-rtt: 397ms
|
231
|
-
clients: 5000 95per-rtt: 260ms min-rtt: 1ms median-rtt: 33ms max-rtt: 814ms
|
232
|
-
clients: 6000 95per-rtt: 228ms min-rtt: 1ms median-rtt: 34ms max-rtt: 616ms
|
233
|
-
clients: 7000 95per-rtt: 210ms min-rtt: 1ms median-rtt: 59ms max-rtt: 401ms
|
234
|
-
clients: 8000 95per-rtt: 498ms min-rtt: 2ms median-rtt: 58ms max-rtt: 749ms
|
235
|
-
clients: 9000 95per-rtt: 651ms min-rtt: 2ms median-rtt: 52ms max-rtt: 766ms
|
236
|
-
clients: 10000 95per-rtt: 796ms min-rtt: 1ms median-rtt: 90ms max-rtt: 800ms
|
237
|
-
|
238
|
-
Missing received broadcasts: expected 6600000, got 2736158
|
239
|
-
```
|
240
|
-
|
241
|
-
CPU: ~10%
|
242
|
-
|
243
|
-
MEM: ~350 MiB
|
244
|
-
|
245
|
-
**NOTE**: looks like something goes wrong, too high message loss
|
246
|
-
|
247
|
-
## Ruby / EventMachine
|
248
|
-
|
249
|
-
EM shows great results but only for the first run (`em-websocket` bug?).
|
250
|
-
|
251
|
-
First run:
|
252
|
-
|
253
|
-
```
|
254
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/
|
255
|
-
|
256
|
-
clients: 1000 95per-rtt: 24ms min-rtt: 5ms median-rtt: 20ms max-rtt: 30ms
|
257
|
-
clients: 2000 95per-rtt: 61ms min-rtt: 13ms median-rtt: 42ms max-rtt: 73ms
|
258
|
-
clients: 3000 95per-rtt: 84ms min-rtt: 18ms median-rtt: 68ms max-rtt: 109ms
|
259
|
-
clients: 4000 95per-rtt: 124ms min-rtt: 21ms median-rtt: 104ms max-rtt: 156ms
|
260
|
-
clients: 5000 95per-rtt: 201ms min-rtt: 30ms median-rtt: 123ms max-rtt: 253ms
|
261
|
-
clients: 6000 95per-rtt: 226ms min-rtt: 41ms median-rtt: 145ms max-rtt: 293ms
|
262
|
-
clients: 7000 95per-rtt: 308ms min-rtt: 43ms median-rtt: 190ms max-rtt: 343ms
|
263
|
-
clients: 8000 95per-rtt: 383ms min-rtt: 52ms median-rtt: 218ms max-rtt: 458ms
|
264
|
-
clients: 9000 95per-rtt: 401ms min-rtt: 50ms median-rtt: 218ms max-rtt: 550ms
|
265
|
-
clients: 10000 95per-rtt: 429ms min-rtt: 60ms median-rtt: 246ms max-rtt: 530ms
|
266
|
-
|
267
|
-
Missing received broadcasts: expected 6600000, got 6599593
|
268
|
-
```
|
269
|
-
|
270
|
-
Second run:
|
271
|
-
|
272
|
-
```
|
273
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/
|
274
|
-
|
275
|
-
clients: 1000 95per-rtt: 246ms min-rtt: 47ms median-rtt: 197ms max-rtt: 287ms
|
276
|
-
clients: 2000 95per-rtt: 296ms min-rtt: 63ms median-rtt: 229ms max-rtt: 400ms
|
277
|
-
clients: 3000 95per-rtt: 325ms min-rtt: 184ms median-rtt: 261ms max-rtt: 335ms
|
278
|
-
clients: 4000 95per-rtt: 370ms min-rtt: 76ms median-rtt: 299ms max-rtt: 505ms
|
279
|
-
clients: 5000 95per-rtt: 598ms min-rtt: 83ms median-rtt: 345ms max-rtt: 696ms
|
280
|
-
clients: 6000 95per-rtt: 580ms min-rtt: 87ms median-rtt: 326ms max-rtt: 768ms
|
281
|
-
clients: 7000 95per-rtt: 637ms min-rtt: 79ms median-rtt: 356ms max-rtt: 673ms
|
282
|
-
clients: 8000 95per-rtt: 684ms min-rtt: 92ms median-rtt: 390ms max-rtt: 771ms
|
283
|
-
clients: 9000 95per-rtt: 733ms min-rtt: 102ms median-rtt: 430ms max-rtt: 833ms
|
284
|
-
clients: 10000 95per-rtt: 813ms min-rtt: 101ms median-rtt: 448ms max-rtt: 989ms
|
285
|
-
```
|
286
|
-
|
287
|
-
Third run:
|
288
|
-
|
289
|
-
```
|
290
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/
|
291
|
-
|
292
|
-
clients: 1000 95per-rtt: 522ms min-rtt: 115ms median-rtt: 414ms max-rtt: 719ms
|
293
|
-
clients: 2000 95per-rtt: 558ms min-rtt: 119ms median-rtt: 444ms max-rtt: 763ms
|
294
|
-
clients: 3000 95per-rtt: 499ms min-rtt: 127ms median-rtt: 489ms max-rtt: 833ms
|
295
|
-
clients: 4000 95per-rtt: 538ms min-rtt: 137ms median-rtt: 522ms max-rtt: 882ms
|
296
|
-
clients: 5000 95per-rtt: 867ms min-rtt: 140ms median-rtt: 564ms max-rtt: 1128ms
|
297
|
-
clients: 6000 95per-rtt: 1085ms min-rtt: 151ms median-rtt: 592ms max-rtt: 1344ms
|
298
|
-
clients: 7000 95per-rtt: 960ms min-rtt: 130ms median-rtt: 571ms max-rtt: 1258ms
|
299
|
-
clients: 8000 95per-rtt: 1038ms min-rtt: 145ms median-rtt: 592ms max-rtt: 1179ms
|
300
|
-
clients: 9000 95per-rtt: 1110ms min-rtt: 140ms median-rtt: 625ms max-rtt: 1405ms
|
301
|
-
clients: 10000 95per-rtt: 1176ms min-rtt: 163ms median-rtt: 649ms max-rtt: 1633ms
|
302
|
-
|
303
|
-
Missing received broadcasts: expected 6600000, got 6599123
|
304
|
-
```
|
305
|
-
|
306
|
-
CPU: one core is totally f**ked up
|
307
|
-
|
308
|
-
MEM: ~100 MiB
|
data/benchmarks/2018-03-04.md
DELETED
@@ -1,192 +0,0 @@
|
|
1
|
-
# WebSocket Shootout Benchmark (2018-03-04)
|
2
|
-
|
3
|
-
Code: https://github.com/palkan/websocket-shootout
|
4
|
-
Client/Server instances: c3.2xlarge (8 vCPU, 15 GiB RAM).
|
5
|
-
|
6
|
-
Ruby: 2.5.0
|
7
|
-
Rails: 5.1.4
|
8
|
-
|
9
|
-
The benchmark measures broadcasting RTT for 10k clients.
|
10
|
-
|
11
|
-
**NOTE**: memory and peak CPU usage was measured by looking at `htop` output; avg CPU usage is a 1 minute LA.
|
12
|
-
|
13
|
-
## Action Cable (8 workers)
|
14
|
-
|
15
|
-
Command:
|
16
|
-
|
17
|
-
```sh
|
18
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/cable --server-type=actioncable
|
19
|
-
|
20
|
-
clients: 1000 95per-rtt: 847ms min-rtt: 1ms median-rtt: 174ms max-rtt: 930ms
|
21
|
-
clients: 2000 95per-rtt: 1611ms min-rtt: 1ms median-rtt: 387ms max-rtt: 1768ms
|
22
|
-
clients: 3000 95per-rtt: 2107ms min-rtt: 1ms median-rtt: 644ms max-rtt: 2601ms
|
23
|
-
clients: 4000 95per-rtt: 2504ms min-rtt: 1ms median-rtt: 899ms max-rtt: 3118ms
|
24
|
-
clients: 5000 95per-rtt: 3452ms min-rtt: 1ms median-rtt: 1070ms max-rtt: 4487ms
|
25
|
-
clients: 6000 95per-rtt: 4044ms min-rtt: 1ms median-rtt: 1261ms max-rtt: 5018ms
|
26
|
-
clients: 7000 95per-rtt: 3207ms min-rtt: 1ms median-rtt: 1647ms max-rtt: 3958ms
|
27
|
-
clients: 8000 95per-rtt: 4115ms min-rtt: 1ms median-rtt: 1957ms max-rtt: 5059ms
|
28
|
-
clients: 9000 95per-rtt: 4306ms min-rtt: 1ms median-rtt: 2273ms max-rtt: 7160ms
|
29
|
-
clients: 10000 95per-rtt: 5147ms min-rtt: 1ms median-rtt: 2462ms max-rtt: 6734ms
|
30
|
-
|
31
|
-
Missing received broadcasts: expected 6600000, got 6554972
|
32
|
-
```
|
33
|
-
|
34
|
-
CPU (peak): ~100%
|
35
|
-
CPU (avg): ~30%
|
36
|
-
|
37
|
-
MEM: ~1.7 GiB
|
38
|
-
|
39
|
-
|
40
|
-
## AnyCable-Go 0.5.4
|
41
|
-
|
42
|
-
```
|
43
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/cable --server-type=actioncable
|
44
|
-
|
45
|
-
clients: 1000 95per-rtt: 61ms min-rtt: 2ms median-rtt: 18ms max-rtt: 178ms
|
46
|
-
clients: 2000 95per-rtt: 214ms min-rtt: 2ms median-rtt: 26ms max-rtt: 568ms
|
47
|
-
clients: 3000 95per-rtt: 275ms min-rtt: 2ms median-rtt: 32ms max-rtt: 645ms
|
48
|
-
clients: 4000 95per-rtt: 430ms min-rtt: 2ms median-rtt: 40ms max-rtt: 1463ms
|
49
|
-
clients: 5000 95per-rtt: 352ms min-rtt: 3ms median-rtt: 61ms max-rtt: 1017ms
|
50
|
-
clients: 6000 95per-rtt: 619ms min-rtt: 3ms median-rtt: 60ms max-rtt: 1630ms
|
51
|
-
clients: 7000 95per-rtt: 623ms min-rtt: 2ms median-rtt: 74ms max-rtt: 3099ms
|
52
|
-
clients: 8000 95per-rtt: 846ms min-rtt: 2ms median-rtt: 89ms max-rtt: 3165ms
|
53
|
-
clients: 9000 95per-rtt: 642ms min-rtt: 2ms median-rtt: 110ms max-rtt: 981ms
|
54
|
-
clients: 10000 95per-rtt: 1019ms min-rtt: 2ms median-rtt: 114ms max-rtt: 4759ms
|
55
|
-
|
56
|
-
Missing received broadcasts: expected 6600000, got 6580959
|
57
|
-
```
|
58
|
-
|
59
|
-
CPU (peak): ~40%
|
60
|
-
CPU (avg): ~3%
|
61
|
-
|
62
|
-
MEM: ~500 MiB
|
63
|
-
|
64
|
-
## AnyCable-Go 0.6.0-preview1
|
65
|
-
|
66
|
-
```
|
67
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 --origin http://0.0.0.0 ws://172.31.22.121:3334/cable --server-type=actioncable
|
68
|
-
|
69
|
-
clients: 1000 95per-rtt: 64ms min-rtt: 2ms median-rtt: 15ms max-rtt: 191ms
|
70
|
-
clients: 2000 95per-rtt: 188ms min-rtt: 2ms median-rtt: 27ms max-rtt: 325ms
|
71
|
-
clients: 3000 95per-rtt: 218ms min-rtt: 2ms median-rtt: 36ms max-rtt: 854ms
|
72
|
-
clients: 4000 95per-rtt: 483ms min-rtt: 2ms median-rtt: 37ms max-rtt: 2353ms
|
73
|
-
clients: 5000 95per-rtt: 388ms min-rtt: 2ms median-rtt: 63ms max-rtt: 659ms
|
74
|
-
clients: 6000 95per-rtt: 500ms min-rtt: 2ms median-rtt: 59ms max-rtt: 1430ms
|
75
|
-
clients: 7000 95per-rtt: 692ms min-rtt: 2ms median-rtt: 85ms max-rtt: 1333ms
|
76
|
-
clients: 8000 95per-rtt: 591ms min-rtt: 2ms median-rtt: 90ms max-rtt: 2499ms
|
77
|
-
clients: 9000 95per-rtt: 959ms min-rtt: 2ms median-rtt: 90ms max-rtt: 5961ms
|
78
|
-
clients: 10000 95per-rtt: 674ms min-rtt: 2ms median-rtt: 106ms max-rtt: 2543ms
|
79
|
-
|
80
|
-
Missing received broadcasts: expected 6600000, got 6599507
|
81
|
-
```
|
82
|
-
|
83
|
-
CPU (peak): ~40%
|
84
|
-
CPU (avg): ~3%
|
85
|
-
|
86
|
-
MEM: ~450 MiB
|
87
|
-
|
88
|
-
## Plezi (0.15.0) + Iodine (0.4.16) (8 workers)
|
89
|
-
|
90
|
-
```
|
91
|
-
bin/websocket-bench broadcast -l 172.31.26.145 -l 172.31.26.146 -l 172.31.26.147 --concurrent 4 --sample-size 100 --step-size 1000 --payload-padding 200 --total-steps 10 ws://172.31.22.121:3334/cable
|
92
|
-
|
93
|
-
clients: 1000 95per-rtt: 48ms min-rtt: 1ms median-rtt: 18ms max-rtt: 208ms
|
94
|
-
clients: 2000 95per-rtt: 236ms min-rtt: 0ms median-rtt: 24ms max-rtt: 612ms
|
95
|
-
clients: 3000 95per-rtt: 224ms min-rtt: 0ms median-rtt: 38ms max-rtt: 662ms
|
96
|
-
clients: 4000 95per-rtt: 402ms min-rtt: 0ms median-rtt: 39ms max-rtt: 3071ms
|
97
|
-
clients: 5000 95per-rtt: 392ms min-rtt: 1ms median-rtt: 47ms max-rtt: 1850ms
|
98
|
-
clients: 6000 95per-rtt: 582ms min-rtt: 1ms median-rtt: 64ms max-rtt: 1825ms
|
99
|
-
clients: 7000 95per-rtt: 393ms min-rtt: 1ms median-rtt: 92ms max-rtt: 729ms
|
100
|
-
clients: 8000 95per-rtt: 1181ms min-rtt: 1ms median-rtt: 42ms max-rtt: 5782ms
|
101
|
-
clients: 9000 95per-rtt: 676ms min-rtt: 1ms median-rtt: 107ms max-rtt: 2220ms
|
102
|
-
clients: 10000 95per-rtt: 603ms min-rtt: 1ms median-rtt: 131ms max-rtt: 5703ms
|
103
|
-
|
104
|
-
Missing received broadcasts: expected 6600000, got 6586987
|
105
|
-
```
|
106
|
-
|
107
|
-
CPU (peak): ~50%
|
108
|
-
CPU (avg): ~5%
|
109
|
-
|
110
|
-
MEM: ~700 MiB
|
111
|
-
|
112
|
-
*NOTE*: Plezi app is not a Rails app, thus its memory is less than in Rails examples.
|
113
|
-
|
114
|
-
# More Stress
|
115
|
-
|
116
|
-
Peak connections: 20k.
|
117
|
-
Concurrency: 8.
|
118
|
-
|
119
|
-
## Plezi (0.15.0) + Iodine (0.4.16)
|
120
|
-
|
121
|
-
CPU (peak): ~90%
|
122
|
-
CPU (avg): ~6%
|
123
|
-
Mem: ~1100MB
|
124
|
-
|
125
|
-
|
126
|
-
```
|
127
|
-
clients: 1000 95per-rtt: 216ms min-rtt: 1ms median-rtt: 17ms max-rtt: 364ms
|
128
|
-
clients: 2000 95per-rtt: 446ms min-rtt: 0ms median-rtt: 24ms max-rtt: 738ms
|
129
|
-
clients: 3000 95per-rtt: 348ms min-rtt: 0ms median-rtt: 46ms max-rtt: 925ms
|
130
|
-
clients: 4000 95per-rtt: 654ms min-rtt: 2ms median-rtt: 65ms max-rtt: 1175ms
|
131
|
-
clients: 5000 95per-rtt: 590ms min-rtt: 0ms median-rtt: 67ms max-rtt: 1842ms
|
132
|
-
clients: 6000 95per-rtt: 469ms min-rtt: 1ms median-rtt: 121ms max-rtt: 1098ms
|
133
|
-
clients: 7000 95per-rtt: 705ms min-rtt: 1ms median-rtt: 121ms max-rtt: 1617ms
|
134
|
-
clients: 8000 95per-rtt: 1090ms min-rtt: 1ms median-rtt: 159ms max-rtt: 3253ms
|
135
|
-
clients: 9000 95per-rtt: 869ms min-rtt: 1ms median-rtt: 163ms max-rtt: 3945ms
|
136
|
-
clients: 10000 95per-rtt: 1171ms min-rtt: 1ms median-rtt: 247ms max-rtt: 2326ms
|
137
|
-
clients: 11000 95per-rtt: 1634ms min-rtt: 1ms median-rtt: 191ms max-rtt: 4383ms
|
138
|
-
clients: 12000 95per-rtt: 1138ms min-rtt: 2ms median-rtt: 283ms max-rtt: 8319ms
|
139
|
-
clients: 13000 95per-rtt: 1234ms min-rtt: 1ms median-rtt: 306ms max-rtt: 5429ms
|
140
|
-
clients: 14000 95per-rtt: 947ms min-rtt: 1ms median-rtt: 346ms max-rtt: 7804ms
|
141
|
-
clients: 15000 95per-rtt: 1716ms min-rtt: 1ms median-rtt: 344ms max-rtt: 7372ms
|
142
|
-
clients: 16000 95per-rtt: 1999ms min-rtt: 1ms median-rtt: 364ms max-rtt: 3047ms
|
143
|
-
clients: 17000 95per-rtt: 1729ms min-rtt: 1ms median-rtt: 410ms max-rtt: 7231ms
|
144
|
-
clients: 18000 95per-rtt: 1455ms min-rtt: 1ms median-rtt: 442ms max-rtt: 4725ms
|
145
|
-
clients: 19000 95per-rtt: 2006ms min-rtt: 1ms median-rtt: 456ms max-rtt: 3811ms
|
146
|
-
clients: 20000 95per-rtt: 2923ms min-rtt: 1ms median-rtt: 378ms max-rtt: 11954ms
|
147
|
-
|
148
|
-
Missing received broadcasts: expected 23100000, got 23089387
|
149
|
-
```
|
150
|
-
|
151
|
-
## Anycable-Go 0.6.0-preview1
|
152
|
-
|
153
|
-
CPU (peak): ~60%
|
154
|
-
CPU (avg): ~4%
|
155
|
-
Mem: ~1000MB
|
156
|
-
|
157
|
-
```
|
158
|
-
clients: 1000 95per-rtt: 173ms min-rtt: 2ms median-rtt: 21ms max-rtt: 617ms
|
159
|
-
clients: 2000 95per-rtt: 311ms min-rtt: 2ms median-rtt: 39ms max-rtt: 594ms
|
160
|
-
clients: 3000 95per-rtt: 386ms min-rtt: 3ms median-rtt: 91ms max-rtt: 592ms
|
161
|
-
clients: 4000 95per-rtt: 539ms min-rtt: 2ms median-rtt: 93ms max-rtt: 973ms
|
162
|
-
clients: 5000 95per-rtt: 534ms min-rtt: 2ms median-rtt: 128ms max-rtt: 1486ms
|
163
|
-
clients: 6000 95per-rtt: 1092ms min-rtt: 2ms median-rtt: 110ms max-rtt: 3073ms
|
164
|
-
clients: 7000 95per-rtt: 726ms min-rtt: 3ms median-rtt: 185ms max-rtt: 1116ms
|
165
|
-
clients: 8000 95per-rtt: 1078ms min-rtt: 2ms median-rtt: 174ms max-rtt: 3296ms
|
166
|
-
clients: 9000 95per-rtt: 1401ms min-rtt: 8ms median-rtt: 195ms max-rtt: 6838ms
|
167
|
-
clients: 10000 95per-rtt: 1157ms min-rtt: 3ms median-rtt: 282ms max-rtt: 3446ms
|
168
|
-
clients: 11000 95per-rtt: 1804ms min-rtt: 4ms median-rtt: 271ms max-rtt: 5640ms
|
169
|
-
clients: 12000 95per-rtt: 1339ms min-rtt: 2ms median-rtt: 344ms max-rtt: 2251ms
|
170
|
-
clients: 13000 95per-rtt: 1638ms min-rtt: 3ms median-rtt: 336ms max-rtt: 3341ms
|
171
|
-
clients: 14000 95per-rtt: 1811ms min-rtt: 3ms median-rtt: 339ms max-rtt: 2079ms
|
172
|
-
clients: 15000 95per-rtt: 1407ms min-rtt: 2ms median-rtt: 435ms max-rtt: 6666ms
|
173
|
-
clients: 16000 95per-rtt: 2796ms min-rtt: 2ms median-rtt: 398ms max-rtt: 4769ms
|
174
|
-
clients: 17000 95per-rtt: 2494ms min-rtt: 6ms median-rtt: 338ms max-rtt: 36085ms
|
175
|
-
clients: 18000 95per-rtt: 2844ms min-rtt: 2ms median-rtt: 374ms max-rtt: 7384ms
|
176
|
-
clients: 19000 95per-rtt: 4010ms min-rtt: 17ms median-rtt: 370ms max-rtt: 5504ms
|
177
|
-
clients: 20000 95per-rtt: 2819ms min-rtt: 2ms median-rtt: 470ms max-rtt: 8598ms
|
178
|
-
|
179
|
-
Missing received broadcasts: expected 23100000, got 23065521
|
180
|
-
```
|
181
|
-
|
182
|
-
# Idle Connections Benchmark
|
183
|
-
|
184
|
-
Connection 20k idle clients at 200 connections per second rate; measuring final memory usage.
|
185
|
-
|
186
|
-
Using [cable_bench](https://github.com/palkan/cable_bench).
|
187
|
-
|
188
|
-
**Action Cable (8 workers)**: ~1500 MB
|
189
|
-
|
190
|
-
**Anycable-Go 0.6.0-preview1**: ~700 MB
|
191
|
-
|
192
|
-
**Plezi (0.15.0) + Iodine (0.4.16)**: ~800 MB (a lot of connection timeout errors and "The connection was lost" errors).
|