我可以在每个设备上使用多个 qdisc 吗?

我可以在每个设备上使用多个 qdisc 吗?

我可以使用 tc 将多个 qdisc 添加到同一设备,还是每个设备只能使用一个 qdisc?

另外,qdisc 可以包含子 qdisc,还是仅包含子类?即可以这样做吗tc qdisc add parent <existing qdisc> handle <child qdisc> <qdisc type>

答案1

OP的问题没有实际问题需要解决,所以我将提供一个很简单使用网络命名空间的示例

  • 建立通讯

    ip -n test1 link add up type veth peer netns test2
    ip -n test2 link set veth0 up
    ip -n test1 address add 192.0.2.11/24 dev veth0
    ip -n test2 address add 192.0.2.12/24 dev veth0
    
  • 初步测试

    # ip netns exec test1 ping -c1 192.0.2.12
    PING 192.0.2.12 (192.0.2.12) 56(84) bytes of data.
    64 bytes from 192.0.2.12: icmp_seq=1 ttl=64 time=0.068 ms
    
    --- 192.0.2.12 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.068/0.068/0.068/0.000 ms
    
  • 添加第一个基本 qdisc:内特姆

    tc -n test1 qdisc add dev veth0 root handle 1: netem delay 100ms
    
  • 测试结果

    # ip -n test1 neigh flush all
    # ip netns exec test1 ping -c2 192.0.2.12
    PING 192.0.2.12 (192.0.2.12) 56(84) bytes of data.
    64 bytes from 192.0.2.12: icmp_seq=1 ttl=64 time=200 ms
    64 bytes from 192.0.2.12: icmp_seq=2 ttl=64 time=100 ms
    
    --- 192.0.2.12 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 100.152/150.223/200.294/50.071 ms
    

    (除了 IP 延迟之外,第一个 ping 还会获取 ARP 延迟,这就是延迟两倍的原因)

  • 再次添加一个 qdisc,并将前一个 qdisc 作为父级

    tc -n test1 qdisc add dev veth0 parent 1: handle 2: netem delay 350ms
    
  • 再测试一次

    # ip -n test1 neigh flush all
    # ip netns exec test1 ping -c2 192.0.2.12
    PING 192.0.2.12 (192.0.2.12) 56(84) bytes of data.
    64 bytes from 192.0.2.12: icmp_seq=1 ttl=64 time=900 ms
    64 bytes from 192.0.2.12: icmp_seq=2 ttl=64 time=450 ms
    
    --- 192.0.2.12 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1000ms
    rtt min/avg/max/mdev = 450.228/675.272/900.317/225.044 ms
    

    正如你所看到的两个内特姆使用了 qdisc:100+350=450ms(由于第一次的 ARP,使用了两次)

只要 qdisc 的特定属性有意义,就可以继续:

tc -n test1 qdisc add dev veth0 parent 2: handle 3: prio

直到它没有意义(prio 是有品位的qdisc):

# tc -n test1 qdisc add dev veth0 parent 3: handle 4: sfq
Error: Specified class not found.

或者没有支持(可能是因为它没有意义):

# tc -n test1 qdisc del dev veth0 parent 2: handle 3:
# tc -n test1 qdisc add dev veth0 parent 2: handle 3: sfq
# tc -n test1 qdisc add dev veth0 parent 3: handle 4: netem delay 100ms
RTNETLINK answers: Operation not supported

但不能向某些东西添加第二个 qdisc(这就是为什么有类 qdisc 提供多个类):

# tc -n test1 qdisc add dev veth0 root handle 5: netem delay 100ms
Error: NLM_F_REPLACE needed to override.

结论:

  • 是的,可以有多个队列盘总共每台设备,但在给定的层次结构中,只有一个队列盘。要拥有“同一级别”的多个 qdisc 将需要队列盘它提供了多个每个都可以是一个的父级队列盘

  • 和(仅限非分类)队列盘可以有另一个队列盘作为孩子。

在大多数有用的情况下,人们使用有品位的qdisc 与,添加了额外的 qdisc作为父母,有过滤器选择如何选择班级。

这是我在第二部分中对此方案做出的回答:限制 CentOS 7 中特定端口的带宽?

相关内容