web-dev-qa-db-ja.com

UbuntuLinuxでの帯域幅の制限

私はP2P環境をシミュレートしなければならない状況にあります(コンピューターサイエンスの修士論文の場合)。そのために私はUbuntuでDockerを使用して、BitTorrentネットワークに接続される仮想マシンの束を作成しています。次に、ピアのアップロードおよびダウンロードレートを設定できることを確認する必要がありますが、クライアントでそれを行うことはできません(クライアントはスリープを使用して低帯域幅をシミュレートし、その結果、割合)。

したがって、私はコンテナごとにそれを実行しようとしています。正直なところ、それが機能する限り、これがどのように達成されるかはあまり気になりませんが、運が悪ければさまざまなことを試しました。これらは私がこれまでに試したことです:

  1. トリックルトリックルはトリックをやっているようですが、なんらかの理由で、5つ以上のDockerコンテナーを開始すると、トリックルは理由を言わずにそれらの多くを終了させます。私はさまざまな設定を試しましたが、構成に関しては回すノブがそれほど多くないため、このシナリオではTrickleがオプションになるとは思いません。
  2. Wondershaper Wondershaperを使用すると機能するようですが、少なくとも帯域幅が制限されます。ここでの唯一の問題は、オプションで設定された値と実際の帯域幅との間に一見理解できる相関関係がないことです。 2048(これはキロビットである必要があります)のダウンロードを設定した場合、実際のダウンロード範囲は550KBから900KBの間で、これは本当に奇妙に見えます。
  3. tc tcを使用すると、多くの人が同様の質問に対して提案しているように、実際に帯域幅が制限されますが、どの値を設定しても、常に同じ帯域幅(約15〜20KB /秒)が得られます。

たくさんのガイドと例を試してみましたが、どれもうまくいかなかったか、上で説明されています。私はここで少し途方に暮れているので、誰かが何らかの理由で上記の例がうまくいくか別の解決策があるべきだと知っているなら、それは素晴らしいでしょう。

私が探しているのは、単一のLinuxインスタンスを制限する方法です。そうすれば、複数のDockerコンテナーでそれを機能させることができるはずです。

---------------編集----------------

私はいくつかの異なるtcコマンドを試しましたが、そのうちの1つは次のようなものです

DEV=eth0
tc qdisc del dev $DEV root
tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 100mbit
tc class add dev $DEV parent 1: classid 1:1 cbq rate 256kbit allot 1500 prio  5 bounded isolated
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 match ip src 0.0.0.0/0 flowid 1:1
tc qdisc add dev $DEV parent 1:1 sfq perturb 10

設定したレートに関係なく、常に約12 KB /秒のダウンロードが得られます(制限のないデフォルトのダウンロードは約4MB /秒です)。

------------ EDIT 2(私がやったこと)------------

コンテナー内のDockerコンテナーの帯域幅を確実に設定することはできませんが、新しいコンテナーを作成するたびに、vethsomethingと呼ばれるホストコンピューター上に仮想インターフェイスが作成されます。たとえば、これらの仮想インターフェイスでWondershaperを使用する場合、制限は正しい動作をします:)

4
Kasper Vesth

Tcを使用すると(これが最新であり、私はそれに慣れているため)、問題なくトラフィックをスローダウンできます。

ファイアウォールとして機能するサーバー(「ファイアウォール」と呼ばれる-非常にクリエイティブ)と、その背後にある2番目のサーバー(「mil102」と呼ばれる)があります。 tcコマンドを使用せずに、mil102からファイアウォールにファイルをscpすると、フルスピードで移動します。

root@firewall:/data#scp mil102:/root/test.tgz test.tgz
test.tgz       100%  712MB  71.2MB/s   00:10

次のコマンドをmil102に追加します(送信トラフィックを形成する方が簡単です)。

#!/bin/sh
DEV=eth0
tc qdisc del dev $DEV root
tc qdisc add dev $DEV handle 1: root htb default 11
tc class add dev $DEV parent 1: classid 1:1 htb rate 4Mbps
tc class add dev $DEV parent 1:1 classid 1:11 htb rate 4Mbit
tc qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 10

これで、同じコマンドが4Mbにスローダウンします。

root@firewall:/data#scp mil102:/root/test.tgz test.tgz
test.tgz         0% 6064KB 467.0KB/s   25:48 ETA

転送を停止しました-時間がかかりすぎます。 scpにリストされている速度はバイト単位であり、ビット単位のtcで指定されているため、467KB * 9 = 4203Kbであり、私の4096Kbの制限に近いです(* 8になると思いますが、パリティビットがあると思いますか?)。

10Mbitに変更しようとしましたが、scpは、1.1MB /秒(1.1 * 9 = 9.9)でデータを移動していることを示しました。

'sfq perturb 10'ディレクティブの最後の行は、ロードされた接続のトラフィックフローを均等にするために追加されました。ラウンドロビンハッシュに基づいて、各会話からパケットを取得するようにキューに指示します。

使用してテストすることも、使用しないでテストすることもできます。ロードされたマシンへのsshは、バーストが発生することなく、はるかにスムーズになります(VOIPにとって非常に重要です)。 'perturb 10'は、ハッシュアルゴリズムを10秒ごとに再計算してランダムにするように指示します。

5
Ed King