次のシナリオをシミュレートしたいと思います。4台のubuntuサーバーマシンA、B、C、Dがあるとします。ネットワーク帯域幅をマシンAとマシンCの間で20%、AとBの間で10%削減したいと思います。ネットワークシミュレーション/スロットルツールを使用してこれを行いますか?
これを行うには、 tc
を単独で u32
フィルターと組み合わせて使用するか、 iptablesマーキング と組み合わせて使用できます(複雑なフィルター構文を学びたくありません)。次の投稿では、前者の解決策について詳しく説明します。
例として、A、B、CおよびDが10 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
ツールを使用すると、キューイングの分野を追加できます。
qdisc、classes、filtersの3つの概念があります。これらの概念を使用して、複雑なパケットフロー管理を設定し、必要な基準/基準に基づいてトラフィックに優先順位を付けることができます。
一言で言えば :
これらはすべて、通常、リーフが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
は、確率的公平性キューイングの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に等しい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
UbuntuはFreeBSDからIPFWを移植しており、IPFWは帯域幅、遅延、パケット損失率などのさまざまなネットワークパラメータを管理できるDUMMYNETを持っています。
最善の方法は、現在統合されている(少なくともUbuntuサーバーでは)netemモジュールでtcツールを使用することです。詳細は Stackoverflowのこの記事 を参照してください。
トリクルはうまくいきます。
この議論はいくつかの制限を示しています: https://unix.stackexchange.com/questions/109973/how-to-change-speed-limit-of-running-trickle-instance