私はP2P環境をシミュレートしなければならない状況にあります(コンピューターサイエンスの修士論文の場合)。そのために私はUbuntuでDockerを使用して、BitTorrentネットワークに接続される仮想マシンの束を作成しています。次に、ピアのアップロードおよびダウンロードレートを設定できることを確認する必要がありますが、クライアントでそれを行うことはできません(クライアントはスリープを使用して低帯域幅をシミュレートし、その結果、割合)。
したがって、私はコンテナごとにそれを実行しようとしています。正直なところ、それが機能する限り、これがどのように達成されるかはあまり気になりませんが、運が悪ければさまざまなことを試しました。これらは私がこれまでに試したことです:
たくさんのガイドと例を試してみましたが、どれもうまくいかなかったか、上で説明されています。私はここで少し途方に暮れているので、誰かが何らかの理由で上記の例がうまくいくか別の解決策があるべきだと知っているなら、それは素晴らしいでしょう。
私が探しているのは、単一の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を使用する場合、制限は正しい動作をします:)
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秒ごとに再計算してランダムにするように指示します。