限制Ubuntu Linux上的带宽

我处于必须模拟P2P环境的情况下(我的计算机科学硕士论文)。 要做到这一点,我在Ubuntu上使用Docker来创build一系列要在BitTorrentnetworking中连接的虚拟机。 然后我需要确保可以设置对等体的上传和下载速率,并且我不能在客户机上执行它(因为客户机使用睡眠模拟较低的带宽,并导致峰值率)。

所以我正在为每个容器做这个。 说实话,我真的不在意这个工作是如何实现的,但是我尝试了不同的东西,没有运气。 这些是我迄今尝试过的东西:

  1. 涓stream涓stream似乎是在做的伎俩,但由于某种原因,当我启动超过5个docker集装箱涓stream将使他们很多退出,而不告诉我为什么。 我已经尝试了不同的设置,但是在configuration时没有那么多的旋钮,所以我不认为Trickle是这种情况下的一个选项。
  2. Wondershaper使用Wondershaper似乎工作,或者至less它限制了带宽。 这里唯一的问题是选项中设置的值与实际带宽之间没有看似可以理解的相关性。 当我设置下载2048(应该是千位),实际下载范围在550KB和900KB之间,这似乎很奇怪。
  3. tc使用tc,就像很多人提出的类似的问题一样,确实限制了带宽,但是无论我设置了什么值,它总是给我提供相同的带宽(大约15-20KB / s)。

我已经尝试了以下吨的指导和例子,但每一个都没有工作或上面描述。 我在这里有些茫然,所以如果有人知道上面的例子应该工作或有其他解决scheme的任何理由,那将是非常棒的。

我正在寻找的是一种限制单个Linux实例的方法,然后我应该能够为多个Docker容器工作。

—————编辑—————-

我已经尝试了几个不同的tc命令,但其中一个是这样的

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 / s(没有限制的默认下载大约是4MB / s)

————编辑2(我最终做了什么)————

事实certificate,您不能可靠地为容器内的Docker容器设置带宽,但是无论何时创build一个新的容器,都会在名为vethsomething的主机上创build一个虚拟接口。 如果您在这些虚拟接口上使用例如Wondershaper的限制具有正确的行为:)

使用tc(因为它是最新的,我是最熟悉的),你应该能够放慢速度,没有问题。

我有一台服务器作为防火墙(称为“防火墙” – 非常有创意),然后是第二台服务器(称为“mil102”)。 没有任何tc命令,从mil102到防火墙的文件全速移动:

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

将下列命令添加到mil102中(更容易调整发送stream量):

 #!/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'指令的最后一行被添加到均衡负载连接上的stream量。 它引导队列根据循环哈希从每个对话中获取数据包。

你可以使用或不使用-ssh来testing一个被加载的机器,而不会发生爆发,而且会更平滑(对于VOIP来说非常重要)。 “扰动10”告诉它每10秒重新计算散列algorithm,使其随机。