我对我正在使用的 HTB 结构有一些疑问。
我的目标是限制本地网络中用户的下载和上传速度。网络的每个用户都有一个个人域列表,其中包含他不能超过的域的上下速度。
这意味着用户 1 可以在 slashdot.org 上的访问权限限制为 8KB 下载和 3KB 上传,用户 2 可以在 slashdot.org 上访问限制为 4KB 和 1KB。
现在我设置了一个很好的 iptables/tc 对,但规模很小,同时使用 2 或 3 个虚拟主机(不幸的是,我无法执行实际大小测试)。
这是我当前的结构(我只会显示 LAN 出口的结构,用于上传的结构只是该结构的“副本”)
连接在接口上的 HTB qdisc(句柄 2:),默认流量类是类 FFFF。
根类 2:1 直接位于 HTB qdisc 下,具有速率和上限下行链路容量。
默认类 2:FFFF 作为 2:1 的子级,速率为 1kbsp,下行容量为 ceil。
然后,当某个域的用户有新的限制时,动态添加其他类,添加新的 tc 类来控制来自其域的下载速度。
现在,这就是我所做的:
新建一个具有唯一id的tc类(取自数据库,不是这里的重点),作为父类2:1,速率值为1bps,ceil值设置为限制下载速度。
下面是 tc 命令:
-------------- BEGIN SCRIPT --------------
DOWNLINK=800
## Setting up the static tc qdisc and class
$tc qdisc add dev $LAN_IFACE root handle 2: htb default …Run Code Online (Sandbox Code Playgroud) 我想为我们的互联网线路添加某种流量管理。看了很多文档后,我觉得HFSC对我来说太复杂了(我不了解所有曲线的东西,恐怕我永远不会弄对),不推荐CBQ,基本上HTB是方法去大多数人。
我们的内部网络有三个“网段”,我想在这些网段之间或多或少平均地共享带宽(至少在开始时)。此外,我必须根据至少三种流量(实时流量、标准流量和批量流量)对流量进行优先级排序。带宽共享并不像实时流量应始终被视为优质流量这一事实重要,但当然也没有其他流量类别可能会饿死。
问题是,什么更有意义并且还能保证更好的实时吞吐量:
每个段创建一个类,每个类都具有相同的速率(根据 HTB 开发人员的说法,对于没有叶子的类,优先级无关紧要)并且这些类中的每一个都有三个子类(叶子),用于 3 个优先级(具有不同的优先级)和不同的费率)。
每个优先级有一个类,每个类都有不同的速率(同样优先级无关紧要),每个有 3 个子类,每个段一个,而实时类中的所有 3 个都具有最高的优先级,批量中的最低优先级类,等等。
我将尝试使用以下 ASCII 艺术图像更清楚地说明这一点:
Case 1:
root --+--> Segment A
| +--> High Prio
| +--> Normal Prio
| +--> Low Prio
|
+--> Segment B
| +--> High Prio
| +--> Normal Prio
| +--> Low Prio
|
+--> Segment C
+--> High Prio
+--> Normal Prio
+--> Low Prio
Case 2:
root --+--> High Prio
| +--> Segment A
| +--> Segment B
| +--> Segment …Run Code Online (Sandbox Code Playgroud) 我一直在尝试对我正在进行的一个学术项目执行基于 VLAN 的速率限制。该项目使用 Openflow(带有 Beacon 控制器),并使用 Mininet 模拟网络。该网络由 OpenVSwitch 组成。
对于我的项目,我需要对网络中每个 VLAN 上的流量进行速率限制。我为此选择了 tc (带有 htb),并且已经尝试了很多天来使其正常工作。这些是我想要使用 tc 实现的目标: 1) 将所有 VLAN 的速率限制为特定的数据速率。2) 确保设置速率限制后,使用交换机之间物理链路的所有 VLAN 都获得相同(或几乎相同)的最大数据速率。
因此,如果我将每个 VLAN 的数据速率限制设置为 100 Mbps,并且有 5 个 VLAN 使用物理链路,我希望所有这些 VLAN 不超过 100 Mbps,同时每个 VLAN 的最大数据速率约为 100 Mbps。
我已经为此拓扑编写了脚本:
s2---s4
|
s6---s8
|
s10---s12
Run Code Online (Sandbox Code Playgroud)
这是那个脚本:
#!/bin/bash
# delete prev:
tc qdisc del dev s10-eth2 root
tc qdisc del dev s2-eth3 root
tc qdisc del dev s6-eth2 root
tc qdisc del dev s6-eth3 root
tc qdisc del …Run Code Online (Sandbox Code Playgroud) 我试图限制一个简单的 iperf 服务器和客户端之间的带宽,使用第三台被动机器作为桥梁。在没有干扰的情况下,iperf 返回约 90 Mbits/sec 的带宽。我的目标是创建一个根 qdisc,将所有未分类的流量(所有内容)发送到子 HTB 类,在那里设置我的带宽,然后路由到叶 qdisc,一旦我开始工作,将在其中设置额外的 tc 参数。我的实现很简短:
sudo tc qdisc add dev $interface root handle 1: htb default 10
sudo tc class add dev $interface parent 1:0 classid 1:10 htb rate $bandwidth burst $burst
sudo tc qdisc add dev $interface parent 1:10 handle 10:0 netem #other stuff goes here
Run Code Online (Sandbox Code Playgroud)
当这个 bash 脚本在带有$interface = eth1, $bandwidth = 500kbps,的网桥上实现时$burst = 15k,我看到 iperf 带宽有所减少,但还没有接近规定值(通常约为 5Mbps)。
我的脚本中有错误吗?我是否滥用了突发变量?请帮忙。
更新:经过进一步调查,我发现这种流量控制在应用于与 SERVER 接口的以太网卡时工作正常,但是当将相同的命令应用于 CLIENT 端时会出现问题。当整个设置颠倒时也是如此。
我目前正在研究使用 Ubuntu 服务器而不是我的消费者级路由器来提供 QoS 的机会。我已经阅读了很多关于tc和 HTB 排队规则的资源——这看起来是我需要满足我的 QoS 需求的资源,即使现在大部分看起来很清楚,仍然有一些东西让我在子类率方面感到困扰。
让我们来看看这个示例配置作为这个问题的答案:
tc class add dev eth0 parent 1: classid 1:1 htb rate 90kbps ceil 90kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 60kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 30kbps ceil 60kbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 30kbps ceil 60kbps
Run Code Online (Sandbox Code Playgroud)
当您知道tc 的工作原理时,这非常简单:三个子类都保证有 30kbps 的带宽,但允许从其父类借用 30 kbps 以上的可用带宽(30 + …
我已经搜索了几天,但找不到解决我的问题的方法。
我有一个运行 Debian 7 的 VPS,我有 root 访问权限。
我正在尝试添加一些流量整形(使用 HTB),所以我尝试输入的第一行是这样的:
tc qdisc add dev tun0 root handle 1: htb default 10
Run Code Online (Sandbox Code Playgroud)
但不知何故它似乎是错误的,因为我收到以下错误:
RTNETLINK answers: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我的 ifconfig 显示了一个接口 tun0,所以它存在。无论如何,我也尝试过 venet0 并且失败并出现相同的错误。
当我这样做时,tc qdisc list我只有以下规则:
qdisc pfifo_fast 0: dev tun0 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
我真的找不到哪里出了问题。
注意:我升级了包 iproute(根据 Debian 的文档,它是 tc 所在的位置),但它并没有做得更好。