1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡

Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡

时间:2020-06-28 17:01:56

相关推荐

Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡

目录

文章目录

目录多队列网卡Intel 82575 的多队列硬件实现Intel 82575 的多队列软件驱动实现多队列网卡识别

多队列网卡

多队列网卡,是一种用来解决网络 I/O QoS 问题的技术。

随着网络 I/O 的带宽的不断提升,单 Core CPU 不能完全处满足网卡的需求,通过多队列网卡驱动的支持,将各个队列通过中断绑定到不同的 Core 上,以满足网卡的需求。

常见的多队列网卡有 Intel 的 82575、82576,Boardcom 的 57711 等。

Intel 82575 的多队列硬件实现

下图为 Intel 82575 的硬件逻辑图,有四个硬件队列。当收到报文时,通过 HASH Packet Header 的 IP 4-tuple(SIP、Sport、DIP、Dport),将同一条 Flow 总是送到相同的队列。同时触发与该队列绑定的中断。

Intel 82575 的多队列软件驱动实现

Linux Kernel 2.6.21 之前不支持多队列特性,一个网卡只能申请一个中断号,因此同一个时刻只有一个核在处理网卡收到的包。如下图,TCP/IP Stack 通过 NAPI 轮询收取各个硬件队列中的 pkts 到 net_device 数据结构中。或者通过 QDisc 队列将报文发送到网卡。

Linux Kernel 2.6.21 开始支持多队列特性,当网卡驱动加载时,通过获取的网卡型号,得到网卡的硬件队列的数量,并结合 CPU Cores 的数量,最终通过 Sum=Min(NIC queue,CPU core)得出所要激活的网卡队列数量(Sum),并申请 Sum 个中断号,分配给激活的各个队列。

如下图,当某个队列收到报文时,触发相应的中断,收到中断的核,将该任务加入到协议栈负责收包的该核的 NET_RX_SOFTIRQ 队列中(NET_RX_SOFTIRQ 在每个核上都有一个实例),在 NET_RX_SOFTIRQ 中,调用 NAPI 的收包接口,将报文收到 CPU 中有多个 netdev_queue 的 net_device 数据结构中。

这样,CPU 的各个 Cores 都可以并发的收包了,就不会因为只有一个 Core 不能满足需求,导致网络 I/O 性能下降。

NOTE:当 CPU Cores 可以平行收包时,就会出现不同的核收取了同一个 queue 的报文,这就会产生报文乱序的问题,解决方法是将一个 queue 的中断绑定到唯一的一个 Core 上去,从而避免了乱序问题。同时如果网络流量大的时候,可以将软中断均匀的分散到各个 Cores 上,避免 CPU Cores 成为瓶颈。

多队列网卡识别

lspci -vvv

查看 Ethernet controller 的条目内容,如果有 MSI-X && Enable+ && TabSize > 1,则该网卡是多队列网卡:

注:MSI(Message Signaled Interrupts)是 PCI 规范的一个实现,可以突破 CPU 256 条 interrupt 的限制,使每个设备具有多个中断线变成可能,多队列网卡驱动给每个 queue 申请了 MSI。MSI-X 是 MSI 数组,Enable+ 指使能,TabSize 是数组大小。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。