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


9

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


iptablesにはスロットル機能がある場合があります。私はそれを使用したことがありませんが、調べる価値があります。
Michael Martinez 14

@MichaelMartinezいいえ、ありません。tciptablesマーキングと一緒に使用する場合に行います。
Xavier Lucas 14

@XavierLucas知っておきたい!
Michael Martinez 14

回答:


15

これを行うにはtcu32フィルターを単独で使用するか、iptablesマーキングと組み合わせて使用します(複雑なフィルターの構文を学習したくない場合は、もっと簡単です)。次の投稿では、前者のソリューションについて詳しく説明します。


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

例として、10メガビット/秒の仮想インターフェイスを実行しているA、B、C、Dを考えてみましょう 。

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

  • 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ドライバーにアクセスした後、カーネルルーチンが受信したパケットに対して実行される前。

3つの概念が付属しています:qdiscクラスフィルター。これらの概念を使用して、複雑なパケットフロー管理をセットアップし、任意の基準/基準に基づいてトラフィックに優先順位を付けることができます。

手短に :

  • 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です。階層トークンバケットの場合と同様に明示的に取得されます(デバイスのデフォルトqdiscは、pfifoまたはpfifo_fastOSによって異なります)。これは、帯域幅管理に特に適しています。このレベルで定義されたフィルターに一致しないパケットは、1:30クラスに送られます。
  • 1:1htbデバイスのトラフィック全体を10 Mbit / sに制限するクラスになります。
  • 1:10htb出力トラフィックを9 Mbit / s(10 Mbit / sの90%)に制限するクラスになります。
  • 1:20htb出力トラフィックを8 Mbit / s(10 Mbit / sの80%)に制限するクラスになります。
  • 1:30htbトラフィックを10 Mbit / s(フォールバック)に制限するクラスになります。
  • :10, :20, :30あるsfq確率フェアネス・キューイングのためのqdisc。言い換えれば、これらの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に等しい1:10IPパケットがクラスに移動し、宛先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

アイデアがわかったら、tcBと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

1
あなたの素晴らしい返事をたくさんありがとう。可能であれば、フィルターを削除するコマンドを追加していただけませんか?シミュレーション後にこのセットアップを安全にロールバックしたい場合に備えて。
Yehia Elshater 2014

1
@YahiaZakariaこの情報を投稿の後半に追加しました。
ザビエルルーカス

0

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


0

最善の方法は、統合された(少なくともUbuntuサーバーで)netemモジュールでtcツールを使用することです。Stackoverflowのこの記事で詳細を確認できます


Netemは、帯域幅ではなく、RTTと輻輳エミュレーションについてです。
ザビエルルーカス

1
@XavierLucas、正解です。帯域幅については、netemがなくてもtcが必要です。
Luc Stepniewski、2014

0

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

このディスカッションはいくつかの制限を示していますhttps : //unix.stackexchange.com/questions/109973/how-to-change-speed-limit-of-running-trickle-instance


トリクルは、特定のプログラムのネットワーク帯域幅をシミュレートするために使用されます。OPはホストのスコープで解決策を模索しているようです。
ザビエルルーカス

Trickledを使用して、(単一の接続だけでなく)接続のグループをシミュレートできます。実際、この質問は「ホストからホストへのすべての接続」と解釈できます。
Mathew
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.