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つあります:
# 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
パラメータrate
が必要です 、burst
および(limit
| latency
)。そこで、burst
の方法を理解せずに、次のことを試しました。 および(limit
| latency
)使用可能な帯域幅に影響を与えます:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k
これにより、113キロビット/秒の測定帯域幅が得られました。 mtu
に値を追加することに気付くまで、これらのパラメータをいじってみてもそれほど変わりませんでした。 物事を劇的に変える:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
測定された帯域幅は1.00メガビット/秒でした。
帯域幅を正確な特定のレートに制限するには、どのパラメータを設定する必要がありますか?
htb
を使用する必要があります またはtbf
このためのキューイングの規律?
編集 :
これらのリソースに基づいて、いくつかのテストを行いました:
- https://help.ubuntu.com/community/UbuntuBonding
- https://help.ubuntu.com/community/LinkAggregation
- /usr/share/doc/ifenslave-2.6/README.Debian.gz http://lartc.org/
次の設定を試しました。
物理マシン上
/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
を削除しても、結果は変わりません (パッシブインターフェイス)ボンドから。
結論
交通管制 ボンドインターフェイスでは機能しないか、少なくとも期待どおりには機能しません。さらに調査する必要があります。
回避策として、キューイングの分野を追加できます。 ボンドに属するインターフェースに直接。
承認された回答:
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