我处于必须模拟P2P环境的情况下(我的计算机科学硕士论文)。 要做到这一点,我在Ubuntu上使用Docker来创build一系列要在BitTorrentnetworking中连接的虚拟机。 然后我需要确保可以设置对等体的上传和下载速率,并且我不能在客户机上执行它(因为客户机使用睡眠模拟较低的带宽,并导致峰值率)。
所以我正在为每个容器做这个。 说实话,我真的不在意这个工作是如何实现的,但是我尝试了不同的东西,没有运气。 这些是我迄今尝试过的东西:
我已经尝试了以下吨的指导和例子,但每一个都没有工作或上面描述。 我在这里有些茫然,所以如果有人知道上面的例子应该工作或有其他解决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,使其随机。