---
# System prepended metadata

title: Go ran-routing performance

---

# Go ran-routing performance


## Методика


Отдельный клиент `loadsink.py` подключается к upstream по WebSocket, и ждёт трафик. 
С другой стороны запускается генератор `loadgen.py`, который формирует аплинки, эмулируя гейтвей, и пишет их в redis.

В каждый аплинк (в lora frm-payload) передаётся timestamp момента, когда мы создали этот аплинк (непосредственно перед отправкой). 

Клиент получает uplink, решает mic-challenge и извлекает frm-payload. 
Значение timestamp из frm-payload учитывается как начало отсчёта, а момент получения этого самого сообщения из ran-routing учитывается как конец отсчёта для одного аплинка.

Весь трафик передаётся через 1 WS-подключение, в БД только 1 клиент и 1 устройство.


### Окружение
- go version go1.20.3 linux/amd64
- Docker
    - Docker version 23.0.4, build f480fb1e37
    - Docker Compose version 2.17.3
- Dependencies (all default config)
    - (redis:7.0.11-alpine) Redis version=7.0.11
    - (postgres:15.2-alpine) PostgreSQL 15.2 on x86_64-pc-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, 64-bit
- Hardware: i9-13900K / 32597140 kB memory


## Результаты

### Sequentual upstream

Generating 100000 sequential uplinks without delay

```
$ python loadgen.py flat -n 100000
Generating 100000 sequential uplinks:
Firing test!
Completed: [================================================================================] 100%
Done!

$ python loadsink.py -p 10000
Using pool size: 10000
Connecting to: 'ws://0.0.0.0:8080/'...
Connected, waiting for load...
Test end marker received. Terminating test!...
Waiting tasks to finish...
Test finished!

Summary:
	RPS (tottime): 8018.38781
	Total req:     100000    
	Total time:    12.47133   secs

	Total bytes:   9.2MiB
	Average bytes: 96.26615B
	Throughput:    753.8KiB

	Slowest:       0.19318    secs
	Fastest:       0.00013    secs
	Average:       0.00792    secs

Response time histogram:
	0.00013 [1]	|
	0.01943 [92952]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.03874 [752]	|
	0.05804 [720]	|
	0.07735 [824]	|
	0.09665 [740]	|
	0.11596 [696]	|
	0.13527 [900]	|
	0.15457 [785]	|
	0.17388 [793]	|
	0.19318 [837]	|

Latency distribution:
	10% in 0.00014 secs
	25% in 0.00014 secs
	50% in 0.00016 secs
	75% in 0.00022 secs
	90% in 0.00099 secs
	95% in 0.07231 secs
	99% in 0.16873 secs
```

Generating 100000 sequential uplinks without delay. Trust reduction disabled, ack's on client disabled.

```
$ python loadgen.py flat -n 100000
Generating 100000 sequential uplinks:
Firing test!
Completed: [================================================================================] 100%
Done!

$ python loadsink.py --no-ack -p 10000
[WARN] Ack's will be not sent (--no-ack flag)
Using pool size: 10000
Connecting to: 'ws://0.0.0.0:8080/'...
Connected, waiting for load...
Test end marker received. Terminating test!...
Waiting tasks to finish...
Test finished!

Summary:
	RPS (tottime): 8130.53222
	Total req:     100000    
	Total time:    12.29932   secs

	Total bytes:   9.2MiB
	Average bytes: 96.0B
	Throughput:    762.2KiB

	Slowest:       0.00956    secs
	Fastest:       0.00012    secs
	Average:       0.00022    secs

Response time histogram:
	0.00012 [1]	|
	0.00107 [97524]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.00201 [800]	|
	0.00295 [568]	|
	0.00390 [404]	|
	0.00484 [265]	|
	0.00578 [181]	|
	0.00673 [151]	|
	0.00767 [37]	|
	0.00861 [43]	|
	0.00956 [26]	|

Latency distribution:
	10% in 0.00013 secs
	25% in 0.00013 secs
	50% in 0.00014 secs
	75% in 0.00014 secs
	90% in 0.00016 secs
	95% in 0.00025 secs
	99% in 0.00318 secs

```


### Batched upstream


**NB:** В случае с батчами разброс latency скорее всего связан с особенностью измерения (фактически, моментом отправки считается момент создания upstream-сообщения, а не момент реального добавления в redis)

Generating 100000 requests in 10 batches of 10000 uplinks each with 1.0s delays between batches.


```
$ python loadgen.py batch -b 10 -n 10000 -d 1.0
Generating 100000 requests in 10 batches of 10000 uplinks each with 1.0s delays between batches.
Firing test!
Completed: [================================================================================] 100%
Done!

$ python loadsink.py -p 10000
Using pool size: 10000
Connecting to: 'ws://0.0.0.0:8080/'...
Connected, waiting for load...
Test end marker received. Terminating test!...
Waiting tasks to finish...
Test finished!

Summary:
	RPS (tottime): 4093.40009
	Total req:     100000    
	Total time:    24.42957   secs

	Total bytes:   9.2MiB
	Average bytes: 96.44342B
	Throughput:    385.5KiB

	Slowest:       0.84257    secs
	Fastest:       0.23974    secs
	Average:       0.40602    secs

Response time histogram:
	0.23974 [1]	|
	0.30002 [17609]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.36030 [18631]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.42059 [20413]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.48087 [21856]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.54115 [16662]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.60144 [378]	|■
	0.66172 [972]	|■■
	0.72200 [1278]	|■■
	0.78228 [913]	|■■
	0.84257 [1287]	|■■

Latency distribution:
	10% in 0.27552 secs
	25% in 0.32312 secs
	50% in 0.40132 secs
	75% in 0.47123 secs
	90% in 0.50981 secs
	95% in 0.52837 secs
	99% in 0.79577 secs
```


Generating 100000 requests in 10 batches of 10000 uplinks each with 1.0s delays between batches. Trust reduction disabled, ack's on client disabled.


```
$ python loadgen.py batch -b 10 -n 10000 -d 1.0
Generating 100000 requests in 10 batches of 10000 uplinks each with 1.0s delays between batches.
Firing test!
Completed: [================================================================================] 100%
Done!

$ python loadsink.py --no-ack -p 10000
[WARN] Ack's will be not sent (--no-ack flag)
Using pool size: 10000
Connecting to: 'ws://0.0.0.0:8080/'...
Connected, waiting for load...
Test end marker received. Terminating test!...
Waiting tasks to finish...
Test finished!

Summary:
	RPS (tottime): 4125.52145
	Total req:     100000    
	Total time:    24.23936   secs

	Total bytes:   9.2MiB
	Average bytes: 96.0B
	Throughput:    386.8KiB

	Slowest:       0.47821    secs
	Fastest:       0.23134    secs
	Average:       0.35739    secs

Response time histogram:
	0.23134 [1]	|
	0.25602 [9038]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.28071 [9965]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.30540 [9727]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.33009 [9183]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.35477 [9225]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.37946 [10159]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.40415 [11406]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.42883 [10970]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.45352 [12188]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
	0.47821 [8138]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■

Latency distribution:
	10% in 0.25833 secs
	25% in 0.29652 secs
	50% in 0.36122 secs
	75% in 0.41985 secs
	90% in 0.45003 secs
	95% in 0.45922 secs
	99% in 0.46755 secs
