tcコマンドでNetworkの帯域と遅延を制御してみてみた

# ■ 目的
tcコマンド(Traffic Control)は、Networkの遅延(Latency)と帯域(Throughput)を制御することができます。
コンピューターの距離により遅延、帯域が変わり、データ転送などの時間がかわることがあります。コンピューターを遠隔に離した場合、既存の処理に影響が出るかtcコマンドを使用して事前に検証することができます。
ということで、tcコマンドで、遅延、帯域が制御できるか確認してみてみます。



# ■ 構成
<img width="710" alt="構成-non.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/35091503-906f-776a-4acc-8ab8809ffeb1.png">
Oracle Cloud上にComputeインスタンスを２台設置して、その間のNetworkパフォーマンスをTCコマンドで制御してみてみます


# ■ 現環境確認
Client --> Server へのレイテンシ、スループット、TPSを確認

## ● 遅延(RTT)確認
pingを実行してRTT確認
今回は、平均0.166msであることを確認

```shell
[opc@client-inst01 ~]$ sudo ping 10.0.0.2 -c 5
	PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
	64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.178 ms
	64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.182 ms
	64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.135 ms
	64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.177 ms
	64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=0.160 ms

	--- 10.0.0.2 ping statistics ---
	5 packets transmitted, 5 received, 0% packet loss, time 4110ms
	rtt min/avg/max/mdev = 0.135/0.166/0.182/0.020 ms
```


## ● 帯域確認
iperf3を実行してスループット確認
今回は、約2 Gbits/secであることを確認

```shell
[opc@client-inst01 ~]$ sudo iperf3 -c 10.0.0.2
	Connecting to host 10.0.0.2, port 5201
	[  4] local 10.0.0.5 port 33750 connected to 10.0.0.2 port 5201
	[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
	[  4]   0.00-1.00   sec   377 MBytes  3.17 Gbits/sec  1165   2.06 MBytes
	[  4]   1.00-2.00   sec   254 MBytes  2.13 Gbits/sec  2338    323 KBytes
	[  4]   2.00-3.00   sec   231 MBytes  1.94 Gbits/sec  1480   1.31 MBytes
	[  4]   3.00-4.00   sec   244 MBytes  2.04 Gbits/sec  2127   61.2 KBytes
	[  4]   4.00-5.00   sec   229 MBytes  1.92 Gbits/sec  953    166 KBytes
	[  4]   5.00-6.00   sec   239 MBytes  2.00 Gbits/sec  2055    629 KBytes
	[  4]   6.00-7.00   sec   205 MBytes  1.72 Gbits/sec  1336   1.77 MBytes
	[  4]   7.00-8.00   sec   274 MBytes  2.30 Gbits/sec  2216   96.1 KBytes
	[  4]   8.00-9.00   sec   238 MBytes  1.99 Gbits/sec  1198    891 KBytes
	[  4]   9.00-10.00  sec   232 MBytes  1.95 Gbits/sec  1486    638 KBytes
	- - - - - - - - - - - - - - - - - - - - - - - - -
	[ ID] Interval           Transfer     Bandwidth       Retr
	[  4]   0.00-10.00  sec  2.46 GBytes  2.12 Gbits/sec  16354             sender
	[  4]   0.00-10.00  sec  2.46 GBytes  2.11 Gbits/sec                  receiver

	iperf Done.
```



# ■ tcコマンドで遅延と帯域制御
Client側からパケットを送信するので、clientコンピューターで遅延と帯域を制御してみてみます


### ① 設定するNetwork Interface確認
ClientでServerへ接続するNetwork Interfece名確認
今回 Interface名はens3であることを確認

```shell
[root@client-inst01 ~]# ifconfig
	ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
			inet 10.0.0.5  netmask 255.255.255.0  broadcast 10.0.0.255
			ether 02:00:23:17:3a  txqueuelen 1000  (Ethernet)
			RX packets 454466  bytes 165785003 (158.1 MiB)
			RX errors 0  dropped 0  overruns 0  frame 0
			TX packets 503382  bytes 277089862 (264.2 MiB)
			TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```


### ② 100ms 遅延制御 tcコマンド実行
今回、100msへ制御してみてみます
100msは、だいたい日本から米国程度の距離です

```shell
[opc@client-inst01 ~]$ sudo tc qdisc add dev ens3 root handle 1:0 netem delay 100ms
```


### ③ 50Mbps 帯域制御 tcコマンド実行
今回、50Mbpsへ制御してみてみます
その時、以下値を使用してみます

	・rate = 50mbit
	・CONFIG_HZ = 1000
	・burst = rate/CONFIG_HZ = 50kb
	・limit = burst x 10 = 500kb

※CONFIG_HZ値確認

```shell
[opc@client-inst01 ~]$ sudo cat /boot/config-`uname -r` | grep CONFIG_HZ=
	CONFIG_HZ=1000
```

