假设我有 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 的人会说的那样:粗糙但有效(天啊,我没有......)