web-dev-qa-db-ja.com

2台のubuntuサーバーマシン間の低速接続をシミュレートする

次のシナリオをシミュレートしたいと思います。4台のubuntuサーバーマシンA、B、C、Dがあるとします。ネットワーク帯域幅をマシンAとマシンCの間で20%、AとBの間で10%削減したいと思います。ネットワークシミュレーション/スロットルツールを使用してこれを行いますか?

9
Yehia Elshater

これを行うには、 tc を単独で u32 フィルターと組み合わせて使用​​するか、 iptablesマーキング と組み合わせて使用​​できます(複雑なフィルター構文を学びたくありません)。次の投稿では、前者の解決策について詳しく説明します。


セットアップのシミュレーション

例として、A、B、CおよびDが10 Mbit/sの仮想インターフェイスを実行している場合を考えてみましょう。

あなたは基本的に欲しいです:

  • A <==> B:9 Mbit/s出力のシェーピング
  • A <==> C:8 Mbit/s出力用のシェーピング

これをシミュレートするために、ブリッジに接続された4つのネットワーク名前空間と仮想イーサネットインターフェイスを作成します。

もちろん、あなたのケースでは実際のNICを使用し、インフラストラクチャに応じてブリッジがゲートウェイまたはスイッチになります。

したがって、私のシミュレーションでは、10.0.0.0/24ネットワークで次のように設定します。

                                  10.0.0.254            

                                  +-------+                     
                                  |       |                     
                                  |  br0  |                     
                                  |       |                   
                                  +---+---+                     
                                      |                         
                                      | veth{A..D}.peer        
                                      |                      
                  +------------+------+-----+------------+     
                  |            |            |            |      
            vethA |      vethB |      vethC |      vethD |      
              +---+---+    +---+---+    +---+---+    +---+---+  
              |       |    |       |    |       |    |       |   
              |   A   |    |   B   |    |   C   |    |   D   |   
              |       |    |       |    |       |    |       |  
              +-------+    +-------+    +-------+    +-------+    

              10.0.0.1      10.0.0.2     10.0.0.3     10.0.0.4           

まず、セットアップフェーズを使用して、それが何で構成されているかを理解できるようにします。慣れていない場合はスキップしてください。大したことではありません。ただし、ip netns exec <namespace> <command>コマンドを使用すると、ネットワーク名前空間(つまり、前の描画のボックスの1つ)でコマンドを実行できます。これは次のセクションでも使用されます。

# Create the bridge
ip link add br0 type bridge

# Create network namespaces and veth interfaces and plug them into the bridge
for Host in {A..D} ; do 
    ip link netns add ${Host}
    ip link add veth${Host} type veth peer name veth${Host}.peer
    ip link set dev veth${Host}.peer master br0
    ip link set dev veth${Host} netns ${Host}
    ip netns exec ${Host} ip link set veth${Host} up
done

# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD

したがって、この時点で、前述のセットアップが完了しました。


トラフィックの形成

あなたが望むものを手に入れるために、交通管制に入る時が来ました。 tcツールを使用すると、キューイングの分野を追加できます。

  • 出力の場合:カーネルがパケットを送信する必要があり、NICドライバーにアクセスする前。
  • イングレスの場合:NICドライバにアクセスした後、カーネルルーチンが受信したパケットに対して実行される前。

qdiscclassesfiltersの3つの概念があります。これらの概念を使用して、複雑なパケットフロー管理を設定し、必要な基準/基準に基づいてトラフィックに優先順位を付けることができます。

一言で言えば :

  • Qdiscsは、パケットが意図的にエンキュー/デキューされる構造です。
  • クラスは、特定の動作で動作するqdiscsのコンテナです。
  • フィルタはクラス間でパケットをルーティングする方法であり、処理中に優先順位を付けて同じエントリポイントに複数のフィルタを定義できます。

これらはすべて、通常、リーフがqdiscsで、クラスがノードであるツリーとして機能します。ツリーまたはサブツリーのルートは<id>:として宣言され、子ノードは<parent_id>:<children_id>として宣言されます。この構文を覚えておいてください。

