web-dev-qa-db-ja.com

tc qdiscとiperfを理解する

tcで帯域幅を制限し、iperfで結果を確認しようとしています。私はこのように始めました:

# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 35213 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   830 MBytes   696 Mbits/sec

2つのインスタンスはイーサネットを介して直接接続されます。

次に、1つのデフォルトクラスでhtbqdiscを設定して、帯域幅を1メガビット/秒に制限します。

# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit

しかし、期待どおりの結果が得られません。

# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 35217 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-12.8 sec   768 KBytes   491 Kbits/sec

レートを2倍にしても、測定された帯域幅は変わりません。何が欠けていますか?測定された帯域幅がrateパラメータからの1メガビットに対応しないのはなぜですか?帯域幅を所定のレートに正確に制限するには、どのパラメータを設定する必要がありますか?

ただし、manページには、このタスクにtbfqdiscとして選択する必要があると記載されています。

トークンバケットフィルターは、トラフィックを正確に構成された速度まで遅くするのに適しています。広い帯域幅に対応します。

tbfにはパラメーターrateburstおよび(limit | latency)が必要です。したがって、burstおよび(limit | latency)が使用可能な帯域幅にどのように影響するかを理解せずに、次のことを試しました。

# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k

これにより、測定帯域幅は113 Kビット/秒になりました。これらのパラメーターをいじってみても、mtuに値を追加すると状況が大きく変わることに気づくまで、それほど大きな変化はありませんでした。

# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000

その結果、測定帯域幅は1.00メガビット/秒になりました。

帯域幅を特定のレートに制限するには、どのパラメータを設定する必要がありますか?

これにはhtbまたはtbfキューイング規則を使用する必要がありますか?

[〜#〜]編集[〜#〜]

これらのリソースに基づいて、いくつかのテストを行いました。

以下の設定を試しました。

物理マシン上

/etc/network/interfaces

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
bridge_ports eth0

iperfを使用した測定:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.4 port 51804 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.9 sec  1.62 MBytes  1.14 Mbits/sec

iperfサーバーは異なる帯域幅を計算しましたが、

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.4 port 51804
[  4]  0.0-13.7 sec  1.62 MBytes   993 Kbits/sec

結合のない仮想マシン

/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

iperfを使用した測定:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 34347 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.3 sec  1.62 MBytes  1.21 Mbits/sec

iperfサーバーは異なる帯域幅を計算しましたが、

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.7 port 34347
[  4]  0.0-14.0 sec  1.62 MBytes   972 Kbits/sec

ボンディングを備えた仮想マシン(eth0で構成されたtc)

/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
allow-bond0 eth0
iface eth0 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto eth1
allow-bond0 eth1
iface eth1 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto bond0
iface bond0 inet dhcp
    bond-slaves none
    bond-mode 1
#    bond-arp-interval 250
#    bond-arp-ip-target 192.168.2.1
#    bond-arp-validate 3

iperfを使用した測定:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.9 port 49054 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.9 sec  1.62 MBytes  1.14 Mbits/sec

iperfサーバーは異なる帯域幅を計算しましたが、

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49054
[  4]  0.0-14.0 sec  1.62 MBytes   972 Kbits/sec

ボンディングを使用する仮想マシン(bond0で構成されたtc)

/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
allow-bond0 eth0
iface eth0 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto eth1
allow-bond0 eth1
iface eth1 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto bond0
iface bond0 inet dhcp
    bond-slaves none
    bond-mode 1
#    bond-arp-interval 250
#    bond-arp-ip-target 192.168.2.1
#    bond-arp-validate 3

iperfを使用した測定:

# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.9 port 49055 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-13.3 sec   768 KBytes   475 Kbits/sec

iperfサーバーは異なる帯域幅を計算しましたが、

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49055
[  4]  0.0-14.1 sec   768 KBytes   446 Kbits/sec

ボンドからeth1(パッシブインターフェイス)を削除しても結果は変わりません。

結論

結合インターフェースのトラフィック制御が機能しない、または少なくとも期待どおりに機能しない。さらに調査する必要があります。

回避策として、キューイング規則をボンドに属するインターフェースに直接追加できます。

15

Tcの動作が不明な場合でも、tcを監視してパケットのフローを確認できますか?私のスクリプトを使用してtcを監視でき、特権を解除してターミナルで実行する必要があります。 wlan0を別のインターフェースに変更でき、grepとawkも必要です。

      #!/bin/sh
      INTERVAL=15
      while sleep $INTERVAL
      do
             /usr/sbin/tc -s -d class show dev wlan0

             uptime
             more /proc/meminfo | grep MemFree | grep -v grep
             echo cache-name num-active-objs total-objs obj-size
             SKBUFF=`more /proc/slabinfo | grep skbuff | grep -v grep | awk 
             '{print $2} {print $3} {print $4}'`

             echo skbuff_head_cache: $SKBUFF
      done
2
Gigamegs

burst/limitの値を増やしてみてください。 トークンバケットアルゴリズムは適切にスケーリングされますが、精度/速度比は制限されます。

精度は小さなバケットを使用して達成され、速度はトークンのサイズを増やすことで達成されます。大きいトークンは、補充されるレートが減少することを意味します(1秒あたりのトークン= 1秒あたりのバイト数/トークンあたりのバイト数)。

rateパラメータは、超過されないaverageレートを示し、burstまたはlimitパラメータは、平均化ウィンドウのサイズを示します。回線速度でのパケットの送信は、パケットが転送される時間の設定レートを超えるため、平均化ウィンドウは、単一のパケットを送信してもウィンドウ全体が制限を超えないように、十分に大きい必要があります。より多くのパケットがウィンドウに収まる場合、アルゴリズムはターゲットを正確にヒットする可能性が高くなります。

0
Simon Richter

結合インターフェース(この場合はbond0)にキューの規律を追加する前にこれを実行します

ipconfig bond0 txqueuelen 1000

ボンディングインターフェイスなどのソフトウェア仮想デバイスにはデフォルトのキューがないため、機能しません。

0
Fan

bondデバイスにはキューが定義されていないため、qdiscサイズを設定すると、問題が明示的に修正されます。

以下は、qdisc構造の下で使用されるリーフHTBの例です。tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

0
SagiLow