最近の動画配信サイトは、視聴するネットワーク環境によって配信する動画の画質を変更しています。できる限り高画質・高音質なコンテンツをユーザに提供するため、広帯域な環境へは高画質なコンテンツを提供しています。低帯域な環境へ高画質なコンテンツを配信すると、映像がカクついてスムーズな視聴ができないので、低画質なコンテンツをとサーバが振る舞いを動的に変更しています。この技術を 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 などを参照して環境により適宜変更してください。