网络-网卡多队列

文章目录


前言

没有开启网卡多队列,导致在某些单线程多TCP链接的应用场景下,出现某个CPU软中断高的情况。

网卡在同一时刻只能产生一个中断,CPU在同一时刻只能响应一个中断,由于配置的原因,只有一颗cpu去响应中断(这个是可调的),所以所有的流量都压在了一个CPU上 ,把CPU跑满了。


一、网卡多队列

通常情况下,一张网卡会有一个队列用来接发收网络数据包,我们所说的一个队列你也可以理解成一个处理数据包的进程。

二、查看网卡多队列

1.查看网卡是否支持多队列

bash 复制代码
[root@mydesk logs]# ethtool -l ens3
Channel parameters for ens3:
Pre-set maximums:
RX:		0
TX:		0
Other:		0
Combined:	1
Current hardware settings:
RX:		0
TX:		0
Other:		0
Combined:	1

# Pre-set maximums  Combined 标识最多支持队列数
# Current hardware settings  Combined 标识当前设置的数,大于1表示已开启。

2.通过lspci方式查看

通过lspci方式查看网卡信息,如果有MSI-X, Enable+ 并且Count > 1,则该网卡是多队列网卡,多队列网卡内部会有多个 Ring Buffer。

bash 复制代码
[root@localhost ~]# lspci -vvv | grep -A50 "Ethernet controller" | grep -E "Capabilities|Ethernet controller"
01:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
	Capabilities: [40] Power Management version 3
	Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+
	Capabilities: [70] MSI-X: Enable+ Count=10 Masked-
	Capabilities: [a0] Express (v2) Endpoint, MSI 00
	Capabilities: [e0] Vital Product Data

二、设置网卡多队列

bash 复制代码
ethtool -L eth0 combined 8

设置后可以在/sys/class/net/eth0/queues/目录下看到对应的队列

bash 复制代码
[root@localhost ~]# cd /sys/class/net/eth0/queues/
[root@localhost queues]# ls
rx-0  rx-2  rx-4  rx-6  tx-0  tx-2  tx-4  tx-6
rx-1  rx-3  rx-5  rx-7  tx-1  tx-3  tx-5  tx-7

三、网卡中断均衡设置

查看网卡中断号

例如查询eth0的网卡中断号

bash 复制代码
[root@localhost ~]# cat /proc/interrupts | grep eth0 |awk -F ":" '{print $1}' | awk '{print $1}'
46
47
48
49
50
51
52
53
.....

查询其中断亲缘性配置

bash 复制代码
shell> cat /proc/irq/45/smp_affinity
02

这里的 02 实际上是十六进制,表示 1 号CPU,计算方法如下(参考资料):
Binary Hex
CPU 0 0001 1
CPU 1 0010 2
CPU 2 0100 4

设置中断均衡

基本思路就是把各个中断号绑定到单独的CPU上,但是有可能出现中断号多于CPU个数的情况,毕竟现在的网卡都很高级,那么这个时候就要会出现同个CPU绑定多个中断号了。

设置中断号绑核需要将绑定CPU的信息设置到对应中断号上,如下

bash 复制代码
echo 00000001 > /proc/irq/46/smp_affinity

这表示将网卡中断号46绑定到CPU0上。

其中,smp_affinity变量用位方式表示CPU序号,即

bash 复制代码
00000001 -----> 对应CPU0
00000002 -----> 对应CPU1
00000004 -----> 对应CPU2
00000008 -----> 对应CPU3
00000010 -----> 对应CPU4
....

说明:如果希望多个CPU参与中断处理的话,可以使用类似下面的语法:

echo 3,5 > /proc/irq/45/smp_affinity_list

echo 0-7 > /proc/irq/45/smp_affinity_list

坏消息是对单队列网卡而言,「smp_affinity」和「smp_affinity_list」配置多CPU无效。


相关推荐
AC赳赳老秦5 小时前
2026 智能制造趋势:DeepSeek 助力“黑灯”工厂运营,实现生产流程自动化
网络·数据结构·算法·安全·web安全·prometheus·deepseek
暴力求解5 小时前
Linux-进程(三)进程的孤儿状态和僵尸状态
linux·运维·服务器
乾元5 小时前
数据投毒:如何通过训练数据污染埋下“后门”
运维·人工智能·网络协议·安全·网络安全·系统架构·自动化
小鸡食米5 小时前
Keepalived高可用
运维·服务器·网络
dreams_dream6 小时前
docker清除所有网络
运维·docker·容器
工业HMI实战笔记6 小时前
新能源行业HMI:光伏电站与储能系统监控界面
ui·性能优化·自动化·汽车·交互
敲上瘾6 小时前
从虚拟地址到物理页框:Linux 页表与内存管理全解析
linux·运维·服务器·缓存
袁袁袁袁满6 小时前
Linux如何导出指定时间的日志?
linux·运维·服务器·linux日志·linux日志导出
白太岁6 小时前
操作系统开发:(10) 线程创建与调度的底层原理:从硬件行为解释线程
c语言·网络·系统架构
捷利迅分享6 小时前
Xshell高效运维实战技术大纲(含企业级案例+命令示例)
运维