web-dev-qa-db-ja.com

Linux tc htb + prio =非常に遅いリンク

Linux(3.2)tc、HTB、およびPRIOを使用して、DSLリンク(1メガビットのアップロードを確認済み)から送信されるトラフィックを形成しようとしています。私のLinuxボックスは、ギガビットイーサネットリンクを介してADSLモデムに接続されています。 HTBを使用してアップロード速度を制限し、パケットがモデムではなくLinuxボックスでキューに入れられるようにし、PRIOを使用してパケットを優先帯域に配置したいと思います。

だから、私はこれをしました:

tc qdisc add dev dsl root handle 1: htb default 1
tc class add dev dsl parent 1: classid 1:1 htb rate 950kbit
tc qdisc add dev dsl parent 1:1 handle 2: prio bands 6
tc qdisc add dev dsl parent 2:1 bfifo
tc qdisc add dev dsl parent 2:2 bfifo
tc qdisc add dev dsl parent 2:3 bfifo
tc qdisc add dev dsl parent 2:4 bfifo
tc qdisc add dev dsl parent 2:5 bfifo
tc qdisc add dev dsl parent 2:6 bfifo

問題は、それを行うとすぐに、アップロードリンクが惨めに遅くなることです。私は約を得ています。 25 kbit/s、つまり8倍リンクが使用されていなくても、取得するはずの速度(950 kbit/s)よりも遅くなります。

興味深いことに、PRIO qdiscを削除しても、HTB qdiscを保持すると、スループットは約2倍になります。 550 kbit/s、これはより良いですが、それでも私が得るべきものではありません。この場合も、リンクは使用されていないため、優先順位付けではこの動作は考慮されません。

私がしていることの何が問題になっているのか分かりますか?私は何年もまったく同じコマンドを使用して、イーサネットリンクを50 mbit/sに問題なく形成してきました。そのため、この状況で機能しない理由がわかりません。

追加情報:

# tc -s -d qdisc ls dev dsl
qdisc htb 1: root refcnt 2 r2q 10 default 1 direct_packets_stat 0 ver 3.17
 Sent 447262 bytes 1168 pkt (dropped 90, overlimits 38 requeues 0)
 backlog 0b 0p requeues 0
qdisc prio 2: parent 1:1 bands 6 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 447262 bytes 1168 pkt (dropped 90, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8043: parent 2:1 limit 1514b
 Sent 84138 bytes 928 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8044: parent 2:2 limit 1514b
 Sent 363124 bytes 240 pkt (dropped 90, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8045: parent 2:3 limit 1514b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8046: parent 2:4 limit 1514b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8047: parent 2:5 limit 1514b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8048: parent 2:6 limit 1514b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0

# tc -s -d class show dev dsl
class htb 1:1 root leaf 2: prio 0 quantum 11875 rate 950000bit ceil 950000bit burst 1599b/8 mpu 0b overhead 0b cburst 1599b/8 mpu 0b overhead 0b level 0
 Sent 478804 bytes 1316 pkt (dropped 90, overlimits 0 requeues 0)
 rate 42232bit 17pps backlog 0b 0p requeues 0
 lended: 1316 borrowed: 0 giants: 0
 tokens: 195781 ctokens: 195781
class prio 2:1 parent 2: leaf 8043:
 Sent 97560 bytes 1064 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:2 parent 2: leaf 8044:
 Sent 381244 bytes 252 pkt (dropped 90, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:3 parent 2: leaf 8045:
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:4 parent 2: leaf 8046:
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:5 parent 2: leaf 8047:
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:6 parent 2: leaf 8048:
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
1

Andy Furniss 犯人を見つけた 私が [〜#〜] lartc [〜#〜] メーリングリストで尋ねたとき。私が言及しなかったのは、タグ付きVLANインターフェースからトラフィックをシェーピングしていたということでした。問題は、LinuxがVLAN =インターフェイス(つまり、txqueuelen0)であり、代わりに物理インターフェイスキューを使用することを好みます。

そのため、私のbfifo qdiscsはデフォルトで1514バイトのキューになりました(tc qdisc ls出力に見られるように)。これは低すぎるため、ボトルネックが発生します。

解決策は、インターフェイスに独自のキューがあることを確認することです。

ifconfig dsl txqueuelen 20

bfifoはデフォルトで30KB(txqueuelen * MTU)のキューになり、問題が解決します。

2