当我列出系统上的 qdisc 时,我看到一个 mq qdisc 和一些 pfifo_fast qdisc。pfifo_fast 似乎都有一个与其父级相同的主编号。还是我误解了层次结构或看到了一个没有层次结构的层次结构?也许 pfifo_fast 不是 mq 的后代?
bjb@rhino:/opt/blueeyes/houshold$ sudo tc qdisc show dev wlan0
qdisc mq 0: root
qdisc pfifo_fast 0: parent :4 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: parent :3 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: parent :2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: parent :1 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
bjb@rhino:/opt/blueeyes/houshold$
如果省略主编号或次编号,是否假定其为零?
pfifo_fast 的父级是 :1、:2、:3、:4 - 这些是 mq 下的类吗?我读到 qdiscs 的次要编号都是 0,而类的次要编号不为零,因此可以推断出这一点。因此,需要确认 qdisc mq 有多个(在本例中为 4 个)隐式类 - 也许每个驱动程序队列一个?并且 pfifo-fast qdiscs 附加到这些类。如果不是这样 - 请纠正我。
流量是如何分布到四个 pfifo_fast 的?它们之间是否实现了负载平衡?如果我想对从该接口发出的所有流量使用 netem,我应该把它放在哪里?我应该用 netem 实例替换所有 pfifo 队列吗?或者将 netem 设置为 root 的子节点,将 mq 设置为 netem 的子节点,并将 pfifo_fast 设置为 mq 的子节点?或者其他什么?也许只在 root 处有一个 netem,而忘记其余的?但是如果我这样做,我是否会失去使用所有接口每核驱动程序队列的能力,而据我所知,这正是 mq 提供的?
答案1
如果省略主编号或次编号,是否假定其为零?
是的。
pfifo_fast 的父级是:1、:2、:3、:4 - 这些是 mq 下的类吗?
是的。你可以用另一个 qdisc (0:) 替换默认的“mq”qdisc tc qdisc add dev wlan0 root mq
,你会看到相同的层次结构,但主编号不是 0,因此将显示为tc qdisc show
。
因此,寻求确认 qdisc mq 具有多个(在本例中为 4 个)隐式类 - 每个驱动程序队列可能一个?
确实如此。每个设备 TX 队列都有一个类,如定义的驱动程序和硬件。1
流量如何分配到四个 pfifo_fast?它们之间是否负载均衡?
这不是由 mq 调度程序本身完成的,而是由通常的传输数据包控制完成的,它试图通过本地化来提高性能2。“mq”被称为虚拟调度程序,可能是因为它本身不做任何可配置的策略决策。
如果我想对从该接口发出的所有流量使用 netem,我应该把它放在哪里?我应该用 netem 实例替换所有 pfifo 队列吗?或者将 netem 设置为 root 的子级...
可能是作为根的子节点替换“mq”调度程序。从技术上讲,您也可以替换四个 pfifo_fast 实例,但我看不出有什么优势。
...并且 mq 作为 netem 的子项,并且将 pfifo_fast 作为 mq 的子项?
这是不可能的,因为“mq”只能在根处使用。
也许只在根目录下有一个 netem,然后忘记其余的?
是的
但如果我这样做,我是否会失去使用所有接口每核驱动程序队列的能力,
不,“mq”或多或少通过创建匹配的类来提供对驱动程序传输队列的视图。如果您替换它,您只会丢失视图,但多队列设备驱动程序仍将拥有并使用多个传输队列。
对此持保留态度。@all:我很乐意被纠正!