2023-10-06 17:18:22 +02:00
## rln-delay-simulations
2023-10-11 12:07:05 +02:00
This folder contains a `shadow` configuration to simulate `1000` `nwaku` nodes in an end to end setup:
* `nwaku` binaries are used, built with `make wakunode2`
* Minor changes in `nwaku` are required, to timestamp messages and connect the peers without discovery. See [simulations ](https://github.com/waku-org/nwaku/tree/simulations ) branch.
* `rln` is used with hardcoded memberships, to avoid the sepolia node + contract, [see ](https://raw.githubusercontent.com/waku-org/nwaku/master/waku/waku_rln_relay/constants.nim ).
* Focused on measuring message propagation delays. Each message that is sent, encodes the timestamp when it was created.
* Same setup can be reused with different parameters, configured either via flags (see `shadow.yaml` ) or modifying the code (see [simulations ](https://github.com/waku-org/nwaku/tree/simulations )).
2023-10-11 13:04:40 +02:00
* Requires significant resources to run (tested with 256 GB RAM)
* Uses `100ms` of latency and `10Mbit` connection per node.
2023-10-06 17:18:22 +02:00
2023-10-11 12:07:05 +02:00
## How to run
2023-10-06 17:18:22 +02:00
Get `nwaku` code with the modifications and compile it. See diff of latest commit.
2023-10-11 12:07:05 +02:00
Get the [simulations ](https://github.com/waku-org/nwaku/tree/simulations ) branch, build it and start the [shadow ](https://github.com/shadow/shadow ) simulation. Ensure `path` points to the `wakunode2` binary and you have enough resources.
2023-10-06 17:18:22 +02:00
```
2023-10-11 12:07:05 +02:00
git clone https://github.com/waku-org/nwaku.git
2023-10-06 17:18:22 +02:00
cd nwaku
git checkout simulations
make wakunode2
2023-10-11 12:07:05 +02:00
shadow shadow.yaml
2023-10-06 17:18:22 +02:00
```
2023-10-11 12:07:05 +02:00
## How to analyze
2023-10-06 17:18:22 +02:00
2023-10-11 12:07:05 +02:00
First check that the simulation finished ok. Check that the numbers match.
2023-10-06 17:18:22 +02:00
```
2023-10-11 12:07:05 +02:00
grep -nr 'ended_simulation' shadow.data | wc -l
# expected: 1000 (simulation finished ok in all nodes)
2023-10-11 13:04:40 +02:00
grep -nr 'tx_msg' shadow.data | wc -l
2023-10-11 12:07:05 +02:00
# expected: 15 (total of published messages)
2023-10-06 17:18:22 +02:00
```
2023-10-11 13:04:40 +02:00
Print metrics:
```
grep -nr 'rx_msg' shadow.data > latency.txt
grep -nr 'mesh_size' shadow.data > mesh_size.txt
```
2023-10-11 12:07:05 +02:00
2023-10-11 13:04:40 +02:00
```
python analyze.py latency.txt "arrival_diff="
python analyze.py mesh_size.txt "mesh_size="
no msg payload is added
Config: file: latency.txt field: arrival_diff=
number_samples=14985
Percentiles. P75=401.0 P95=502.0
Statistics. mode_value=400 mode_count=1521 mean=320.76176176176176 max=701 min=100
this is wrong. was generating the random bytes inside the timer.
Config: file: latency.txt field: arrival_diff=
number_samples=14985
Percentiles. P75=456.0 P95=583.7999999999993
Statistics. mode_value=412 mode_count=84 mean=365.7955288621955 max=873 min=100
run 1
Config: file: latency.txt field: arrival_diff=
number_samples=14985
Percentiles. P75=451.0 P95=578.0
Statistics. mode_value=318 mode_count=84 mean=362.09422756089424 max=778 min=100
Config: file: latency.txt field: arrival_diff=
number_samples=14985
Percentiles. P75=452.0 P95=587.0
Statistics. mode_value=313 mode_count=77 mean=360.5741741741742 max=868 min=100
2023-10-11 13:22:14 +02:00
10 Mb data
Config: file: latency.txt field: arrival_diff=
number_samples=14985
Percentiles. P75=741.0 P95=901.0
Statistics. mode_value=596 mode_count=108 mean=615.3937937937937 max=1227 min=107
2023-10-10 12:25:21 +02:00
2023-10-11 13:04:40 +02:00
```
2023-10-10 12:25:21 +02:00
2023-10-11 12:07:05 +02:00
2023-10-11 13:04:40 +02:00
# TODO: remove
2023-10-11 12:07:05 +02:00
Amount of samples: 14985
percentile 75: 300.0
percentile 25: 201.0
mode : ModeResult(mode=300, count=4650)
worst: 401
best: 100
file: latency.txt
parse start: diff: parse end: milliseconds
[301 400 400 ... 300 502 601]
Amount of samples: 14985
percentile 75: 402.0
percentile 25: 202.0
mode : ModeResult(mode=400, count=1542)
worst: 1300
best: 100
```
mesh
```
grep -nr 'mesh size' shadow.data > mesh.txt
python metrics.py mesh.txt "mesh size: " " of topic"
Amount of samples: 1000
percentile 75: 7.0
percentile 25: 5.0
mode : ModeResult(mode=5, count=248)
worst: 12
best: 4
Amount of samples: 1000
percentile 75: 3.0
percentile 25: 2.0
mode : ModeResult(mode=2, count=469)
worst: 5
best: 2
```
```
Amount of samples: 14985
percentile 75: 300.0
percentile 25: 201.0
mode : ModeResult(mode=300, count=4650)
worst: 401
best: 100
2023-10-06 17:18:22 +02:00
```