初识DPDK
背景
DPDK (Data Plane Development Kit)
DPDK最初是为了证明intel处理器能够应对高性能的网络数据包而提出的
以Linux为例子,网卡收包流程概述如下
1、网络数据包通过网线到达网卡
2、网卡通过DMA将数据写入内存
3、网卡发起中断通知CPU数据到达内存
4、驱动读取数据送到内核协议栈进行处理
5、数据拷贝到用户态
内核针对高速网络数据处理做了很多优化,比如当网络IO速度越来越快时,每次来一个数据包都发起一起中断开稍很大,所以内核做一些优化,如发起一次中断后改成轮询的方式继续收包,直到轮询不到数据包时再换中断方式,减少了中断次数,再比如数据从内核态拷贝到用户态时在使用共享内存等手段减少没必要的拷贝。linux已经作了这么多优化,是否还有进一步优化的空间呢?
40G带宽下传输64B大小的数据包需要16.8ns
CPU主频为2GHz即一个时钟周期0.5ns
如果能够在间隔33个周期(16.8/0.5)内准备好数据就可以达到满带宽
同样的1024B大小的数据包能在417个周期准备好数据可以达到满带宽
通常读取LLC (last level cache )命中需要40个周期,没命中需要140周期,主频为2GHz的处理器传输64B大小数据包不能达到满带宽,但是1024B是有可能的。
处理器的瓶颈在哪里呢?对于传输64B大小数据,瓶颈在LLC读取,对于1024B大小的数据包,瓶颈又在哪里?找到处理器的瓶颈点就知道如何进一步优化,比如读取LLC命中是40周期,不命中是140周期,优化命中率,性能将会提升一大截。
DPDK优化方法
DPDK是一套专门针对数据包处理能力的性能优化最佳实践,尽可能的最大化使用处理器的能力处理网络数据包。DPDK通过多维度(网卡、CPU、内存),多种方法(减少缓存命中、减少资源竞争)进行性能优化。总之想尽各种办法通过软件的手段提升网络数据包处理的性能。
- 通过大页增加TLB命中
- 通过NUMA感知增加内存访问速度
- 通过cache对齐减少内存访问次数
- 通过轮询+绑核减少中断次数等使得软件能快速感知数据到底
- 通过无锁数据结构减少资源竞争
- CAS等减少资源等待时间
- 多指令并行多数据并行等增加单个指令周期处理能力
- 预取等手段增加cache命中率
……
代码获取
DPDK有自己的开源社区,代码仓库可以从社区上获取,也会同步到github上
社区代码位置如下http://git.dpdk.org/
一般关注两个仓库即可
- dpdk-stable 稳定分支,一般实际生产环境使用该仓代码,该分支不会大改动,只会回合一些后续发现的bug
- dpdk-next-net 最新的代码,开发迭代一般基于该仓
最新代码下载下来的代码结构如下
- app/ 基于DPDK的应用,一些用于测试的应用,比如test-pmd测试驱动功能的、pro-info获取进程信息等
- config/ 构建配置相关,比如平台参数配置、网卡参数配置默认等
- devtols/ 开发者使用的工具,代码检查脚本等
- doc/ 文档目录,基于rst(reStructuredText)编写的官方文档
- drivers/ 驱动目录,驱动代码都在这
- examples/ DPDK示例,使用者可以参考这个目录的写法学习某项功能的用法
- lib/ 通用依赖,框架代码都在这
- usertools/ 用户常用的工具,比如设置大页的脚本dpdk-hugepages.py、绑网卡的脚本dpdk-devbind.py等
编译运行
DPDK基于meson+ninja的方式进行编译
meson build
cd build
ninja
其中example默认不编译,需要加参数,如下编译所有example
meson build -Dexamples=all
其中,编译相关参数可以通过文件根目录的文件meson_options.txt查看
通过脚本配置大页
./usertools/dpdk-hugepages.py -p 2M --setup 128
绑定网卡
./usertools/dpdk-devbind.py -s //查看可使用的网卡PDF
./usertools/dpdk-devbind.py -b vfio-pci 0000:01:00.0
执行DPDK应用
./example/hello
标签:优化,代码,网卡,初识,DPDK,数据包,dpdk
From: https://blog.csdn.net/dengdui/article/details/142440348