LinuxでWeb サーバを構築してコンテンツを公開。ネットワークのトラフィックが空いている場合はサクサクコンテンツが表示されますが、高負荷時や混雑する時間に格安SIMのキャリアからアクセスした場合はどうなるのか、試してみなければ分かりません。筆者が利用している某鉄道会社の運行状況を確認するアプリを混雑時に格安SIMのキャリアからアクセスすると、コンテンツのダウンロードが遅すぎて全く表示されないか、レンダリングが上手くいかず崩れた画面が表示されてしまいます。きっと大手キャリアの高速回線でしかテストをしていないのではと思っています。
tc は、ネットワークの帯域を制御するコマンドです。低速、混雑時のテストや特定の少数ユーザが帯域を使いすぎないように制御したい場合などに用います。
tc コマンドでは、インバウンドとアウトバウンドの帯域制御を行う事が出来るが、設定方法が少々異なるので、設定が容易なアウトバウンドの制御方法を紹介したと思います。
まずは、NIC には TSO (TCP Segmentation Offload) と GSO (Generic Segmentation Offload) というパケットを制御する機能が働いているので ethtool コマンドを使って機能を OFF にします。
$ sudo apt -y install ethtool
$ sudo ethtool -k eth0
:
tcp-segmentation-offload: on
generic-segmentation-offload: on
$ sudo ethtool -K eth0 tso off gso off
$ sudo ethtool -k eth0
:
tcp-segmentation-offload: off
generic-segmentation-offload: off
$ sudo tc qdisc add dev eth0 root tbf limit 200Kb buffer 100Kb rate 200Kbps
$ sudo tc qdisc add dev <<インターフェイス>> root tbf limit <<データキューのサイズ>> buffer <<バケットのサイズ>> rate <<トークンの補充速度>>
設定内容の確認をします。
$ sudo tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc tbf 8001: dev eth0 root refcnt 2 rate 1600Kbit burst 100Kb lat 512.0ms
設定内容を削除します。
$ sudo tc qdisc del dev eth0 root
※ B は、Byte
※ qdisc : kernel のインターフェイスに送信するためのキューです。
※ netem : ネットワークエミュレータ機能 (Network Emulator)
※ tbf : フィルタの名前です。トークンバケットフィルタ(Token Bucket Filter)
eth0 の root フィルタを使用するという意味です。
制御されているのかの確認は、dstat コマンドで行います。
$ sudo apt -y install dstat
$ sudo dstat 1
You did not select any stats, using -cdngy by default.
--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
:
20 73 0 7 0| 60M 332k| 998k 63M| 0 108k|5595 7851
↓
3 2 95 0 0| 0 0 |4758B 197k| 0 0 | 243 67 <-send が 197k に抑えられています。