LINUX:multiq leaf 不能用 tc 替换

LINUX:multiq leaf 不能用 tc 替换
# uname -r   
4.7.5-200.fc24.x86_64+debug

# tc -s -d qdisc show dev ens3
qdisc mq 8001: root  
Sent 44589 bytes 340 pkt (dropped 0, overlimits 0 requeues 0)  backlog 0b 0p requeues 0 
qdisc fq_codel 0: parent 8001:1 
limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms ecn  Sent 90 bytes 1 pkt (dropped 0, overlimits 0 requeues 0) 
[...]
qdisc fq_codel 0: parent 8001:2
limit 10240p flows 1024 quantum 1514 target 5.0ms interval
100.0ms ecn  Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) [...]

-> 当尝试替换...

# tc qdisc replace dev ens3 parent 8001 handle :1 sfq 
Error: argument ":5" is wrong: invalid qdisc ID  

# tc qdisc replace dev ens3  handle 8001:1 sfq 
RTNETLINK answers: Invalid argument  

# tc qdisc replace dev ens3 parent 8001 handle 1 sfq 
RTNETLINK answers: No such file or directory

# tc qdisc replace dev ens3 parent 8001:1 sfq 
RTNETLINK answers: No such file or directory

具体的 qdisc 超出了本文的范围。不过,这很有意义,尤其是对于较旧的内核,其中默认的 qdisc 是 FIFO!

根据代码应该是可能的:

http://lxr.free-electrons.com/source/net/sched/sch_api.c#L1214

饶过你简单的 tc 代码路径。它只是从 cli 输入构建一个到内核的 netlink 消息。

我还没有追踪过,它可能很简单。:)

有人曾经在多任务实例中交换过叶子吗?我在构建 cli 调用时是否出错了?

答案1

嗯,从整体上来说,可以通过更改默认 qdisc 来解决这个问题,因为 mq 确实初始化了它,并将其保留为默认 qdisc。所以...

sysctl -w net.core.default_qdisc=<your_qdisc>

tc qdisc replace dev <your iface> root mq

可以验证一下...

tc -s qdisc show <your iface> ens3

不过,个人可设置性有其魅力。我可能会在需要的时候实现它。:)

相关内容