单&多队列网卡(转)

举报
夏侯曹曹 发表于 2019/12/30 15:03:53 2019/12/30
【摘要】 多队列网卡最初是用来解决网络IO QoS (quality of service)问题的,后来随着网络IO的带宽的不断提升,单核CPU不能完全处满足网卡的需求,通过多队列网卡驱动的支持,将各个队列通过中断绑定到不同的核上,以满足网卡的需求。1.多队列网卡硬件实现Intel 82575硬件逻辑图,有四个硬件队列。当收到报文时,通过hash包头的SIP、Sport、DIP、Dport四元组,将一...

多队列网卡最初是用来解决网络IO QoS (quality of service)问题的,后来随着网络IO的带宽的不断提升,单核CPU不能完全处满足网卡的需求,通过多队列网卡驱动的支持,将各个队列通过中断绑定到不同的核上,以满足网卡的需求。


1.多队列网卡硬件实现

Intel 82575硬件逻辑图,有四个硬件队列。当收到报文时,通过hash包头的SIP、Sport、DIP、Dport四元组,将一条流总是收到相同的队列。同时触发与该队列绑定的中断。

1577689206542406.gif


2.网卡驱动实现

kernel从2.6.21之前不支持多队列特性,一个网卡只能申请一个中断号,因此同一个时刻只有一个核在处理网卡收到的包。协议栈通过NAPI轮询收取各个硬件queue中的报文到net_device数据结构中,通过QDisc队列将报文发送到网卡。

1577689231928294.gif

1577689261598016.gif

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

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

这样,CPU的各个核可以并发的收包,就不会应为一个核不能满足需求,导致网络IO性能下降。

1577689284941092.gif

1577689295825941.gif


3.中断绑定

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

1577689313135319.gif


4.中断亲合纠正

一些多队列网卡驱动实现的不是太好,在初始化后会出现同一个队列的tx、rx中断绑定到不同核上的问题,这样数据在core0与core1之间流动,导致核间数据交互加大,cache命中率降低,降低了效率。

1577689326128851.gif

linux network子系统的负责人David Miller提供了一个脚本,首先检索/proc/interrupts文件中的信息,按照eth0-rx-0($VEC)中的VEC得出中断MASK,并将MASK写入中断号53对应的smp_affinity中。

1577689344380119.gif

1577689352739291.gif

由于eth-rx-0与eth-tx-0的VEC相同,实现同一个queue的tx与rx中断绑定到一个核上。

1577689364827032.gif

set_irq_affinity脚本位于http://mirror.oa.com/tlinux/tools/set_irq_affinity.sh。


5.多队列网卡识别

#lspci -vvv

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

1577689380373940.jpg

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


6. 如何在 Linux ECS实例上配置网卡多队列

运行ethtool -l eth0命令查看主网卡支持多队列的情况。

[root@localhost ~]# ethtool -l eth0

Channel parameters for eth0:

Pre-set maximums:

RX: 0

TX: 0

Other: 0

Combined: 2 # 表示最多支持设置2个队列

Current hardware settings:

RX: 0

TX: 0

Other: 0

Combined: 1 # 表示当前生效的是1个队列

说明 如果返回信息中,两个Combined字段取值相同,则表示弹性网卡已开启支持多队列。

运行ethtool -L eth0 combined 2命令开启网卡的多队列功能。

此命令作用是设置主网卡eth0使用两个队列。

[root@localhost ~]# ethtool -L eth0 combined 2

开启irqbalance服务,让ECS实例自动调整网络中断在多个vCPU核上的分配。

运行systemctl start irqbalance命令开启服务。

运行systemctl status irqbalance命令查看服务状态。

结果显示active (running),表示已开启irqbalance服务。

开启网卡多队列后,如果网络性能提升仍达不到您的预期,可以考虑开启RPS(Receive Packet Steering)特性。

#!/bin/bash

cpu_num=$(grep -c processor /proc/cpuinfo)

quotient=$((cpu_num/8))

if [ $quotient -gt 2 ]; then

quotient=2

elif [ $quotient -lt 1 ]; then

quotient=1

fi

for i in $(seq $quotient)

do

cpuset="${cpuset}f"

done

for rps_file in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)

do

echo $cpuset > $rps_file

done



【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。