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=80k
をburst
に指定している。
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