The gossipsub simulator now has experimental support for episub -- see also the discussion in the specs repo.
The episub extension comes with two new control messages, CHOKE
and
UNCHOKE
. Choking a peer means instructing it to not directly
forward messages, except self-published through flood publish, even
though it remains in the mesh; instead the peer sends gossip.
Unchoking a peer means instructing it to resume forwarding messages.
The most interesting aspect of episub is how to decide on choking (and unchoking) a peer; we call this the choking strategy.
In these initial experiments, we test the following strategies for ranking peers:
order-avg
: peers are ordered by time of delivery of each message; the order average strategy uses the average delivery order.order-median
: like above, but the strategy uses the median delivery order.latency-avg
: peers are order by latency of delivery, relative to the first delivery of a message.latency-median
: like above, but uses the median.latency-p90
: like above, but uses the P90 statistic (90th percentile).
The episub choking/unchoking algorithm, as implemented in the simulator, works as follows:
- there is a warm up period (
choke-threshold
)where the node simply collects delivery samples; this is expressed as number of heartbeats. - after the warmp up period ends, the peer makes a decision with some frequency (
choke-frequency
), ie every some heartbeats. - when a peer makes a decision, it makes the following considerations:
- a peer is only considered if it has at least a minimum number of samples (
choke-min-samples
). - choking:
- only choke if there are more than
D-choke
unchoked peers in the mesh. That means, the effective mesh degree will never be less thanD-choke
. - order the peers per the strategy.
- select the last slowest unchoked mesh peer and choke it.
- only choke if there are more than
- unchoking:
- only unchoke a peer if it is faster than some unchoked peer.
- order the peers per the strategy
- select the fastest choked mesh peer that is faster than some unchoked peer and unchoke it.
- if there is no such peer, don't unchoke anyone.
- a peer is only considered if it has at least a minimum number of samples (
See the implementation in episub.ss.
- We run simulations using 100 nodes, with 5, 10, and 20 sources, and peer connectivity of 20 (i.e. each peer is connected randomly to 20 other peers).
- Network links have a (one-way) latency randomly selected between 10ms and 150ms, with 10% jitter.
- Messages are sent 1 per second, for 120s (2min) and 300s (5min).
- The overlay parameters are
D=6, D_lo=4, D_hi=12, D-gossip=6, gossip-factor=.25
. - The choking parameters
choke-threshold=30, choke-frequency=15, choke-min-samples=3
. - We also run the simulation with gossipsub/v1.0 and gossipsub/v1.1 as baselines.
The script used to produce the results is here
Note: I would also like to run bigger simulations (with maybe 1000 nodes), but unfortunately my computer is too slow for that and the simulation begins to lag horribly, even at 250 nodes. If you have a fast enough computer you can try running with more than 100 nodes (you can edit the script). The situation could also significantly improve if the gambit SMP backend was mature enough, but this is currently not the case.
Looking at the simulation outputs, we can make some observations:
- As expected, it takes a bit of time for episub choking to kick in; the mesh will need about 90s before it is fully choked, which becomes apparent in longer simulations.
- There is a significant reduction in bandwidth usage, as measured by
the number of data messages (
!!pubsub.message
). This is particularly pronounced in the longer simulations, showing that in production the bandwidth savings could be as big as 50% or more. - On the same time, the latency distribution is not particularly impacted, which means that the bandwidth savings exploit redundancy reduction and don't make delivery slower; this is a big win.
- All 5 choking strategies produce good results; there is a small edge
in message reduction for the
latency-avg
strategy, followed by thelatency-median
. This suggest that the strategy could be used as the default in production. - There is some unchoking happening, which increases as the number of sources increases. This suggests that there should be some logic to handle cases where a node is near or directly connected to busy sources, which could cause some choke fluttering, which is obviously undesirable. Alternatively, we could also identify messages directly originating from the peer and not unchoke on these samples.
>>> Running simulations with nodes: 100, sources: 5, messages: 60, rng-state: #(1909714116 2260268287 2794071008 2037845734 4107325908 299493725)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 60
sources: 5
publish: 60
deliver: 6000
!!pubsub.connect: 2000
!!gossipsub.graft: 372
!!pubsub.message: 37683
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!gossipsub.ihave: 37236
!!gossipsub.iwant: 272
=== delivery latency histogram ===
0-100ms 981 ****************
100-200ms 4341 ************************************************************************
200-300ms 618 **********
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 60
sources: 5
publish: 60
deliver: 6000
!!gossipsub.graft: 371
!!pubsub.connect: 2072
!!pubsub.message: 40453
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!gossipsub.ihave: 49618
!!gossipsub.iwant: 242
=== delivery latency histogram ===
0-100ms 3192 *****************************************************
100-200ms 2748 *********************************************
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 60
sources: 5
publish: 60
deliver: 6000
!!gossipsub.graft: 371
!!pubsub.connect: 2072
!!pubsub.message: 37306
!!episub.choke: 286
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 4
!!gossipsub.ihave: 53423
!!gossipsub.iwant: 277
=== delivery latency histogram ===
0-100ms 2798 **********************************************
100-200ms 3141 ****************************************************
200-300ms 1
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 60
sources: 5
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 37476
!!episub.choke: 287
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 6
!!gossipsub.ihave: 53362
!!gossipsub.iwant: 276
=== delivery latency histogram ===
0-100ms 3006 **************************************************
100-200ms 2933 ************************************************
200-300ms 1
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 60
sources: 5
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37393
!!episub.choke: 287
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 6
!!gossipsub.ihave: 53395
!!gossipsub.iwant: 291
=== delivery latency histogram ===
0-100ms 3090 ***************************************************
100-200ms 2850 ***********************************************
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 60
sources: 5
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37394
!!episub.choke: 287
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 5
!!gossipsub.ihave: 53351
!!gossipsub.iwant: 252
=== delivery latency histogram ===
0-100ms 3172 ****************************************************
100-200ms 2768 **********************************************
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 60
sources: 5
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37353
!!episub.choke: 287
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 8
!!gossipsub.ihave: 53336
!!gossipsub.iwant: 225
=== delivery latency histogram ===
0-100ms 3239 *****************************************************
100-200ms 2701 *********************************************
>>> Running simulations with nodes: 100, sources: 5, messages: 120, rng-state: #(2262035721 435381142 1227844784 3659733555 1992566586 45622844)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 120
sources: 5
publish: 120
deliver: 12000
!!pubsub.connect: 2000
!!gossipsub.graft: 371
!!pubsub.message: 74828
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!gossipsub.ihave: 73206
!!gossipsub.iwant: 285
=== delivery latency histogram ===
0-100ms 1776 **************
100-200ms 8620 ************************************************************************
200-300ms 1484 ************
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 120
sources: 5
publish: 120
deliver: 12000
!!gossipsub.graft: 371
!!pubsub.connect: 2072
!!pubsub.message: 80875
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!gossipsub.ihave: 97649
!!gossipsub.iwant: 567
=== delivery latency histogram ===
0-100ms 6080 ***************************************************
100-200ms 5798 ************************************************
200-300ms 2
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 120
sources: 5
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 59161
!!episub.choke: 421
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 16
!!gossipsub.ihave: 121285
!!gossipsub.iwant: 404
=== delivery latency histogram ===
0-100ms 6451 ******************************************************
100-200ms 5429 *********************************************
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 120
sources: 5
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 59465
!!episub.choke: 423
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 19
!!gossipsub.ihave: 121296
!!gossipsub.iwant: 519
=== delivery latency histogram ===
0-100ms 6385 *****************************************************
100-200ms 5491 **********************************************
200-300ms 4
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 120
sources: 5
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 59067
!!episub.choke: 430
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 26
!!gossipsub.ihave: 121310
!!gossipsub.iwant: 506
=== delivery latency histogram ===
0-100ms 6511 ******************************************************
100-200ms 5369 *********************************************
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 120
sources: 5
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 58922
!!episub.choke: 422
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 15
!!gossipsub.ihave: 121523
!!gossipsub.iwant: 426
=== delivery latency histogram ===
0-100ms 5642 ***********************************************
100-200ms 6230 ****************************************************
200-300ms 8
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 120
sources: 5
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 58977
!!episub.choke: 433
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 36
!!gossipsub.ihave: 121177
!!gossipsub.iwant: 348
=== delivery latency histogram ===
0-100ms 6467 ******************************************************
100-200ms 5397 *********************************************
200-300ms 16
>>> Running simulations with nodes: 100, sources: 5, messages: 300, rng-state: #(307535537 347369200 2483850757 2838693792 139022963 1818071111)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 300
sources: 5
publish: 300
deliver: 30000
!!pubsub.connect: 2000
!!gossipsub.graft: 372
!!pubsub.message: 187973
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!gossipsub.ihave: 181122
!!gossipsub.iwant: 896
=== delivery latency histogram ===
0-100ms 4842 ****************
100-200ms 21909 *************************************************************************
200-300ms 2949 *********
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 300
sources: 5
publish: 300
deliver: 30000
!!gossipsub.graft: 371
!!pubsub.connect: 2073
!!pubsub.message: 201390
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!gossipsub.ihave: 241136
!!gossipsub.iwant: 655
=== delivery latency histogram ===
0-100ms 15995 *****************************************************
100-200ms 13689 **********************************************
200-300ms 16
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 300
sources: 5
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 111236
!!episub.choke: 459
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 43
!!gossipsub.ihave: 339134
!!gossipsub.iwant: 529
=== delivery latency histogram ===
0-100ms 16279 ******************************************************
100-200ms 13413 *********************************************
200-300ms 8
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 300
sources: 5
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 112242
!!episub.choke: 472
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 54
!!gossipsub.ihave: 339146
!!gossipsub.iwant: 891
=== delivery latency histogram ===
0-100ms 13935 **********************************************
100-200ms 15693 ****************************************************
200-300ms 72
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 300
sources: 5
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 111382
!!episub.choke: 492
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 75
!!gossipsub.ihave: 339036
!!gossipsub.iwant: 1461
=== delivery latency histogram ===
0-100ms 16477 *******************************************************
100-200ms 13220 ********************************************
200-300ms 3
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 300
sources: 5
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 110387
!!episub.choke: 471
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 53
!!gossipsub.ihave: 339313
!!gossipsub.iwant: 957
=== delivery latency histogram ===
0-100ms 15985 *****************************************************
100-200ms 13691 **********************************************
200-300ms 24
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 300
sources: 5
publish: 300
deliver: 30000
!!gossipsub.graft: 371
!!pubsub.connect: 2073
!!pubsub.message: 110870
!!episub.choke: 528
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 124
!!gossipsub.ihave: 336687
!!gossipsub.iwant: 754
=== delivery latency histogram ===
0-100ms 16047 ******************************************************
100-200ms 13562 *********************************************
200-300ms 91
>>> Running simulations with nodes: 100, sources: 10, messages: 60, rng-state: #(3151218757 181760974 437719415 3593321411 1926763591 2368211987)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 60
sources: 10
publish: 60
deliver: 6000
!!pubsub.connect: 2000
!!gossipsub.graft: 374
!!pubsub.message: 37900
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!gossipsub.ihave: 37188
!!gossipsub.iwant: 230
=== delivery latency histogram ===
0-100ms 924 ***************
100-200ms 4394 *************************************************************************
200-300ms 622 **********
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 60
sources: 10
publish: 60
deliver: 6000
!!gossipsub.graft: 368
!!pubsub.connect: 2073
!!pubsub.message: 40153
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!gossipsub.ihave: 49598
!!gossipsub.iwant: 198
=== delivery latency histogram ===
0-100ms 2822 ***********************************************
100-200ms 3107 ***************************************************
200-300ms 11
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 60
sources: 10
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37385
!!episub.choke: 290
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 12
!!gossipsub.ihave: 53197
!!gossipsub.iwant: 173
=== delivery latency histogram ===
0-100ms 3404 ********************************************************
100-200ms 2536 ******************************************
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 60
sources: 10
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 37424
!!episub.choke: 291
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 15
!!gossipsub.ihave: 53261
!!gossipsub.iwant: 182
=== delivery latency histogram ===
0-100ms 3361 ********************************************************
100-200ms 2578 ******************************************
200-300ms 1
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 60
sources: 10
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37372
!!episub.choke: 289
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 10
!!gossipsub.ihave: 53187
!!gossipsub.iwant: 184
=== delivery latency histogram ===
0-100ms 3317 *******************************************************
100-200ms 2622 *******************************************
200-300ms 1
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 60
sources: 10
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37372
!!episub.choke: 289
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 11
!!gossipsub.ihave: 53228
!!gossipsub.iwant: 174
=== delivery latency histogram ===
0-100ms 3199 *****************************************************
100-200ms 2741 *********************************************
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 60
sources: 10
publish: 60
deliver: 6000
!!gossipsub.graft: 371
!!pubsub.connect: 2073
!!pubsub.message: 37312
!!episub.choke: 289
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 12
!!gossipsub.ihave: 53235
!!gossipsub.iwant: 209
=== delivery latency histogram ===
0-100ms 3096 ***************************************************
100-200ms 2843 ***********************************************
200-300ms 1
>>> Running simulations with nodes: 100, sources: 10, messages: 120, rng-state: #(3025431964 8168486 3827161923 373689506 1198475513 2481900662)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 120
sources: 10
publish: 120
deliver: 12000
!!pubsub.connect: 2000
!!gossipsub.graft: 371
!!pubsub.message: 75076
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!gossipsub.ihave: 73176
!!gossipsub.iwant: 464
=== delivery latency histogram ===
0-100ms 1850 ***************
100-200ms 8768 *************************************************************************
200-300ms 1262 **********
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 120
sources: 10
publish: 120
deliver: 12000
!!gossipsub.graft: 371
!!pubsub.connect: 2072
!!pubsub.message: 81019
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!gossipsub.ihave: 97686
!!gossipsub.iwant: 401
=== delivery latency histogram ===
0-100ms 6618 *******************************************************
100-200ms 5261 ********************************************
200-300ms 1
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 120
sources: 10
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 60308
!!episub.choke: 451
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 59
!!gossipsub.ihave: 120516
!!gossipsub.iwant: 535
=== delivery latency histogram ===
0-100ms 6720 ********************************************************
100-200ms 5158 *******************************************
200-300ms 2
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 120
sources: 10
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 60216
!!episub.choke: 450
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 52
!!gossipsub.ihave: 120617
!!gossipsub.iwant: 490
=== delivery latency histogram ===
0-100ms 6461 ******************************************************
100-200ms 5414 *********************************************
200-300ms 5
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 120
sources: 10
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 59724
!!episub.choke: 438
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 45
!!gossipsub.ihave: 120925
!!gossipsub.iwant: 540
=== delivery latency histogram ===
0-100ms 6256 ****************************************************
100-200ms 5621 ***********************************************
200-300ms 3
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 120
sources: 10
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 60004
!!episub.choke: 449
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 59
!!gossipsub.ihave: 120505
!!gossipsub.iwant: 439
=== delivery latency histogram ===
0-100ms 6646 *******************************************************
100-200ms 5232 *******************************************
200-300ms 2
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 120
sources: 10
publish: 120
deliver: 12000
!!gossipsub.graft: 371
!!pubsub.connect: 2072
!!pubsub.message: 59454
!!episub.choke: 439
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 48
!!gossipsub.ihave: 120715
!!gossipsub.iwant: 398
=== delivery latency histogram ===
0-100ms 6564 *******************************************************
100-200ms 5308 ********************************************
200-300ms 8
>>> Running simulations with nodes: 100, sources: 10, messages: 300, rng-state: #(1054113798 359887107 4160489176 522646022 639371617 3465482128)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 300
sources: 10
publish: 300
deliver: 30000
!!pubsub.connect: 2000
!!gossipsub.graft: 372
!!pubsub.message: 187555
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!gossipsub.ihave: 181146
!!gossipsub.iwant: 552
=== delivery latency histogram ===
0-100ms 4262 **************
100-200ms 21357 ***********************************************************************
200-300ms 4081 *************
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 300
sources: 10
publish: 300
deliver: 30000
!!gossipsub.graft: 371
!!pubsub.connect: 2072
!!pubsub.message: 202400
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!gossipsub.ihave: 240978
!!gossipsub.iwant: 833
=== delivery latency histogram ===
0-100ms 15628 ****************************************************
100-200ms 14061 ***********************************************
200-300ms 11
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 300
sources: 10
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 114581
!!episub.choke: 564
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 157
!!gossipsub.ihave: 336511
!!gossipsub.iwant: 1210
=== delivery latency histogram ===
0-100ms 16132 ******************************************************
100-200ms 13496 *********************************************
200-300ms 72
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 300
sources: 10
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 114510
!!episub.choke: 552
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 139
!!gossipsub.ihave: 337571
!!gossipsub.iwant: 802
=== delivery latency histogram ===
0-100ms 16295 ******************************************************
100-200ms 13382 *********************************************
200-300ms 23
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 300
sources: 10
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 112808
!!episub.choke: 562
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 158
!!gossipsub.ihave: 337002
!!gossipsub.iwant: 990
=== delivery latency histogram ===
0-100ms 16774 ********************************************************
100-200ms 12916 *******************************************
200-300ms 10
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 300
sources: 10
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 112938
!!episub.choke: 567
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 154
!!gossipsub.ihave: 337274
!!gossipsub.iwant: 1099
=== delivery latency histogram ===
0-100ms 16347 *******************************************************
100-200ms 13323 ********************************************
200-300ms 30
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 300
sources: 10
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 113134
!!episub.choke: 587
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 182
!!gossipsub.ihave: 336298
!!gossipsub.iwant: 1580
=== delivery latency histogram ===
0-100ms 16027 *****************************************************
100-200ms 13626 *********************************************
200-300ms 47
>>> Running simulations with nodes: 100, sources: 20, messages: 60, rng-state: #(3058947743 2056481636 2600557948 3263983127 1134616589 4050555119)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 60
sources: 20
publish: 60
deliver: 6000
!!pubsub.connect: 2000
!!gossipsub.graft: 372
!!pubsub.message: 37716
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!gossipsub.ihave: 37260
!!gossipsub.iwant: 286
=== delivery latency histogram ===
0-100ms 822 *************
100-200ms 4478 **************************************************************************
200-300ms 640 **********
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 60
sources: 20
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 40654
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!gossipsub.ihave: 49644
!!gossipsub.iwant: 204
=== delivery latency histogram ===
0-100ms 3070 ***************************************************
100-200ms 2870 ***********************************************
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 60
sources: 20
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37477
!!episub.choke: 289
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 16
!!gossipsub.ihave: 53416
!!gossipsub.iwant: 180
=== delivery latency histogram ===
0-100ms 3106 ***************************************************
100-200ms 2833 ***********************************************
200-300ms 1
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 60
sources: 20
publish: 60
deliver: 6000
!!gossipsub.graft: 370
!!pubsub.connect: 2073
!!pubsub.message: 37249
!!episub.choke: 284
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 15
!!gossipsub.ihave: 53357
!!gossipsub.iwant: 158
=== delivery latency histogram ===
0-100ms 2395 ***************************************
100-200ms 3518 **********************************************************
200-300ms 27
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 60
sources: 20
publish: 60
deliver: 6000
!!gossipsub.graft: 371
!!pubsub.connect: 2072
!!pubsub.message: 37390
!!episub.choke: 288
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 11
!!gossipsub.ihave: 53415
!!gossipsub.iwant: 225
=== delivery latency histogram ===
0-100ms 2981 *************************************************
100-200ms 2959 *************************************************
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 60
sources: 20
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37555
!!episub.choke: 288
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 13
!!gossipsub.ihave: 53327
!!gossipsub.iwant: 239
=== delivery latency histogram ===
0-100ms 3072 ***************************************************
100-200ms 2867 ***********************************************
200-300ms 1
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 60
sources: 20
publish: 60
deliver: 6000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 37514
!!episub.choke: 287
!!pubsub.publish: 60
!!gossipsub.prune: 7
!!episub.unchoke: 15
!!gossipsub.ihave: 53333
!!gossipsub.iwant: 231
=== delivery latency histogram ===
0-100ms 3035 **************************************************
100-200ms 2905 ************************************************
>>> Running simulations with nodes: 100, sources: 20, messages: 120, rng-state: #(961840466 2083455974 2427635254 3399819608 3806951367 2451328898)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 120
sources: 20
publish: 120
deliver: 12000
!!pubsub.connect: 2000
!!gossipsub.graft: 372
!!pubsub.message: 75266
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!gossipsub.ihave: 73230
!!gossipsub.iwant: 439
=== delivery latency histogram ===
0-100ms 1668 **************
100-200ms 8850 **************************************************************************
200-300ms 1362 ***********
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 120
sources: 20
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2073
!!pubsub.message: 81295
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!gossipsub.ihave: 97764
!!gossipsub.iwant: 389
=== delivery latency histogram ===
0-100ms 5715 ************************************************
100-200ms 6160 ***************************************************
200-300ms 5
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 120
sources: 20
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 60192
!!episub.choke: 459
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 64
!!gossipsub.ihave: 120882
!!gossipsub.iwant: 358
=== delivery latency histogram ===
0-100ms 6436 ******************************************************
100-200ms 5433 *********************************************
200-300ms 11
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 120
sources: 20
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 60441
!!episub.choke: 457
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 60
!!gossipsub.ihave: 120891
!!gossipsub.iwant: 538
=== delivery latency histogram ===
0-100ms 6367 *****************************************************
100-200ms 5509 **********************************************
200-300ms 4
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 120
sources: 20
publish: 120
deliver: 12000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 59963
!!episub.choke: 452
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 59
!!gossipsub.ihave: 120768
!!gossipsub.iwant: 384
=== delivery latency histogram ===
0-100ms 6394 *****************************************************
100-200ms 5479 **********************************************
200-300ms 7
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 120
sources: 20
publish: 120
deliver: 12000
!!gossipsub.graft: 371
!!pubsub.connect: 2072
!!pubsub.message: 60072
!!episub.choke: 455
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 63
!!gossipsub.ihave: 120501
!!gossipsub.iwant: 509
=== delivery latency histogram ===
0-100ms 6177 ***************************************************
100-200ms 5691 ***********************************************
200-300ms 12
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 120
sources: 20
publish: 120
deliver: 12000
!!gossipsub.graft: 367
!!pubsub.connect: 2073
!!pubsub.message: 58652
!!episub.choke: 440
!!pubsub.publish: 120
!!gossipsub.prune: 7
!!episub.unchoke: 51
!!gossipsub.ihave: 120933
!!gossipsub.iwant: 212
=== delivery latency histogram ===
0-100ms 5005 ******************************************
100-200ms 6809 *********************************************************
200-300ms 66
>>> Running simulations with nodes: 100, sources: 20, messages: 300, rng-state: #(1934882194 1655701175 3356742171 3178576292 3674537792 501434862)
+++ gossipsub/v1.0
=== simulation summary ===
nodes: 100
messages: 300
sources: 20
publish: 300
deliver: 30000
!!pubsub.connect: 2000
!!gossipsub.graft: 372
!!pubsub.message: 187663
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!gossipsub.ihave: 181152
!!gossipsub.iwant: 662
=== delivery latency histogram ===
0-100ms 4180 **************
100-200ms 22146 **************************************************************************
200-300ms 3374 ***********
+++ gossipsub/v1.1
=== simulation summary ===
nodes: 100
messages: 300
sources: 20
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 203060
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!gossipsub.ihave: 241305
!!gossipsub.iwant: 816
=== delivery latency histogram ===
0-100ms 15780 *****************************************************
100-200ms 13915 **********************************************
200-300ms 5
+++ episub/order-avg
=== simulation summary ===
nodes: 100
messages: 300
sources: 20
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 114331
!!episub.choke: 598
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 188
!!gossipsub.ihave: 336849
!!gossipsub.iwant: 865
=== delivery latency histogram ===
0-100ms 16045 ******************************************************
100-200ms 13623 *********************************************
200-300ms 32
+++ episub/order-median
=== simulation summary ===
nodes: 100
messages: 300
sources: 20
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 114525
!!episub.choke: 593
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 182
!!gossipsub.ihave: 337313
!!gossipsub.iwant: 887
=== delivery latency histogram ===
0-100ms 15003 **************************************************
100-200ms 14651 *************************************************
200-300ms 46
+++ episub/latency-avg
=== simulation summary ===
nodes: 100
messages: 300
sources: 20
publish: 300
deliver: 30000
!!gossipsub.graft: 367
!!pubsub.connect: 2073
!!pubsub.message: 112615
!!episub.choke: 592
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 195
!!gossipsub.ihave: 334888
!!gossipsub.iwant: 966
=== delivery latency histogram ===
0-100ms 14676 *************************************************
100-200ms 14949 **************************************************
200-300ms 75
+++ episub/latency-median
=== simulation summary ===
nodes: 100
messages: 300
sources: 20
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 113570
!!episub.choke: 614
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 202
!!gossipsub.ihave: 336267
!!gossipsub.iwant: 624
=== delivery latency histogram ===
0-100ms 15821 *****************************************************
100-200ms 13829 **********************************************
200-300ms 50
+++ episub/latency-p90
=== simulation summary ===
nodes: 100
messages: 300
sources: 20
publish: 300
deliver: 30000
!!gossipsub.graft: 372
!!pubsub.connect: 2072
!!pubsub.message: 114126
!!episub.choke: 630
!!pubsub.publish: 300
!!gossipsub.prune: 7
!!episub.unchoke: 226
!!gossipsub.ihave: 335615
!!gossipsub.iwant: 1044
=== delivery latency histogram ===
0-100ms 15943 *****************************************************
100-200ms 13731 **********************************************
200-300ms 26