因此,我试图为每个容器做这件事.老实说,只要它有效,我真的不在乎这是如何实现的,但我尝试了不同的事情而没有运气.这些是我到目前为止尝试过的事情:
>涓涓细流
Trickle似乎正在做这个伎俩,但出于某种原因,当我启动超过5个Docker容器时,Trickle会让很多人退出而不告诉我原因.我尝试了不同的设置,但是在配置方面没有那么多旋钮可以转动,所以我不认为在这种情况下Trickle会是一个选项.
> Wondershaper
使用Wondershaper似乎有效,或者至少它限制了带宽.这里唯一的问题是选项中的值集与实际带宽之间没有看似可以理解的相关性.当我设置下载2048(应该是kbits)时,实际下载范围在550KB到900KB之间,这看起来很奇怪.
> tc
使用tc,就像许多人提出的类似问题一样,确实限制了带宽,但无论我设置什么值,它总是给我相同的带宽(大约15-20KB / s).
我已经尝试过大量的指南和示例,但每一个都没有工作或如上所述.我在这里有些不知所措,所以如果有人知道上述例子应该有用或有其他解决方案,那就太棒了.
我正在寻找的是一种限制单个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(我最终做的)————
事实证明,您无法可靠地为容器内的Docker容器设置带宽,但无论何时创建新容器,都会在名为vethsomething的主机上创建虚拟接口.如果您在这些虚拟接口上使用Wondershaper,则限制具有正确的行为:)
我有一个服务器充当防火墙(称为’防火墙’ – 非常有创意),然后是第二个服务器(称为’mil102′).没有任何tc命令,scp’ing文件从mil102到防火墙全速移动:
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秒重新计算一次哈希算法,使其随机.