智能网卡、DPDK、BSP

初步学习DPDK,发现跟公司项目极其相似,但是公司的项目属于智能网卡,一时间分不清什么是DPDK,什么是智能NIC,找到个腾讯云社区的文档,恍然大悟。

(1)初始设计时,内核没有将数据处理与逻辑控制相分离,网络协议栈实现在内核中。通讯行业的数据面、控制面、管理面分离的理念并没有在内核中实现

(2)为了将网络协议栈从内核中剥离,最好的方式就是实现一个数据面

(3)由于网卡功能有限,没有逻辑单元,仅负责收发数据包的IO操作以及少量的数据包缓存。大部分协议解析都必须由主机CPU完成。

DPDK

https://zhuanlan.zhihu.com/p/347693559)

绕过了内核空间,CPU占用依旧存在。DPDK一般而言都是专门分配一个或者几个CPU核心来处理数据

DPDK是将数据面拉到用户态来处理,跳过内核空间

image-20230630221051442

FPGA/ASIC

给网卡赋予逻辑单元,ASIC与FPGA承担高性能网络处理的职责,专门的电路可以及时的处理数据包,无需主机CPU参与。

但是,必须采用专门的软件对专门的硬件进行编程,FPAG需要专门的语言。

智能网卡

网卡上装一个通用的CPU,配备一块足够的内存,构成小型计算机,可执行通用代码。

和DPDK把数据包拉到用户态的方向相反,将处理数据包的代码向下注入网卡。

image-20230630222000950

对比

DPDK是pass内核协议栈,上拉到用户态;

智能网卡:在硬件里offload协议栈

DPDK+ x86CPU + ringbuffer + inter网卡 = 智能网卡

能力要求

  1. PMD:轮询模式驱动,通过非中断、以及数据帧进出应用缓冲区内核的零拷贝机制,提高发送/接收数据帧的效率

  2. 流(Flow)分类:为N元组匹配和LPM(最长前缀匹配)提供优化的查找算法

  3. 环队列(ring queue):针对单个或多个数据包生产者、单个数据包消费者的初入队列,提供无锁机制,有效减少系统开销

  4. MBUF缓冲区管理:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧(诸如头部解析,非法报文过滤),供应用程序使用。

  5. EAL:环境抽象(适配)层,PMD初始化,CPU内核和DPDK线程配置/绑定、设置大页内存等系统初始化

1.1.3. 核心思想

  1. 用户态模式的PMD驱动,去除中断、避免内核态和用户态内存拷贝,减少系统开销,从而提升I/O吞吐能力

  2. 用户态有一个好处,一旦程序崩溃,不至于导致内核完蛋,带来更高的健壮性

  3. HugePage,通过大页减少TLB MISS,miss对报文转发性能影响很大(不会)

  4. 多核设备上创建多线程,每个线程邦洞到独立的物理核,减少线程调度开销。同时每个线程对应着独立免锁队列,同样为了降低系统开销。

1.1.4. DPDK多队列和多线程机制

img

将网卡接收队列分配给某个CPU核,该队列收到的报文都交给该核上的DPDK线程处理。

存在两种方式将数据包发送到接收队列上:

² RSS机制:根据关键字,比如五元组进行hash

² Flow Director机制:可设定根据数据包某些信息进行精确匹配,分配到指定的队列与CPU核

当网络数据包被网卡接收后,DPDK网卡驱动将其存储在一个高效缓冲区中,并在MBUF缓存中创建MBUF对象与实际数据包相连(没太懂),对网络包的分析和处理都会基于该MBUF,必要的时候才会访问缓冲区中的实际网络包

加载器SDK

代码“写入”网卡,此处需要去了解一下Makefile脚本

BSP

嵌入式系统:具有专一功能的计算机系统

嵌入式工程师:分为嵌入式硬件工程师和嵌入式软件工程师

  • 嵌入式硬件工程师:负责设计嵌入式系统的硬件原理图,画出PCB,后期配合嵌入式软件工程师调试系统

  • 嵌入式软件工程师:分为BSP工程师和嵌入式应用软件工程师

    • 嵌入式应用软件工程师:主要负责基于嵌入式系统的应用软件。
    • BSP工程师

BSP工程师

Board Support Package,板级支持包。(使得板子正常稳定的工作)

板子:

  • 跑操作系统的:

    • Bringup 点亮板子:需要结合硬件原理图修改从芯片厂商拿到的参考代码,调试板子,使板子上的操作系统能够正常稳定工作。 核心就是对内核的移植、裁剪。涉及计算机原理、操作系统、处理器架构等,还包括一些硬件方面的知识
    • 使能板子上的所有设备:操作系统下驱动开发过程,需要掌握硬件工作原理,操作系统的相关知识
    • 为板子开发应用程序:开发应用程序来实现某种特定的功能,应用程序中会使用第二阶段提供的软件接口控制板子上的设备来完成这一功能(嵌入式应用软件开发)
  • 不跑操作系统的:51单片机,stm系列单片机

能力要求:

  • 掌握计算机原理方面的知识;
  • 掌握操作系统的相关知识,深入研究某种操作系统,目前来讲,研究linux操作系统应该是大部分人的选择;
  • 精湛的C语言功底和一定的C++/汇编的知识。
  • 掌握一定的硬件和电路原理方面的知识;
  • 熟悉常见的接口协议,如I2C, SPI, UART, USB等。

当然作为一个软件开发人员也必须掌握一些通用的软件,比如:

  • 代码管理软件,常见的如git等;
  • 代码阅读软件,这个就因个人喜好而不同了,比如:opengrok,source insight,vim下ctags/cscope插件组合等。
posted @ 2023-06-30 22:27  senorita-18  阅读(183)  评论(0编辑  收藏  举报