网络-网卡多队列


前言

没有开启网卡多队列,导致在某些单线程多TCP链接的应用场景下,出现某个CPU软中断高的情况。
网卡在同一时刻只能产生一个中断,CPU在同一时刻只能响应一个中断,由于配置的原因,只有一颗cpu去响应中断(这个是可调的),所以所有的流量都压在了一个CPU上 ,把CPU跑满了。


一、网卡多队列

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

二、查看网卡多队列

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

[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。

[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

二、设置网卡多队列

ethtool -L eth0 combined 8

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

[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的网卡中断号

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

查询其中断亲缘性配置

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的信息设置到对应中断号上,如下

echo 00000001 > /proc/irq/46/smp_affinity

这表示将网卡中断号46绑定到CPU0上。
其中,smp_affinity变量用位方式表示CPU序号,即

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无效。


### 网卡多队列接收数据的实现方式 在现代计算机网络环境中,为了提高性能并减少CPU中断次数,网卡通常采用多队列机制来处理接收到的数据包。通过这种方式,能够显著提升系统的吞吐量以及响应速度。 #### 多队列结构概述 每个多队列由独立的硬件资源支持,负责收集特定类型的流量或来自不同物理端口的数据帧。当一个数据包到达时,根据预设规则分配给相应的队列进行存储等待进一步处理[^2]。这种设计允许并发操作,即多个处理器核心可以同时访问不同的队列而不发生冲突。 对于基于FPGA实现的高性能NIC(如100Gbps),不仅具备传统意义上的多队列特性,还引入了更复杂的调度算法以优化负载均衡效果。例如,在该类设备中实现了可编程的传输调度器,可以根据实时情况动态调整各条路径上的带宽分配策略,从而更好地适应复杂的应用场景需求[^3]。 #### 数据包筛选与分发过程 一旦数据帧进入网卡内部,会先经过初步解析判断是否满足基本的安全性和协议一致性要求;接着依据目的MAC地址、VLAN标签等因素决定转发至哪个具体的输入缓冲区——也就是所谓的“接收队列”。此过程中涉及到的关键技术有: - **MAC过滤**:仅保留那些目的地为本机的有效报文; - **VLAN识别**:按照所属虚拟局域网划分组别; - **优先级排序**:根据不同业务的重要性给予区别对待。 上述提到的功能均属于第二层交换层面的操作范畴内完成,确保只有合法合规的信息才能继续向上传输给操作系统或其他上层应用服务调用[^1]。 ```bash # 配置Linux系统下的网卡多队列参数示例命令 ethtool -L eth0 combined 8 # 设置eth0接口使用八个组合型收发线程 ``` ### 配置教程 针对具体平台而言,设置多队列特性的方法可能会有所差异。以下是针对主流Linux发行版的一般指导方针: 1. 使用`ethtool`工具查询当前网卡的支持状态及其默认配置。 ```bash ethtool -l <interface_name> ``` 2. 修改现有布局或将未使用的通道激活成新的工作单元 ```bash sudo ethtool -L <interface_name> combined N # 将N个逻辑实体合并在一起形成单一线程模式 ``` 3. 对于某些高级选项(比如RPS/RFS),可能还需要编辑对应的sysctl文件来进行微调 ```bash echo "net.core.rps_sock_flow_entries=32768" | sudo tee /etc/sysctl.d/rps.conf sysctl --system # 应用更改后的配置项 ``` 以上步骤完成后重启网络服务使改动生效即可享受更加流畅高效的联网体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值