Ubuntu で web3 サービスのホスティングで帯域制御したいメモ

## 背景

arweave や Flux など, web3 なサービスを手元(ローカル)で動かしたい(つよつよ CPU, GPU, SSD が必要)
Solana validator https://qiita.com/syoyo/items/7f2ab6167c0d4311fcba とかも広範囲には web3 と言えるかも!? :thinking: 

ただ帯域制限なくやると, 手元でのインターネット接続が遅くなる(or ほぼつながらなくなる)ため, 帯域制御したい.

ルーターや, proxy(VPS)経由で nginx などで制御するのも手かもであるが, もうちょっとぱぱっと楽にやりたい.


## tc(traffic control)を使う?

https://qiita.com/shirok/items/f57e0ecd86abec33a087

https://labs.gree.jp/blog/2014/10/11288/

https://blog.bitmeister.jp/?p=3930


ありがとうございます.

ただ, inbound も制御するには `ifb` を経由する必要があります

## inbound も対応したい

https://gist.github.com/ole1986/d9d6be5218affd41796610a35e3b069c

https://www.uramiraikan.net/Works/entry-1988.html

ありがとうございます.

Ubuntu 20.04 を想定します.

ネットをあさると patch いれてカーネルビルドが必要... 

https://ubuntuforums.org/showthread.php?t=1490568

みないなのがありますが, Ubuntu も最近(18.04 くらい?) は `ifb` は module でデフォルトで入っていますので特にセットアップは不要でした.
(`/boot/config-***` で kernel が `CONFIG_IFB=m` でビルドされているのを確認してみましょう)


## 効果測定

↑のリンクにある帯域制限スクリプトで 50Mb/s に制限してみました.

speedtest (apt で入る)使ってみました.

iftop で見てみるのが楽でいいかも!

https://superuser.com/questions/440722/how-to-see-each-connection-use-of-bandwidth

![Screenshot from 2022-07-27 18-55-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/17718502-9acb-7a52-b286-f27db2bf41eb.png)


```
$ speedtest                                                                                                         │································
Retrieving speedtest.net configuration...                                                                                                  │································
Testing from NTT (153.246.208.245)...                                                                                                      │································
Retrieving speedtest.net server list...                                                                                                    │································
Selecting best server based on ping...                                                                                                     │································
Hosted by Rakuten Mobile, Inc (Tokyo) [1.80 km]: 8.989 ms                                                                                  │································
Testing download speed................................................................................                                     │································
Download: 47.52 Mbit/s                                                                                                                     │································
Testing upload speed......................................................................................................                 │································
Upload: 94.16 Mbit/s
```

Download は制御できたようですが Upload は限界突破していました... :sweat_smile: (帯域制御できていないのか, もしくはロスセス圧縮して見かけの速度がアップしているのか...)


## その他

tcplim がありました. こちらは iptables 設定以外はユーザースペースのようですので柔軟性があるかも!

https://github.com/vi/tcplim

あとはプロセスをコンテナ実行して, コンテナランタイム側で帯域制限する手もあるかも!
(セキュリティ的にもそちらが理想かも(GPU とか SSD 使う場合はオーバヘッドの少ないコンテナサービス使うのがよさそう(Docker は Disk IO がボトルネックのままだったりするかしらん?))

## TODO

* [ ] ポート単位で制御する
* [ ] 探せば golang とかで書かれた完全ユーザースペースで動くのもあるかも!