0

    基于Intel®以太网800系列网络适配器的FDIR功能及原理介绍

    2023.04.12 | admin | 149次围观

    FDIR简介

    在CPU单核时代,数据包经由网卡接收后均被送往唯一的CPU进行处理。随着多核时代到来,出现了负载均衡问题(某些core过载,而另一些core空载的情况)。为解决该问题,RSS(Receive Side Scaling)技术先通过hash操作将数据包发送到不同的core上进行中断处理,然后再经由core间转发将数据包发送到运行目的应用所在的core上。虽然负载看似在多core上均衡了,但由于hash的抗碰撞特性,大量数据包会被送到了不匹配的core上,因而数据包的core间转发成为性能瓶颈。

    Intel® 以太网Flow Director技术(Intel® Ethernet Flow Director,简称FDIR)将数据包定向发送到对应应用所在core上,从而弥补了RSS的不足,可用来加速数据包到目的应用处理的过程。在新一代Intel® 以太网800系列网络适配器中,FDIR有了更多的规则空间硬件资源和更灵活的配置机制。

    如同Linux提供了纯软件实现的RSS版本一样,Linux也提供了纯软件实现的ATR(Application Targeting Routing)模式的Flow Director,称为RFS(Receive Flow Steering)。尽管功能上等效无法找到网络配适器的驱动程序,但是RFS无法达到FDIR对网络性能的提升效果,因为它必须通过某个core来执行调度数据包,而且该core大概率不是目的应用所在的core。因此,ATR模式的FDIR可被看作RFS的智能卸载硬件加速方案。

    FDIR工作原理

    在网络适配器硬件接收到数据包时,硬件Parser会通过Parse Graph状态机对数据包进行解析提取出一些重要信息(如数据包类型)并填充在该数据包的descriptor中;

    硬件Profile Chooser根据数据包的PTYPE、Flag位、所属VSI等信息生成Profile ID;硬件Field Extractor根据该Profile ID提取出对应的Field Vector;根据mask寄存器中的信息,对Field Vector中有效字段(word)进行mask操作;根据Input Set寄存器中Field Vector到Input Set的映射关系,生成FDIR的Input Set。

    基于数据包提取出的Input Set,FDIR会查表进行精确匹配和优先级判断,从而确定出对应的action。常见的action包括:1)Drop:根据FDIR表中对应规则的DROP Flag位决定是否drop该数据包。2)To Queue:将数据包发送至目的Queue,或在进行hash操作后发送至Queue Group(也叫Queue Region)中的某个Queue。3)Counter:对匹配的数据包进行统计计数,计数的方式有:基于个数、基于byte数据量、基于个数和byte数据量。

    其中,FDIR匹配准则依据包括:1)Input Set向量域;2)数据包所属的VSI;3)数据包所匹配的Profile。

    FDIR使能机制

    Intel® 以太网800系列网络适配器最多可支持16k条FDIR规则,这些规则空间资源在硬件中是以 “独占( guaranteed )” + “共享( best effort )” 的形式进行分配的。其中,每个PF享有固定大小的独占资源,该独占资源又可被各PF下的VF分配使用;除去所有PF享有的独占资源,其余的FDIR空间资源都作为共享资源,被所有PF及其VF所共享使用。例如,在4端口25G E810中,每个PF独占资源有512,共享资源有14k(16k-512*4=14k)。独占和共享资源的配置,是通过写寄存器实现的。

    对FDIR Queue的初始化同样是通过写寄存器完成的,包括:分配FDIR VSI硬件资源;映射TC LAN Queue到VSI;初始化FDIR哈希表;初始化FDIR统计计数器;分配并初始化TX/RX LAN Queue;绑定中断到VSI Queue;分配并初始化Ring Buffer;分配FDIR Profile资源等。

    在DPDK中,FDIR规则可以通过rte_flow的组织形式runtime进行配置。每条规则中包含了必要的 Pattern和Action信息。

    紧接着基于rte_flow规则中解析出的Input Set,分配Profile ID;注册HW Profile;创建PTYPE Group的映射关系;在TCAM中添加对应的Field Vector。再之后driver根据解析出的Input Set的值分配Queue的Descriptor并对LAN+FDIR Descriptor进行填充,然后构建相应的FDIR Dummy Packet。

    通过FDIR TX Queue将规则实体以特定的格式发送给网卡的firmware,并返回处理的状态结果。

    其中,每个FDIR规则实体的内容是由64 bytes数据构成,由以下参数组成:1)从数据包中提取的参数:48 bytes的Input Set;数据包所匹配的Profile等。2)从软件Descriptor中接收到的参数:目的Queue;FDIR ID;数据包所属的VSI;统计计数器;控制相关的Flag位等。3)自维护的存储管理参数:PF/VF/VSI标志位;有效Flag位等。

    FDIR应用场景举例

    OVS Partial Offload:在HW中设置带有mark ID的FDIR规则,匹配的数据包会在对应的descriptor中记录对应的mark ID,上层的OVS可以基于此mark ID直接对该数据包的SKB进行相应的处理,从而省去了大量的解析查询等操作并大大提升了性能。

    结语

    当前VMware或Microsoft并不支持FDIR功能。FDIR更适合在纯“裸机(bare metal)” 上的Linux应用程序中提升网络性能,特别是那些网络通信量极大、处理小数据包极多的应用程序。在那些看重网络性能的应用程序(例如Memcached)中无法找到网络配适器的驱动程序,FIDR为以太网领域在高带宽、低延迟等方向提供了显着的性能增强。伴随的好处也包括降低CPU占有率、节省功耗等,因而更适合配合intel的高性能CPU使用。

    参考资料

    1. Columbia Park Ethernet IP Hardware Architecture Specification, Ethernet Products Group (EPG).

    2. Introduction to intel Ethernet Flow Director and Memcached Performance, intel White Paper.

    3. CVL Packet Processing, Qi Zhang.

    4. DPDK Ethdev Foundation, Jingjing Wu, Beilei Xing.

    5. Advanced AVF RSS & FDIR, Yahui Cao.

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论