我目前的情况是,我必须模拟一个 P2P 环境(用于我的计算机科学硕士论文)。为此,我使用 Docker 和 Ubuntu 创建了一组虚拟机,这些虚拟机将连接到 BitTorrent 网络。然后,我需要确保可以设置对等点的上传和下载速率,而我无法在客户端中执行此操作(因为客户端使用休眠来模拟较低的带宽,这会导致速率激增)。
因此,我尝试对每个容器都执行此操作。说实话,只要它有效,我并不关心如何实现这一点,但我尝试过不同的方法,但都没有成功。以下是我迄今为止尝试过的方法:
- Trickle 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,则限制具有正确的行为 :)
答案1
使用 tc(因为它是最新的,而且我最熟悉它),您应该能够毫无问题地减慢流量速度。
我有一台服务器充当防火墙(称为“防火墙” - 非常有创意),然后在其后面还有第二台服务器(称为“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 秒重新计算一次哈希算法以使其随机化。