限制 Ubuntu Linux 上的带宽

Kas*_*sth 4 networking linux traffic-shaping tc iproute2

我处于必须模拟 P2P 环境的情况(对于我的计算机科学硕士论文)。为此,我将 Docker 与 Ubuntu 一起使用来创建一堆虚拟机,这些虚拟机将连接到 BitTorrent 网络中。然后我需要确保可以设置对等点的上传和下载速率,这不是我在客户端中执行的选项(因为客户端使用睡眠来模拟较低的带宽,这会导致峰值速度)。

因此,我正在尝试为每个容器执行此操作。老实说,只要它有效,我真的不在乎这是如何完成的,但是我尝试了不同的事情但没有运气。这些是我迄今为止尝试过的事情:

  1. Trickle Trickle 似乎在起作用,但出于某种原因,当我启动超过 5 个 Docker 容器时,Trickle 会使很多容器退出而不告诉我原因。我尝试了不同的设置,但是在配置方面你没有那么多旋钮可以转动,所以我认为在这种情况下不会选择 Trickle。
  2. Wondershaper 使用 Wondershaper 似乎有效,或者至少它限制了带宽。这里唯一的问题是在选项中设置的值与实际带宽之间似乎没有可以理解的相关性。当我设置下载 2048(应该是 kbits)时,实际下载范围在 550KB 到 900KB 之间,这看起来很奇怪。
  3. 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
Run Code Online (Sandbox Code Playgroud)

无论我设置什么速率,它总是给我大约 12 KB/s 的下载(没有设置限制的默认下载大约是 4MB/s)

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

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

Ed *_*ing 5

使用 tc(因为它是最新的,而且我最熟悉它),您应该能够毫无问题地减慢流量。

我有一台充当防火墙的服务器(称为“防火墙”——非常有创意),然后在它后面有第二台服务器(称为“mil102”)。没有任何 tc 命令,将文件从 mil102 scp 到防火墙全速移动:

root@firewall:/data#scp mil102:/root/test.tgz test.tgz
test.tgz       100%  712MB  71.2MB/s   00:10
Run Code Online (Sandbox Code Playgroud)

将以下命令添加到 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
Run Code Online (Sandbox Code Playgroud)

现在相同的命令减慢到 4Mb:

root@firewall:/data#scp mil102:/root/test.tgz test.tgz
test.tgz         0% 6064KB 467.0KB/s   25:48 ETA
Run Code Online (Sandbox Code Playgroud)

我停止了转移——这会花费太长时间。scp 中列出的速度以字节为单位,以 tc 为单位指定,因此 467KB * 9 = 4203Kb,接近我的 4096Kb 限制(以为是 *8,但我猜有一个奇偶校验位?)。

我尝试更改为 10Mbit,我的 scp 显示我正在以每秒 1.1MB (1.1 * 9 = 9.9) 的速度移动数据。

添加了带有“sfq perturb 10”指令的最后一行,以平衡加载连接上的流量。它根据循环哈希指示队列从每个对话中获取数据包。

您可以使用和不使用 ssh 进行测试,如果不使用 ssh 会突然出现,使用会更流畅(对于 VOIP 非常重要)。'perturb 10' 告诉它每 10 秒重新计算一次哈希算法以使其随机。