web-dev-qa-db-ja.com

tcを使用して待ち時間と帯域幅制限インターフェースを追加するにはどうすればよいですか?

次のコマンドを使用して、インターフェイスに遅延を追加できることを知っています。

# tc qdisc add dev eth0 root netem delay 50ms

レイテンシに加えて、このインターフェイスの帯域幅を制限を100kbpsにしたいと考えています。

これどうやってするの?

帯域幅を制限する方法の例をいくつか見ました。例えば:

# tc qdisc add dev eth0 root handle 1: cbq avpkt 1000 bandwidth 10mbit 

# tc class add dev eth0 parent 1: classid 1:1 cbq rate 512kbit \
  allot 1500 prio 5 bounded isolated 

# tc filter add dev eth0 parent 1: protocol ip prio 16 u32 

しかし、レイテンシの遅延を設定した後でこれらのコマンドを実行しようとすると、次のようなエラーが発生します。

RTNETLINK answers: File exists

例えば:

# tc qdisc add dev eth0 root netem delay 97ms
# tc qdisc add dev eth0 root handle 1: cbq avpkt 1000 bandwidth 10kbit
RTNETLINK answers: File exists

私は本当に両方を実行できるようにしたいです:帯域幅を制限し、待ち時間の遅延を導入します。誰かがこれを達成する方法を知っていますか?

3
Runcible

あなたの例では、出口に2つのルートqdiscsを追加しようとしています。ルートqdiscがすでにあり、許可されているのは1つだけなので、2番目のコマンドは失敗します。代わりに、ルートqdisc、次にその子クラスを作成し、2番目のqdiscをクラスの子として追加します。例えば:

tc qdisc add dev eth0 root handle 1:0 cbq avpkt 1000 bandwidth 10kbit
tc class add dev eth0 parent 1:0 classid 1:1 cbq rate 512kbit \
    allot 1500 prio 5 bounded isolated
tc qdisc add dev eth0 parent 1:1 netem delay 97ms

この例では、ルートqdiscにハンドル1:0を割り当てました。次に、クラスを1:0の子として指定し、ハンドルを1:1にしました。次に、2番目のqdiscを1:1の子として追加しました。

これらのコマンドを実行した後、tc qdiscは、cbq qdiscとnetem qdiscの両方を表示する必要があります。 Linux Advanced Routing&Traffic Control HOWTO は、qdiscsに関する詳細情報を提供します。

3
aousterh