目录

  • 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 sourcestar xf dpdk.tar.gzcd dpdkBuild libraries, drivers and test applications.meson buildninja -C buildTo include the examples as part of the build, replace the meson command with:meson -Dexamples=all buildReserve huge pages memory.mkdir -p /dev/hugepagesmountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepagesecho 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepagesRun 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=2048testpmd> show port stats all######################## NIC statistics for port 0  ########################RX-packets: 0          RX-errors: 0         RX-bytes: 0TX-packets: 0          TX-errors: 0         TX-bytes: 0#################################################################################################### NIC statistics for port 1  ########################RX-packets: 0          RX-errors: 0         RX-bytes: 0TX-packets: 0          TX-errors: 0         TX-bytes: 0############################################################################testpmd> start tx_firsttestpmd> stop---------------------- Forward statistics for port 0  ----------------------RX-packets: 2377688        RX-dropped: 0             RX-total: 2377688TX-packets: 2007009        TX-dropped: 0             TX-total: 2007009-------------------------------------------------------------------------------------------------- Forward statistics for port 1  ----------------------RX-packets: 2006977        RX-dropped: 0             RX-total: 2006977TX-packets: 2377720        TX-dropped: 0             TX-total: 2377720----------------------------------------------------------------------------+++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++RX-packets: 4384665        RX-dropped: 0             RX-total: 4384665TX-packets: 4384729        TX-dropped: 0             TX-total: 4384729++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

过程中出现的报错

1. No module named elftools please:pip install pyelftoolssudo apt-get install python-pyelftools python3-pyelftools -y2. 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_packagebazel 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=<dpdk目录>
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 数据包处理流程:

这种处理方式节省了 CPU 中断时间、内存拷贝时间,并向应用层提供了简单易行且高效的数据包处理接口函数,使得网络应用的开发更加方便。但同时,由于需要重载网卡驱动,因此该开发包目前只能用在部分采用 Intel 网络处理芯片的网卡设备中。DPDK 支持的网卡列表:https://core.dpdk.org/supported/,主流使用 Intel 82599(光口)和 Intel x540(电口)。DPDK 可以将数据包处理性能最多提高十倍。在单个英特尔至强处理器上获得超过 80 Mbps 的吞吐量,在双处理器配置中则可将该其提高一倍。

(3)DPDK 实现原理

• 内核协议栈(左边):网卡 -> 驱动 -> 协议栈 -> 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 下的各个文件的读写来完成。如下图:

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

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

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

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

Ubuntu20.04 上学习DPDk21.11相关推荐

  1. linux ubuntu 安装git服务器,[linux] Ubuntu20.04上安装搭建私有Git服务器Gitea

    [linux] Ubuntu20.04上安装搭建私有Git服务器Gitea [linux] Ubuntu20.04上安装搭建私有Git服务器Gitea Gitea 是相比于gitlab更加轻量化,而且 ...

  2. ubuntu20.04上安装和使用frp内网穿透的方法

    ubuntu20.04上安装和使用frp内网穿透的方法 第一步:下载frp软件 frp_0.36.2_linux_amd64.tar.gz 下载地址:https://download.csdn.net ...

  3. 【OpenStack】在ubuntu20.04上部署openstack(Ussuri版)

    在ubuntu20.04上部署openstack(Ussuri版) 文章目录 在ubuntu20.04上部署openstack(Ussuri版) 一.在虚拟机上安装的网络配置(服务器看二) 二.在服务 ...

  4. Ubuntu20.04上安装部署Elasticsearch

    一.背景 在我们开发ElasticSearch相关功能的时候,想要本机部署一个ElasticSearch服务.想采用apt-get install 的方式来安装.本文在Ubuntu20.04上安装部署 ...

  5. 在Ubuntu20.04上安装二进制ros2 foxy

    在Ubuntu20.04上安装二进制ros2 foxy 设置语言环境的支持,确保支持UTF-8 sudo locale-gen en_US en_US.UTF-8 sudo update-locale ...

  6. 5G模块RM500U-CN在ubuntu20.04上的驱动安装

    5GRM500U-CN在ubuntu20.04上的驱动安装 简述 问题发现 问题的解决 续集 简述 记录在ubuntu20.04上安装RM500U-CN驱动的过程 问题发现 将5g模块接入USB接口后 ...

  7. 在Ubuntu20.04上安装MySQL8.0及正确配置[已验证]

    在Ubuntu20.04上安装MySQL8.0及正确配置[已验证] 安装MySQL 验证 登陆MySQL 创建db 解决workbench连接的问题 小结 常用操作 如何新增用户 对新增的用户更改加密 ...

  8. win10上和Ubuntu20.04上制作Gif图

    一.说明 Gif文件,是一个极其生动的图片表达方法:它具有时具有很好的渲染效果(如图1),使人耳目一新:有时能使抽象事物具体化(如图2). 图1  数据的渲染效果 图2  抽象的杠杆机械 因此,能生成 ...

  9. Ubuntu20.04上部署 Hyperledger Fabric2.3

    Ubuntu20.04上部署 Hyperledger Fabric2.3.1 一.安装Git 二.安装CURL 三.安装Docker 四.安装GO 五.安装fabric 六.下载配置文件与镜像 七.测 ...

最新文章

  1. @echo off是什么意思_参加CHANEL私享派对是什么体验?Lanvin头一次在中国办大秀??「每周时报」...
  2. leangoo怎么导入导出,归档和删除看板?
  3. xib与nib的区别
  4. 基于keepalived对redis做高可用配置---转载
  5. fzu - Problem 1759 Super A^B mod C
  6. Azure 6 月新公布
  7. 同步IO、异步IO、阻塞IO、非阻塞IO、复用IO
  8. java高级编程期末考试题_java高级编程考题
  9. 学习opencv3_如何高效学习计算机视觉?
  10. linux ssd hdd 缓存,ArchLinux 部署 SSD 缓存
  11. 数据挖掘原理与算法 K-Means算法
  12. 必备技能:IDEA一定要懂的30条快捷键
  13. 新手建站推广完美教程(重点推荐)
  14. 网站支付宝登录授权具体实现
  15. php抢票程序,python并发编程多进程 模拟抢票实现过程
  16. 教你百度网盘文件转阿里云
  17. 何恺明新作来了!更快更有效的训练FLIP
  18. 贪心搜索(greedy search)、集束搜索(beam search)、随机采样(random sample)
  19. JavaScript 时间范围
  20. 【自学笔记】尚硅谷数据结构与算法Chapter 1 数据结构与算法概述

热门文章

  1. 湖北实现企业电子印章全域覆盖,君子签提升企业开办服务水平
  2. 韦东山衔接班——1.1_u-boot分析之编译体验
  3. 谣言检测文献阅读四—Reply-Aided Detection of Misinformation via Bayesian Deep Learning
  4. OpenWrt路由器上的LuCI模块开发
  5. 从IC设计业看中国企业之发展
  6. “耳聪目明”的智慧工地到底该怎么搭建,最全面的智慧工地解决方案一看就懂
  7. centos web 访问mysql_centos7 ---搭建mysql主从并用zabbix监控主从状态web实现报警(
  8. to rebuild shanty areas 棚户区改造生活英语English
  9. 一起自学SLAM算法:4.3 相机
  10. java获取图片像素点RPG值并计算不同颜色的占比