Ubuntu20.04 上学习DPDk21.11

目录

  • DPDK简介
  • DPDK安装编译
    • 官网下载最新版本21.11
    • 官网编译方法 meson+ninja
      • 过程中出现的报错
    • 使用gcc 编译的版本: 19.02的版本
    • DPDK原理简介

DPDK简介

DPDK(Data Plane Development Kit),数据平面开发套件. 它是由6WIND,Intel等多家公司开发,主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。同时也是一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。

DPDK安装编译

官网下载最新版本21.11

下面展示一些 内联代码片

链接: [link](https://core.dpdk.org/download/).


DPDK 21.11.0 	2021 November 26 	58660bbbe9e95abce86e47692b196555
DPDK 21.08.0 	2021 August 8 	de33433a1806280996a0ecbe66e3642f

最新的dpdk是2021 年 11月 26日发布的,笔者使用的是Ubuntu20.04.2 镜像。

**:dpdk从20.02版本后默认不编译igb_uio.ko
更改config/common_base的 CONFIG_RTE_EAL_IGB_UIO=y 可以实现编译。
使用usertool中的编译工具重新编译,加载igb_uio驱动。

并且自从 dpdk-stable-20.11.1版本发现,原来默认make方式构建已经没有了;变成了meson & ninja组合,建速度提升了不少,但同时也有一些问题。

官网编译方法 meson+ninja

下面展示一些 内联代码片

https://core.dpdk.org/doc/quick-start/

Extract sources

  tar xf dpdk.tar.gz
  cd dpdk

Build libraries, drivers and test applications.

  meson build
  ninja -C build

To include the examples as part of the build, replace the meson command with:

  meson -Dexamples=all build

Reserve huge pages memory.

  mkdir -p /dev/hugepages
  mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages
  echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

Run poll-mode driver test (with a cable between ports).

  build/app/dpdk-testpmd -c7 --vdev=net_pcap0,iface=eth0 --vdev=net_pcap1,iface=eth1 --
                  -i --nb-cores=2 --nb-ports=2 --total-num-mbufs=2048

  testpmd> show port stats all

  ######################## NIC statistics for port 0  ########################
  RX-packets: 0          RX-errors: 0         RX-bytes: 0
  TX-packets: 0          TX-errors: 0         TX-bytes: 0
  ############################################################################

  ######################## NIC statistics for port 1  ########################
  RX-packets: 0          RX-errors: 0         RX-bytes: 0
  TX-packets: 0          TX-errors: 0         TX-bytes: 0
  ############################################################################

  testpmd> start tx_first

  testpmd> stop

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 2377688        RX-dropped: 0             RX-total: 2377688
  TX-packets: 2007009        TX-dropped: 0             TX-total: 2007009
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 2006977        RX-dropped: 0             RX-total: 2006977
  TX-packets: 2377720        TX-dropped: 0             TX-total: 2377720
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 4384665        RX-dropped: 0             RX-total: 4384665
  TX-packets: 4384729        TX-dropped: 0             TX-total: 4384729
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  

过程中出现的报错

1. No module named elftools please:pip install pyelftools
   sudo apt-get install python-pyelftools python3-pyelftools -y

2. config/x86/meson.build:28:6: ERROR: Could not get define '__SSE4_2__'
   
   
   bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
   bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

   问答网站: 
   https://stackoverflow.com/questions/41293077/how-to-compile-tensorflow-with-sse4-2-and-avx-instructions

使用gcc 编译的版本: 19.02的版本


1.	获取dpdk源码。
http://core.dpdk.org/download/   选择版本下载。我下载的是19.02的版本。下载解压后,假设目录是/home/dpdk-19.02,进入该目录
2.	设置巨页HugePages
(巨页相关概念参考https://yq.aliyun.com/articles/566115?spm=5176.10695662.1996646101.searchclickresult.2d1f7121dDjXum)
HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以提高内存的整体性能
3.	设置环境变量,主要是来编译测试程序
export RTE_SDK=
export RTE_TARTGET=x86_64-native-linuxapp-gcc
4.	编译dpdk
make config T=x86_64-native-linuxapp-gcc
sed -ri 's,(PMD_PCAP=).*,\1y,' build/.config
make
5.	安装编译生成的dpdk驱动
在/home/dpdk-19.02目录下会有x86_64-native-linuxapp-gcc这个目录,进入该目录下的kmod文件夹,会有生成的网卡驱动。然后执行modprobe uio,insmod igb_uio.ko,insmod rte_kni.ko.完成dpdk驱动的安装。

DPDK原理简介

(1)内核协议栈的数据转发性能瓶颈是什么?
在 x86 体系结构中,接受数据包的传统方式是 CPU 中断方式,即网卡驱动接收到数据包后通过中断通知 CPU 处理,然后由 CPU 拷贝数据并交给内核协议栈。在数据量大时,这种方式会产生大量 CPU 中断,导致 CPU 无法运行其他程序。
内核协议栈的数据转发流程:
在这里插入图片描述

内核协议栈的数据转发性能瓶颈有:

• 硬件中断导致的线程/进程切换:硬件中断请求会抢占优先级较低的软件中断,频繁到达的硬件中断和软中断意味着频繁的线程切换,随着而来的就是运行模式切换、上下文切换、线程调度器负载、高速缓存缺失(Cache Missing)、多核缓存共享数据同步、竞争锁等一系列的 CPU 性能损耗。
• 内存拷贝:网卡驱动位于内核态,网络驱动接收到的数据包后会经过内核协议栈的处理,然后再拷贝到处于用户态的应用层缓冲区,这样的数据拷贝是很耗时间的。据统计,这个拷贝的时间会占数据包处理流程时间的 57.1%。
• 多处理器平台的 CPU 漂移:一个数据包可能中断在 CPU0,内核态处理在 CPU1,用户态处理在 CPU2,这样跨多个物理核(Core)的处理,导致了大量的 CPU Cache Miss,造成局部性失效。如果是 NUMA 架构,还会出现跨 NUMA remote access Memory 的情况,这些都极大地影响了 CPU 性能。
• 缓存失效:传统服务器大多采用页式虚拟存储器,内存页默认为 4K 的小页,所以在存储空间较大的处理机上会存在大量的页面映射条目。同时因为 TLB 缓存空间有限,最终导致了 TLB 快表的映射条目频繁变更,产生大量的快页表 Cache Miss。
故此,对应的优化方案为:
• 使用 NUMA 亲和:避免 CPU 跨 NUMA 访问内存。
• 使用 CPU 绑核:避免跨 CPU 的线程/进程切换。
• 使用大页内存:避免 TLB Cache Miss。
• 使用 DPDK:内核旁路技术避免了频繁的硬件中断和无效数据拷贝。
(2)DPDK 完全内核旁路技术实现
DPDK(Data Plane Development Kit,数据平面开发套件)是一个开源的、快速处理数据平面数据包转发的开发平台及接口。运行于 Intel x86 与 ARM 平台上,最新版本也开始支持 PowerPC。
英特尔在 2010 年启动了对 DPDK 技术的开源化进程,于当年 9 月通过 BSD 开源许可协议正式发布源代码软件包,并于 2014 年 4 月在 www.dpdk.org 上正式成立了独立的开源社区平台,为开发者提供支持。开源社区的参与者们大幅推进了 DPDK 的技术创新和快速演进,而今它已发展成为 SDN 和 NFV 的一项关键技术。
DPDK 提供了一个用户态的高效数据包处理库函数,它通过环境抽象层、内核旁路协议栈、轮询模式的报文无中断收发、优化内存/缓冲区/队列管理、基于网卡多队列和流识别的负载均衡等多项技术,实现了在 x86 处理器架构下的高性能报文转发能力,用户可以在 Linux 用户态开发各类高速转发应用,也适合与各类商业化的数据平面加速解决方案进行集成。简而言之,DPDK 重载了网卡驱动,将数据包的控制平面和数据平面分离,驱动在收到数据包后不再硬中断通知 CPU,而是让数据包通过内核旁路的协议栈绕过了 Linux 内核协议栈,并通过零拷贝技术存入内存,这时应用层的程序就可以通过 DPDK 提供的接口读取数据包。
DPDK 数据包处理流程:
Ubuntu20.04 上学习DPDk21.11_第1张图片
这种处理方式节省了 CPU 中断时间、内存拷贝时间,并向应用层提供了简单易行且高效的数据包处理接口函数,使得网络应用的开发更加方便。但同时,由于需要重载网卡驱动,因此该开发包目前只能用在部分采用 Intel 网络处理芯片的网卡设备中。DPDK 支持的网卡列表:https://core.dpdk.org/supported/,主流使用 Intel 82599(光口)和 Intel x540(电口)。DPDK 可以将数据包处理性能最多提高十倍。在单个英特尔至强处理器上获得超过 80 Mbps 的吞吐量,在双处理器配置中则可将该其提高一倍。

(3)DPDK 实现原理
Ubuntu20.04 上学习DPDk21.11_第2张图片

• 内核协议栈(左边):网卡 -> 驱动 -> 协议栈 -> Socket 接口 -> 业务。
• DPDK 基于 UIO(User Space I/O)的内核旁路(右边):网卡 -> DPDK 轮询模式-> DPDK 基础库 -> 业务。
NOTE:说 DPDK 依赖网卡设备不如说 DPDK 依赖的是网卡设备对应的驱动程序。支持 DPDK 的 NIC Kernel Driver 可以转换为 UIO Driver 模式。由此,如有需要,DPDK 实际上是可以在虚拟机上使用的,只要虚拟机的网卡驱动支持 DPDK PMD 模式,例如:e1000。
(4)UIO Framework,DPDK 的基石
传统的收发数据包方式,首先网卡通过中断方式通知内核协议栈对数据包进行处理,内核协议栈先会对数据包进行合法性进行必要的校验,然后判断数据包目标是否为本机的 Socket,满足条件则会将数据包拷贝一份向上递交到用户态 Socket 来处理。不仅处理路径冗长,还需要从内核到应用层的一次拷贝过程。
为了使得网卡驱动(e.g. PMD Driver)运行在用户态,实现内核旁路。Linux 提供了 UIO(User Space I/O)机制。使用 UIO 可以通过 read() 感知中断,通过 mmap() 实现和网卡设备的通讯。
简单来说,UIO 是用户态的一种 I/O 技术,DPDK 能够绕过内核协议栈,提供了用户态 PMD Driver 的支持,根本上是得益于 UIO 技术。DPDK 架构在 Linux 内核中安装了 IGB_UIO(igb_uio.ko 和 kni.ko.IGB_UIO)模块,以此借助 UIO 技术来截获中断,并重设中断回调行为,从而绕过内核协议栈后续的处理流程。并且 IGB_UIO 会在内核初始化的过程中将网卡硬件寄存器映射到用户态。
UIO 的实现机制是:对用户态暴露文件接口。当注册一个 UIO 设备 uioX 时,就会出现系统文件 /dev/uioX,对该文件的读写就是对网卡设备内存的读写。除此之外,对网卡设备的控制还可以通过 /sys/class/uio 下的各个文件的读写来完成。如下图:
Ubuntu20.04 上学习DPDk21.11_第3张图片

此外,DPDK 还在用户态实现了一套精巧的内存池技术,内核态和用户态之间的的内存交互不进行拷贝,只做控制权转移。这样,当收发数据包时,就减少了内存拷贝的开销。
(5)DPDK UIO
综上,DPDK 基于 Linux Kernel 的 UIO 框架完成了其自身的 UIO 实现。DPDK UIO 实现主要分为用户态(DPDK PMD)与内核态(igb_uio)两个部分。用户态部分实现真正的数据转发业务处理,内核态部分主要是接管硬件资源提供给用户态部分使用。
Ubuntu20.04 上学习DPDk21.11_第4张图片

我们可以将整个 DPDK UIO 的框架分了四层:

  1. 用户层
  2. 接口层
  3. 内核层
  4. 硬件层
    网卡开始是与 e1000 等原生的网卡驱动绑定,当用户层程序执行解绑以及绑定命令,通过 sysfs 将消息发送至内核层后,网卡与 igb_uio 驱动进行了绑定。此时内核层 UIO 接管了网卡,并为用户层 PMD 提供了服务接口。

小白,更加深层次学习ing …

你可能感兴趣的:(环境安装,网络,wireshark,linux)