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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +166 -2
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +19 -60
  5. data/bin/anycable +13 -0
  6. data/bin/anycabled +30 -0
  7. data/lib/anycable.rb +69 -18
  8. data/lib/anycable/broadcast_adapters.rb +33 -0
  9. data/lib/anycable/broadcast_adapters/redis.rb +42 -0
  10. data/lib/anycable/cli.rb +329 -0
  11. data/lib/anycable/config.rb +93 -17
  12. data/lib/anycable/exceptions_handling.rb +37 -0
  13. data/lib/anycable/health_server.rb +52 -31
  14. data/lib/anycable/middleware.rb +19 -0
  15. data/lib/anycable/middleware_chain.rb +58 -0
  16. data/lib/anycable/rpc/rpc_pb.rb +1 -1
  17. data/lib/anycable/rpc/rpc_services_pb.rb +1 -1
  18. data/lib/anycable/rpc_handler.rb +77 -32
  19. data/lib/anycable/server.rb +132 -39
  20. data/lib/anycable/socket.rb +1 -1
  21. data/lib/anycable/version.rb +2 -2
  22. metadata +34 -59
  23. data/.gitignore +0 -40
  24. data/.hound.yml +0 -3
  25. data/.rubocop.yml +0 -71
  26. data/.travis.yml +0 -13
  27. data/Gemfile +0 -8
  28. data/Makefile +0 -5
  29. data/PITCHME.md +0 -139
  30. data/PITCHME.yaml +0 -1
  31. data/Rakefile +0 -8
  32. data/anycable.gemspec +0 -32
  33. data/assets/Memory3.png +0 -0
  34. data/assets/Memory5.png +0 -0
  35. data/assets/RTT3.png +0 -0
  36. data/assets/RTT5.png +0 -0
  37. data/assets/Scheme1.png +0 -0
  38. data/assets/Scheme2.png +0 -0
  39. data/assets/cpu_chart.gif +0 -0
  40. data/assets/cpu_chart2.gif +0 -0
  41. data/assets/evlms.png +0 -0
  42. data/benchmarks/.gitignore +0 -1
  43. data/benchmarks/2017-02-12.md +0 -308
  44. data/benchmarks/2018-03-04.md +0 -192
  45. data/benchmarks/2018-05-27-rpc-bench.md +0 -57
  46. data/benchmarks/HowTo.md +0 -23
  47. data/benchmarks/ansible.cfg +0 -9
  48. data/benchmarks/benchmark.yml +0 -67
  49. data/benchmarks/hosts +0 -5
  50. data/benchmarks/servers.yml +0 -36
  51. data/circle.yml +0 -8
  52. data/etc/bug_report_template.rb +0 -76
  53. data/lib/anycable/handler/exceptions_handling.rb +0 -43
  54. data/lib/anycable/pubsub.rb +0 -26
  55. data/protos/rpc.proto +0 -55
@@ -1 +0,0 @@
1
- theme : moon
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
- require "rubocop/rake_task"
4
-
5
- RSpec::Core::RakeTask.new(:spec)
6
- RuboCop::RakeTask.new
7
-
8
- task default: [:rubocop, :spec]
@@ -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
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1 +0,0 @@
1
- *.retry
@@ -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
@@ -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).