あなたの場合、Aを取り、設定したいツリーをtcでレンダリングしましょう。

                                     1:
                                      |
                                      |
                                      |
                                     1:1
                                   /  |  \
                                  /   |   \
                                 /    |    \
                               1:10  1:20  1:30
                                |     |     |
                                |     |     |
                               :10   :20   :30

説明 :

  • 1:は、デバイスvethAに接続されているルートqdiscであり、明示的に階層トークンバケットのhtbとして取得されます(OSに応じて、デバイスのデフォルトqdiscはpfifoまたはpfifo_fastです)。これは、帯域幅の管理に特に適しています。このレベルで定義されたフィルターに一致しないパケットは、1:30クラスに送られます。
  • 1:1は、デバイスのトラフィック全体を10 Mbit/sに制限するhtbクラスになります。
  • 1:10は、出力トラフィックを9 Mbit/s(10 Mbit/sの90%)に制限するhtbクラスになります。
  • 1:20は、出力トラフィックを8 Mbit/s(10 Mbit/sの80%)に制限するhtbクラスになります。
  • 1:30は、トラフィックを10メガビット/秒(フォールバック)に制限するhtbクラスになります。
  • :10, :20, :30は、確率的公平性キューイングのsfqqdiscです。言い換えると、これらのqdiscsは、フローに基づいた送信スケジュールの公平性を保証します。

このすべては、次のコマンドによってセットアップされます。

ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10

最後に必要なのは、宛先IPがBに等しいIPパケットが1:10クラスに送られ、宛先IPがCに等しいIPパケットが1:20クラスに送られるようにフィルターを追加することです。

ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20

アイデアがわかったら、同様のtcルールをBおよびCに追加して、これらのリグからAへの送信も整形されるようにする必要があります。


テスト中

それでは、テストしてみましょう。このため、私は個人的にiperfで遊んでいます。これは、クライアントまたはサーバーとして実行できる単一のバイナリで構成されており、両方のホスト間で可能な限り多くのトラフィックを自動的に送信します。

AとBの間:

 $ ip netns exec B iperf -s -p 8001
  ...
 $ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  2.0- 4.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  4.0- 6.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  6.0- 8.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  8.0-10.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  0.0-10.1 sec  10.8 MBytes  8.91 Mbits/sec

9 Mbit/sの帯域幅制限があります。

AとCの間:

$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  2.0- 4.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  4.0- 6.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  6.0- 8.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  8.0-10.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  0.0-10.1 sec  9.62 MBytes  7.98 Mbits/sec

8 Mbit/sの帯域幅制限があります。

AとDの間:

$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.62 MBytes  11.0 Mbits/sec
[  5]  2.0- 4.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  4.0- 6.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  6.0- 8.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  8.0-10.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  0.0-10.2 sec  12.0 MBytes  9.89 Mbits/sec

ここでは、仮想インターフェイスのフルスピード10 Mbit/sに到達しています。

各実行の最初のメジャーのバーストは、適切なパラメーターを調整することにより、htbクラスでより適切に処理できることに注意してください。


清掃

削除する :

  • 1:の優先度1のフィルター:tc filter del dev vethA parent 1: prio 1 u32
  • 1:のすべてのフィルター:tc filter del dev vethA parent 1:
  • クラス1:20とその子:tc class del dev vethA parent 1:1 classid 1:20
  • ツリー全体:tc qdisc del dev vethA

シミュレーションセットをクリーンアップするには:

# Remove veth pairs and network namespaces
for Host in {A..D} ; do
    ip link del dev veth${Host}.peer
    ip netns del ${Host}
done

# Remove the bridge
ip link del dev br0
15
Xavier Lucas

UbuntuはFreeBSDからIPFWを移植しており、IPFWは帯域幅、遅延、パケット損失率などのさまざまなネットワークパラメータを管理できるDUMMYNETを持っています。

0
Kondybas

最善の方法は、現在統合されている(少なくともUbuntuサーバーでは)netemモジュールでtcツールを使用することです。詳細は Stackoverflowのこの記事 を参照してください。

0
Luc Stepniewski

トリクルはうまくいきます。

この議論はいくつかの制限を示しています: https://unix.stackexchange.com/questions/109973/how-to-change-speed-limit-of-running-trickle-instance

0
Mathew