LoginSignup
3
5

More than 1 year has passed since last update.

Linuxの帯域制御をする

Posted at

tcとは?

tc(8) - Linux manual page
Traffic Control(tc)と呼ばれるIPパケットの送信制御機構のこと。
特定のソフトウェア/セッションの帯域を制限したりできる。(その他にも色々できるらしい)

TCのコンセプト

  • Traffic Controlは送信したいパケットをschedulerと呼ばれるものに通すことで行われる。
    • schedulerはキューイング規則(Queueing discipline: qdisc)とも呼ばれる。
      • パケットを一時的に格納して、以下のことができる。
        • 順番を並べ替え
        • 遅延させる
        • 破棄する
    • qdiscの操作は主に2つ
      • enqueue
        • 送信される予定のパケットをqdiscに格納しようとする処理
      • dequeue
        • 格納されたパケットを取り出し、デバイスドライバに渡す処理 スクリーンショット 2021-02-25 18.46.43.png
    • classful qdisc

スクリーンショット 2021-02-26 10.35.42.png

class(階層を持った分類)構造を持ったqdisc

  • classful qdiscは内部に複数のqdiscを持っている
  • classful qdiscにおいては内部でのenqueue処理が2つに分かれる
    • classify : 内部にあるqdiscのどこに振り分けるかの処理
    • 内部qdisc: 決めたqdiscにパケットを格納する処理
  • classify
    • classifyはfilterからどの内部qdiscに格納するべきかを決定する処理
  • 内部qdisc
    • classfulなqdiscの内部で使用されるqdisc
      • class構造の葉(leaf)となる要素にはかならずqdiscが1つ付属

Class構造

  • クラスの作り方
  • クラスはidを majorid:minoridという書式で割り当てる。

以下のようなコマンドを打つと図のような設定がされたclassが作成される

tc qdisc del dev eth0 root
# qdiscを作成し1:にハンドルするよう設定
tc qdisc add dev eth0 root handle 1: htb default 20 # qdisc A
# 最低1000Mbit/最高1000Mbitの帯域を持つクラスを1:の子として1というclassidをつけて作成
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbit ceil 1000Mbit burst 10Mb cburst 10Mb # class A
# 最低200Mbit/最高200Mbitの帯域を持つクラスを1:1の子として10というclassidをつけて作成
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 200Mbit ceil 200Mbit burst 10Mb cburst 10Mb # class B
 # 最低200Mbit/最高200Mbitの帯域を持つクラスを1:1の子として20というclassidをつけて作成
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 800Mbit ceil 1000Mbit burst 10Mb cburst 10Mb # # class C
# qdiscを作成し1:10にハンドルするよう設定
tc qdisc add dev eth0 parent 1:10 handle 100: pfifo limit 1000 # inner qdisc B
# qdiscを作成し1:20にハンドルするよう設定
tc qdisc add dev eth0 parent 1:20 handle 200: pfifo limit 1000 # inner qdisc C
# IPパケットがTCP、UDPなどでsource portが6379である場合1:10(ClassB)に分類する
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 6379 0xffff flowid 1:10
  • classifyではこの中で最も小さな番号から分類に利用しようとする
  • qdisc bなどで新たなmajorid 100:と200:を与えているが大きな意味はないので、他と被らなそうな値を入れておく
  • burstとcburstはそれぞれrateとceilに対応するtoken bucketのsize→計算法は以下
  • 上記設定のパケットが来た際の処理の流れ
    1. 1:0を確認する
    2. 1:0はフィルターなので、設定されたルールに従ってパケットを分類する. この場合は、IPパケットがTCP、UDPなどでsource portが6379である場合1:10(ClassB)に分類する なので、もし条件に合うパケットが来た場合は1:10(ClassB)のqdiscにパケットをスタックする
    3. フィルターに該当しなかった場合は他にフィルターがないため、defaultで設定された1:20に分類して終了

参考

GREE Engineering

Linux TC (帯域制御、帯域保証) 設定ガイドライン

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5