tcの基本的コマンド
■tcを使って帯域を10Mbpsに制限する"だけ"のコマンド
sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 10kb latency 100ms
(burst 10kb latency 100msを付けないと、エラーになる)
■tcを使って遅延を500msに制限するだけのtcコマンド
sudo tc qdisc add dev eth0 root netem delay 500ms
■tcを使ってパケットロスを10%に制限する"だけ"のコマンド
sudo tc qdisc add dev eth0 root netem loss 10%
■tcを使ってパケットを保持できるキューの最大数を1000に制限する"だけ"のコマンド
sudo tc qdisc change dev eth0 root handle 1: pfifo limit 1000
change
: 既存のキューイング方式を変更する際に使用されるオプションです。dev eth0
: 変更を加える対象となるネットワークインターフェースを指定します。この場合はeth0
です。root
: ルートキュー(ルートディスクリプタ)に変更を加えることを示します。handle 1:
: ルートキューを特定するためのハンドルを指定します。1:
は一般的にルートキューを表します。pfifo
: パケットを先入先出順で処理する単純なキューイング方式です。limit 1000
: パケットを保持できるキューの最大数を指定します。ここでは1000としています。
分類 | qdiscの名前 | カーネルソースファイルの場所 | 概要 |
---|---|---|---|
クラスレス qdisc | pfifo_fast | net/sched/sch_generic.c | デフォルトのqdiscです。FIFOのキューが3つあります |
pfifo | net/sched/sch_fifo.c | FIFOのキューが1つあります。キュー長の最大値はパケット数で表します | |
bfifo | 同上 | FIFOのキューが1つあります。 キュー長の最大値はバイト数で表します | |
sfq(Stochastic Fairness Queueing) | net/sched/sch_sfq.c | フローにもとづいてパケットをスケジューリングします。フローとは送信元/送信先のIPアドレス、ポート番号の組です | |
tbf(Token Bucket Filter) | net/sched/sch_tbf.c | パケットシェーピング機能を提供します。制限レートを超えたパケットはキューに保留されます | |
netem(Network Emulator) | net/sched/sch_netem.c | 送信パケットに対して、パケット廃棄、遅延等の操作をするためのqdiscです | |
fq(Fair Queue Packet Schedule) | net/sched/sch_fq.c | Fair Queue Packet Scheduler (per flow pacing) | |
クラスフル qdisc | prio | net/sched/sch_prio.c | ルールにしたがってパケットを分類(class)します。デフォルトでは3つのクラスがあります。それぞれのクラスにqdisc(sfq,tbf等)を設定することができます。 |
htb(Hierarchy Token Bucket) | net/sched/sch_htb.c | 1つのリンクを複数のサービス(www,ftp等)で共有する場合、各サービスに最低限必要な帯域を割り当てることができます |
計測は、iperf3で行う
■sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 10kb latency 100ms このコマンドにパケットロス10%を追加して下さい
sudo tc qdisc add dev eth0 root handle 1: tbf rate 10mbit burst 10kb latency 100ms sudo tc qdisc add dev eth0 parent 1:1 handle 10: netem loss 10%