一、多队列网卡
1.1 什么是多队列网卡
多队列网卡(Multi-Queue NIC)支持将网络流量分发到多个处理队列中,以提高系统的网络处理性能和吞吐量。传统上,单队列网卡只有一个硬件队列用于处理所有的输入和输出流量,这可能会成为瓶颈。
通过使用多队列网卡,可以将输入和输出流量分发到不同的硬件队列中,并在多核系统上进行并行处理。这样可以减轻单个队列的负载压力,并充分利用系统资源来提高网络处理效。多队列网卡通常需要操作系统和驱动程序的支持才能实现,因为操作系统需要将流量合理地分发到各个队列,并确保数据包按照顺序正确地发送和接收。
1.2 网卡多队列 工作模式
-
Separate模式:接收队列RX和发送队列TX是分开的
-
Combined模式:接收队列和发送队列是合在一起的
1.3 irqbalance
irqbalance是一个Linux守护进程,其主要功能是动态地平衡中断请求(IRQ)在多个CPU之间的分配,以优化系统的整体性能和响应时间。
如果有人需要手动调整网卡中断绑定到特定CPU,那么为了防止手工改动 被irqbalance服务覆盖,可以将irqbalance服务停掉。 因为irqbalance可能会一直检测中断的cpu绑定情况并尝试重新平衡中断,从而覆盖之前的设置。
二、中断亲和力
2.1 什么是中断亲和力
中断绑定——中断亲和力(IRQ Affinity) ,维持亲和性是为了提高缓存效率。
在 SMP 体系结构中,我们可以通过调用系统调用和一组相关的宏来设置 CPU 亲和力(CPU affinity),将一个或多个进程绑定到一个或多个处理器上运行。中断也具有相同的特性——中断亲和力。中断亲和力是指将一个或多个中断源绑定到特定的 CPU 核心上运行。
在 /proc/irq 目录中,对于已经注册中断处理程序的硬件设备,都会在该目录下存在一个以该中断号命名的目录,该目录下有一个 smp_affinity 文件(SMP 体系结构才有该文件),文件中的数据表示 CPU 位掩码,可以用来设置该IRQ与某个CPU的亲和力(默认值为 0xffffffff,表明把中断发送到所有的 CPU 上去处理),通过指定CPU 核心与某个中断的亲和性后,中断所对应的硬件设备发出的中断请求就都会给这个CPU核心处理。
2.2 跟中断亲和力相关的配置文件
- /proc/interrupts:该文件存放了每个I/O设备的对应中断号、每个CPU的中断数、中断类型。
- /proc/irq/:该目录下存放的是以IRQ号命名的目录,如/proc/irq/40/,表示中断号为40的相关信息。
- /proc/irq/[irq_num]/smp_affinity:该文件存放的是CPU位掩码(十六进制)。修改该文件中的值可以改变CPU和某中断的亲和性。
- /proc/irq/[irq_num]/smp_affinity_list:该文件存放的是CPU列表(十进制)。注意,CPU核心个数用表示编号从0开始,如cpu0,cpu1等。
注意:smp_affinity_list和smp_affinity任意更改一个文件都会生效,两个文件相互影响,只不过是表示方法不一致,但一般都是修改smp_affinity 文件。
2.3 中断亲和力示例
2.3.1 一台aws裸金属机器的ethtool -l eth0输出如下,表示RX、TX各有32个队列。
2.3.2 查看/proc/interrupts文件,可以看到比如 eth0-Tx-Rx-0的中断号为323
2.3.4 查看/proc/irq/323/smp_affinity文件
2.3.5 查看/proc/irq/323/smp_affinity_list文件
参考资料
【1】https://zhuanlan.zhihu.com/p/688622199 解锁网络性能瓶颈:多队列网卡工作原理
【2】https://blog.k3fu.xyz/seastar/2022/09/03/seastar-perftune.html 从 perftune.py 说起