如何使用“tc”命令赋予第一个队列优先级?

如何使用“tc”命令赋予第一个队列优先级?

假设我有 3 个队列(# 表示数据):

Q1: (in)[            ###](out)
Q2: (in)[          #####](out) 
Q3: (in)[  #############](out)

假设我把所有 ICMP 数据包放在 Q1 中,把所有持续下载放在 Q3 中。

当 Q1 有数据时,如何使用tc命令(来自 iproute2)来清空它,并忽略其他 2 个队列?

目前我正在限制 Q3 的速率,但这感觉很粗糙。我希望 Q3 在 Q1 没有流量时以全速下载。

这可能吗?

更新:看看我的版本 1我的 QoS 脚本。

更新 2:我已经进一步更新了我的脚本(请参阅版本 2),但我已将 ISP 更改为在其端不执行 QoS 的 ISP(因此不需要动态速度更改)。但是,我添加了 -u 和 -d 参数,这样我就可以更改我的上/下限,而无需编辑脚本。此脚本的问题是队列速度永远不会达到 ceil 的值;它们只会达到rate- 我认为这不应该发生。

更新 3:我不知道为什么,但是版本 3我的 QoS 脚本作品!如果有人能解释一下原因,那就太好了……我只做了很小的改动;我看不出我做了什么让它起作用……我发现它起作用后,改变了连拍设置。

答案1

不错的脚本,我喜欢与时间相关的动态下载速度部分。;) 无论如何,我正在做你想要的。我用 htb 做到了,但几个月前换成了 hfsc。诀窍是将速率限制为非常低的 q3,但给它 ceil 完整的带宽。另一方面,q1 获得更高的速率和相同的 ceil。一个现实世界的例子:

tc class add dev ppp0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev ppp0 parent 1:1 classid 1:10 htb rate 60kbps ceil 100kbps prio 1 
tc class add dev ppp0 parent 1:1 classid 1:11 htb rate 39kbps ceil 100kbps prio 2 
tc class add dev ppp0 parent 1:1 classid 1:12 htb rate 1kbps ceil 100kbps prio 3 

Q1 为 1:10

Q2 为 1:11

Q3 为 1:12

也许你的问题出在你复杂的脚本上。尝试使用更轻量级的版本进行调试。

tc -s -d class show dev <interface>应该显示一些有关队列的统计数据。如果 q1 没有任何事可做,并且 q3 没有使用全部带宽,那么让我们显示输出。您也可以尝试 hfsc。

一条备注:在大多数配置中,对传入流量进行 QOS 或流量控制几乎毫无用处。通常,您处于接收者角色,无法控制接收多少数据/时间。您可以使用入口排队,但它不会有太大帮助,它只会丢弃已经收到的数据包。

这并不像听起来那么糟糕,因为如今大多数拨入连接都是不对称的,这意味着传输方向是瓶颈。(总是从你的角度来看)

答案2

研究“优先级”、“速率”和“上限”的使用。

您应该能够基本上为 Q3 赋予低速率(和高上限)... 并为 Q1 赋予“较低”优先级(这实际上使其更重要)。这样做应该做的是让 Q1 获得主要带宽... 当它未被使用时... 然后应该将 Q3 提升到其上限(因为它不那么重要)。

答案3

这是我的工作版本: QoS-v3.sh

这甚至对下载的 QoS 也有效;但需要一小段时间才能“稳定”。这是因为,据我所知,服务器仍将尝试以最大可能的速度向您发送 - 但由于 QoS 脚本正在丢弃数据包,传入连接通常会降低其发送数据包的速率(直到数据包不再被丢弃)。

就像 7/9 的人会说的那样:粗糙但有效(天啊,我没有......)

相关内容