为什么有些多队列(qdisc mq)有 n tx / 1 rx,而其他多队列有 1 tx / n rx?

为什么有些多队列(qdisc mq)有 n tx / 1 rx,而其他多队列有 1 tx / n rx?

在尝试了解多队列排队规则(mq qdisc)时,我偶然发现了以下配置:

在我的笔记本电脑上,我的 WiFi 接口实现了具有 1 rx 和 4 tx 的 mq qdisc :

$ sudo tc qdisc list dev wlp2s0
    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

$ sudo ll /sys/class/net/wlp2s0/queues/
    total 0
    33458 0 drwxr-xr-x 2 root root 0 août  18 05:54 rx-0/
    33461 0 drwxr-xr-x 3 root root 0 août  18 05:54 tx-0/
    33472 0 drwxr-xr-x 3 root root 0 août  18 05:54 tx-1/
    33483 0 drwxr-xr-x 3 root root 0 août  18 05:54 tx-2/
    33494 0 drwxr-xr-x 3 root root 0 août  18 05:54 tx-3/

另一方面,在 HP ProLiant 服务器上,每个 NIC 都实现一个具有 4 个 rx 和 1 个 tx 的 mq qdisc:

$ sudo tc qdisc show dev eno3
qdisc mq 0: root 
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

$ sudo ll /sys/class/net/eno3/queues/
total 0
41241 0 drwxr-xr-x 2 root root 0 août  12 23:17 rx-0/
41244 0 drwxr-xr-x 2 root root 0 août  12 23:17 rx-1/
41247 0 drwxr-xr-x 2 root root 0 août  12 23:17 rx-2/
41250 0 drwxr-xr-x 2 root root 0 août  12 23:17 rx-3/
41256 0 drwxr-xr-x 3 root root 0 août  12 23:17 tx-0/

我猜多队列的重点是性能,那么这背后的原因是什么?为什么 WiFi 卡实现“tx 多队列”,而 NIC 实现“rx 多队列”?

答案1

我不知道我能否果断地回答你的问题。为此,我需要了解硬件工程师和 NIC 驱动程序编写者的设计决策。您已经正确地注意到多队列中使用的队列数量的差异,但是,它们的应用方式与您所描述的不同。

提供的输出tc仅显示 Tx 队列。 mq是一个逻辑 qdisc,它允许关联下面的其他队列规则。我不知道这mq对它自己有什么影响。如果您的无线 NICmq在根级别设置为具有 4 个 Tx 队列,则使用pfifo_fast:Linux 默认值。

您会注意到 ProLiant 服务器的输出完全不同。

$ sudo tc qdisc show dev eno3
qdisc mq 0: root 
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

$ sudo ll /sys/class/net/eno3/queues/
total 0
41241 0 drwxr-xr-x 2 root root 0 août  12 23:17 rx-0/
41244 0 drwxr-xr-x 2 root root 0 août  12 23:17 rx-1/
41247 0 drwxr-xr-x 2 root root 0 août  12 23:17 rx-2/
41250 0 drwxr-xr-x 2 root root 0 août  12 23:17 rx-3/
41256 0 drwxr-xr-x 3 root root 0 août  12 23:17 tx-0/

它确实显示了在根级别的使用mq,但它实际上是单个队列。这是因为只有一个实例与pfifo_fast的输出中显示的单个 Tx 队列关联sysfs

为什么?尊重服务器,这确实有一定道理。根据所提供的服务,接收的数据可能比发送的数据多得多。至于WiFi……我真的不知道。人们会期望笔记本电脑接收的数据会多于发送的数据。

无论如何,如果您使用支持多个队列的硬件(您就是这样),您可以通过以下方式调整 NIC 驱动程序使用的队列数量:ethtool。读ethtool 的手册页为了更好的理解。

相关内容