帯域制御

LINEで送る
Pocket

最近の動画配信サイトは、視聴するネットワーク環境によって配信する動画の画質を変更しています。できる限り高画質・高音質なコンテンツをユーザに提供するため、広帯域な環境へは高画質なコンテンツを提供しています。低帯域な環境へ高画質なコンテンツを配信すると、映像がカクついてスムーズな視聴ができないので、低画質なコンテンツをとサーバが振る舞いを動的に変更しています。この技術を ABR(Adaptive bit Rate) といい、ビットレートによっことなるサービスを提供する技術のことを言います。

動画配信サイトでなくても、ローカル環境からサーバにアクセスすると上手く動作するけど、Wi-Fi や公共回線からサーバにアクセスすると上手く動作しないなどよくあります。tc(Traffic Control) コマンドは、ネットワークの帯域を意図的に変更する事ができるので、これらの環境を擬似的につくるのに有効なコマンドです。

www.yahoo.co.jp に ping コマンドを発行してレスポンス時間をみると約 7ms だと分かります。

$ ping -c 3 www.yahoo.co.jp
PING www.yahoo.co.jp(182.22.25.124) 56(84) bytes of data.
64 bytes from 182.22.25.124: icmp_seq=1 ttl=240 time=6.71 ms
64 bytes from 182.22.25.124: icmp_seq=2 ttl=240 time=7.04 ms
64 bytes from 182.22.25.124: icmp_seq=3 ttl=240 time=6.95 ms

--- www.yahoo.co.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 6.711/6.901/7.041/0.155 ms

ネットワークデバイス名を確認します。

$ ip a
        :
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:62:76:49 brd ff:ff:ff:ff:ff:ff
        :
enp0s3 に 20ms の遅延を設定します。
$ sudo tc qdisc add dev enp0s3 root netem delay 20ms
設定の確認をします。
$ tc -s qdisc
qdisc noqueue 0: dev lo root refcnt 2
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0 
qdisc netem 8001: dev enp0s3 root refcnt 2 limit 1000 delay 20.0ms
 Sent 10144 bytes 75 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 106b 1p requeues 0 

www.yahoo.co.jp に 再度 ping コマンドを発行すると先ほどから +20ms 遅延している事がわかります。

$ ping -c 3 www.yahoo.co.jp
PING www.yahoo.co.jp (182.22.25.124) 56(84) bytes of data.
64 bytes from 182.22.25.124: icmp_seq=1 ttl=240 time=27.5 ms
64 bytes from 182.22.25.124: icmp_seq=2 ttl=240 time=27.3 ms
64 bytes from 182.22.25.124: icmp_seq=3 ttl=240 time=27.5 ms

--- www.yahoo.co.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 27.343/27.470/27.535/0.211 ms

設定を削除します。

$ sudo tc qdisc del dev enp0s3 root

ネットワークの帯域を測定する iperf3 コマンドをインストールします。

$ sudo apt-get -y install iperf3
$ iperf3 -s  <- 受信側
$ iperf3 -c 172.20.10.6 <- 送信側
Connecting to host 172.20.10.6, port 5201
[  4] local 172.20.10.10 port 48716 connected to 172.20.10.6 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   888 MBytes  7.45 Gbits/sec    0    816 KBytes
[  4]   1.00-2.00   sec   899 MBytes  7.54 Gbits/sec    0   1.01 MBytes
[  4]   2.00-3.00   sec   924 MBytes  7.75 Gbits/sec    0   1.14 MBytes
[  4]   3.00-4.00   sec   916 MBytes  7.69 Gbits/sec    0   1.51 MBytes
[  4]   4.00-5.00   sec   916 MBytes  7.68 Gbits/sec    0   1.60 MBytes
[  4]   5.00-6.00   sec   840 MBytes  7.05 Gbits/sec    0   1.60 MBytes
[  4]   6.00-7.00   sec   899 MBytes  7.54 Gbits/sec    0   1.68 MBytes
[  4]   7.00-8.00   sec   908 MBytes  7.62 Gbits/sec    0   1.77 MBytes
[  4]   8.00-9.00   sec   899 MBytes  7.54 Gbits/sec    0   1.87 MBytes
[  4]   9.00-10.00  sec   885 MBytes  7.42 Gbits/sec    0   2.09 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  8.76 GBytes  7.53 Gbits/sec    0             sender
[  4]   0.00-10.00  sec  8.76 GBytes  7.52 Gbits/sec                  receiver

iperf Done.

出力帯域を100Mbpsに制限します。

$ sudo tc qdisc add dev enp0s3 root tbf rate 100mbit burst 250kb limit 2000

————————————————–
qdisc : パケットのキューディスクの意
root : qdisc の root の意
tbf : トークンバケットフルター の意
rate : 出力帯域領域
burst : トークンのバッファ
limit : qdisc のリミット
————————————————–

再度実行すると帯域の制限がかかっている事が分かります。

$ iperf3 -c 172.20.10.6
Connecting to host 172.20.10.6, port 5201
[  4] local 172.20.10.10 port 48712 connected to 172.20.10.6 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   395 KBytes  3.23 Mbits/sec    0   1.41 KBytes
[  4]   1.00-2.00   sec  1.17 MBytes  9.80 Mbits/sec    0   5.66 KBytes
[  4]   2.00-3.00   sec   454 KBytes  3.72 Mbits/sec    0   1.41 KBytes
[  4]   3.00-4.00   sec   448 KBytes  3.67 Mbits/sec    0   5.66 KBytes
[  4]   4.00-5.00   sec   529 KBytes  4.33 Mbits/sec    0   1.41 KBytes
[  4]   5.00-6.00   sec   457 KBytes  3.74 Mbits/sec    0   5.66 KBytes
[  4]   6.00-7.00   sec   540 KBytes  4.42 Mbits/sec    0   1.41 KBytes
[  4]   7.00-8.00   sec  1.35 MBytes  11.4 Mbits/sec    0   2.83 KBytes
[  4]   8.00-9.00   sec  2.19 MBytes  18.4 Mbits/sec    0   1.41 KBytes
[  4]   9.00-10.00  sec  1.96 MBytes  16.5 Mbits/sec    0   5.66 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  9.43 MBytes  7.91 Mbits/sec    0             sender
[  4]   0.00-10.00  sec  9.37 MBytes  7.86 Mbits/sec                  receiver

iperf Done.

※紹介したのは送信帯域を変更するやり方ですが、ifb モジュールを利用した受信帯域を設定する方法もあります。tc コマンドのパラメータはman などを参照して環境により適宜変更してください。

LINEで送る
Pocket

  • このエントリーをはてなブックマークに追加

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください