tc qdiscとiperfを理解する


15

で帯域幅を制限し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つのインスタンスは、イーサネット経由で直接接続されます。

次にhtb qdisc、1つのデフォルトクラスを使用して、帯域幅を1 Mbpsに制限するようにセットアップします。

# 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ページでは、このタスクに最適であることtbfが示さqdiscれています。

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

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 Mbits / secでした。

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

私は使用すべき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ボンドから(パッシブインターフェイス)を削除しても、結果は変わりません。

結論

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

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


不思議なことに、これはこの男のために働いているようだ:blog.tinola.com/?e=22
マティアス・フェルナンデス・E.

1
htbではtc filter、パケットをクラスに入れるために使用する必要があると思います。また、いくつかのhtbパラメータを変更する必要がある場合があります(tbfのように調整します)。tcngtcのフロントエンドであるを調べることをお勧めします。(これらはクイックポインターです...)
デロバート

投稿にフィルタが見つかりませんでした。レート制限できるように、トラフィックを一致させるためにどのコマンドを使用していますか?

回答:


2

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

0

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

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

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


0

ボンディングインターフェイス(この場合、bond0)にキューディシプリンを追加する前にこれを実行します

ipconfig bond0 txqueuelen 1000

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.