GNU/Linux >> Linux の 問題 >  >> Linux

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つのインスタンスは、イーサネットを介して直接接続されています。

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

関連:新しいファイルを作成するためのNautilusコンテキストメニューオプション?

結論

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

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

承認された回答:

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

Linux
  1. Linuxでのシャットダウン、電源オフ、停止、および再起動コマンドについて理解する

  2. Linuxでfpingコマンドをインストールして使用する方法

  3. 例を使用してPuppetリソース、マニフェスト、モジュール、およびクラスを理解する

  1. 2>&1および他のシェルスクリプトのイディオムを理解する

  2. RPM のバージョンと命名スキームについて

  3. Linux のジョブ制御コマンドを理解する – bg、fg、および CTRL+Z

  1. Linux – Unixのアクセス許可とファイルタイプを理解していますか?

  2. PamとPam対応デーモン間の通信を理解していますか?

  3. 方法:MTR –ネットワーク接続の理解とトラブルシューティング