電気ひつじ牧場

技術メモと日常のあれこれ

Linuxでトラフィック制御をしたい(tcコマンド)

tcコマンドについて

tc

Linuxのiproute2パッケージに含まれるツール。トラフィックのコントロールに使う。

netem

ネットワークエミュレーションの機能を提供する 。tcコマンドから利用できる。

qdisc

queueing desciplineの略。NICのキューを管理するアルゴリズムのこと。

Linuxカーネルがパケットを送信する際は、NICごとに存在するqdiscにenqueueされる。エンキューされたパケットはカーネルにdequeueされ、その後にドライバに渡される。この場合は外向きのトラフィックのみ制御する。

クラス

qdiskの中にはクラスを持つ種類もある。 1つのqdisc内にはサブqdiscを含めることができる。そのようなqdiscをクラスフルqdiscという

フィルター

クラスフルqdiscにパケットが到達した際、そのパケットをenqueueするクラスを決定するために使われるもの qdiscの中から呼び出される。

クラスレスqdisc

pfifo_fast

デフォルトのqdisc。ただのFIFOキュー。挙動を設定により変更することはできない

tbf(token bucket filter)

指定されたレートを超えないようにパケットを通すqdisc。バケツ(バッファ)とトークンによる流量制御を行う。バケツには設定した速度でトークンが溜まっていく。パケットが到着した際はパケットと同じサイズのトークンをバケツから消すことで、パケットが通過できるようになる。

パケットの到着速度 < トークンの溜まる速度の時

パケットは即座にドライバに送られる。やがてバケツにはトークンが満杯になる。

パケットの到着速度 > トークンの溜まる速度の時

トークンはやがて枯渇してしまう。バケツにトークンがない状態でパケットが届いた際はトークンが溜まるまでキューに溜まるか、指定時間待機するか設定できる

使用法

  • burstにバケツサイズを指定する

    • バケツサイズはrateで指定した値 / HZ 以上である必要がある
    • HZはカーネルパラメータ。cat /boot/config-$(uname -r) | grep CONFIG_HZで確認できる値
  • latencyかlimitのどちらかを含める必要がある

    • どちらも上述のバケツが空の時に到着したパケットの処理を決めるもの
    • latencyで指定した時間待機(最大待機時間)
    • limit: 指定サイズまでキューに溜まる(最大サイズ)
    • いずれの場合も指定値を超過した場合はパケットは破棄される

使用例

# tc qdisc add dev eth0 root tbf rate 20mbit burst 80kb limit 800kb

HZ=250なのでrate=20mbitに対して20m/250=80kburstに指定している。

sfq(stochastic fairness queueing)

送信パケットの公平性を持ったqdisc。

クラスフルqdisc

今後書く

CBQ(class based queueing)

HTB

PRIO

参考

https://lartc.org/howto/index.html https://linux.die.net/man/8/tc