・50Mbps 帯域制御 tcコマンド実行

```shell
[opc@client-inst01 ~]$ sudo tc qdisc add dev ens3 parent 1:1 handle 10:0 tbf rate 50mbit burst 50kb limit 500kb
```


### ④ tcコマンド設定確認

```shell
[opc@client-inst01 ~]$ sudo tc -s qdisc show dev ens3
	qdisc netem 1: root refcnt 17 limit 1000 delay 100.0ms
	Sent 288635914 bytes 38521 pkt (dropped 0, overlimits 0 requeues 14)
	backlog 102b 1p requeues 14
	qdisc tbf 10: parent 1:1 rate 50Mbit burst 25Kb lat 36.9ms
	Sent 35582 bytes 73 pkt (dropped 0, overlimits 0 requeues 0)
	backlog 0b 0p requeues 0
```


### ⑤ 遅延(RTT)確認
pingを実行してRTT(遅延)確認
平均100 msへ制御できていることを確認

```shell
[opc@client-inst01 ~]$ ping 10.0.0.2 -c 5
	PING 10.0.0.101 (10.0.0.101) 56(84) bytes of data.
	64 bytes from 10.0.0.101: icmp_seq=1 ttl=64 time=100 ms
	64 bytes from 10.0.0.101: icmp_seq=2 ttl=64 time=100 ms
	64 bytes from 10.0.0.101: icmp_seq=3 ttl=64 time=100 ms
	64 bytes from 10.0.0.101: icmp_seq=4 ttl=64 time=100 ms
	64 bytes from 10.0.0.101: icmp_seq=5 ttl=64 time=100 ms

	--- 10.0.0.101 ping statistics ---
	5 packets transmitted, 5 received, 0% packet loss, time 4004ms
	rtt min/avg/max/mdev = 100.160/100.192/100.218/0.283 ms
```


### ⑥ 帯域確認
iperf3を実行して Bandwidth(帯域)確認
50Mbits/secへ制御できていることを確認


```shell
[opc@client-inst01 ~]$ sudo iperf3 -c 10.0.0.2
	Connecting to host 10.0.0.2, port 5201
	[  4] local 10.0.0.5 port 44108 connected to 10.0.0.2 port 5201
	[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
	[  4]   0.00-1.00   sec  6.18 MBytes  51.8 Mbits/sec   44    743 KBytes
	[  4]   1.00-2.00   sec  6.25 MBytes  52.4 Mbits/sec    5    638 KBytes
	[  4]   2.00-3.00   sec  5.00 MBytes  41.9 Mbits/sec    0    725 KBytes
	[  4]   3.00-4.00   sec  6.25 MBytes  52.4 Mbits/sec    0    751 KBytes
	[  4]   4.00-5.00   sec  6.25 MBytes  52.4 Mbits/sec    0    751 KBytes
	[  4]   5.00-6.00   sec  6.25 MBytes  52.4 Mbits/sec    0    778 KBytes
	[  4]   6.00-7.00   sec  5.00 MBytes  41.9 Mbits/sec    0    813 KBytes
	[  4]   7.00-8.00   sec  6.25 MBytes  52.4 Mbits/sec    0    848 KBytes
	[  4]   8.00-9.00   sec  6.25 MBytes  52.4 Mbits/sec    3    664 KBytes
	[  4]   9.00-10.00  sec  6.25 MBytes  52.4 Mbits/sec    0    786 KBytes
	- - - - - - - - - - - - - - - - - - - - - - - - -
	[ ID] Interval           Transfer     Bandwidth       Retr
	[  4]   0.00-10.00  sec  59.9 MBytes  50.3 Mbits/sec   52             sender
	[  4]   0.00-10.00  sec  56.9 MBytes  47.7 Mbits/sec                  receiver

	iperf Done.



	--- 10.0.0.2 ping statistics ---
	5 packets transmitted, 5 received, 0% packet loss, time 4004ms
	rtt min/avg/max/mdev = 100.160/100.192/100.218/0.283 ms
```





### ⑦ tcコマンド設定解除

```shell
[opc@tokyo-inst01 ~]$ sudo tc qdisc del dev ens3 root
```

# ■ 参考
　・[Traffic Control HOWTO](https://tldp.org/HOWTO/Traffic-Control-HOWTO/intro.html)
　・[man7.org > Linux > man-pages > tc(8) — Linux manual page](https://man7.org/linux/man-pages/man8/tc.8.html)
　・[How to Use the Linux Traffic Control](https://netbeez.net/blog/how-to-use-the-linux-traffic-control/)
　・[Linux Traffic Controlを使用してレイテンシーをシミュレートし、Oracle Databaseのフェッチ・サイズを調査する](https://blogs.oracle.com/cloud-infrastructure/post/linux-traffic-controller-latency-fetch-size-db)