DPDK安装指导

1. 介绍

Intel 提供的数据平面开发工具集,为Intel architecture(IA) 处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不同于Linux系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。DPDK的优势在于,可以将用户态的数据,不经过内核直接转发到网卡,实现加速目的。
官网文档:
http://doc.dpdk.org/guides-20.11/linux_gsg/intro.html

2. DPDK关键技术点

(1)DPDK使用大页缓存支持来提高内存访问效率。
(2)利用UIO支持,提供应用空间下驱动程序的支持,也就是说网卡驱动是运行在用户空间的,减少了报文在用户空间和应用空间的多次拷贝。
(3)利用LINUX亲和性支持,把控制面线程及各个数据面线程绑定到不同的CPU核,节省了线程在各个CPU核来回调度。
(4)LOCKLESS,提供无锁环形缓存管理,加快内存访问效率。
(5)收发包批处理,多个收发包集中到一个cacheline,在内存池中实现,无需反复申请和释放。
(6)PMD驱动,用户态轮询驱动,可以减小上下文切换开销,方便实现虚拟机和主机零拷贝。

3. DPDK安装部署

【Note: 需要在物理机上部署,至少需要两张网卡】

  1. 获取源码包并解压
    官网地址:DPDK

wget http://fast.dpdk.org/rel/dpdk-20.11.6.tar.xz

tar xf dpdk-20.11.6.tar.xz

cd dpdk-stable-20.11.6

  1. 安装依赖

dnf install tar python-devel net-tools pciutils numactl numactl-devel libpcap-devel python3 gcc gcc-c++ emacs-filesystem vim-filesystem libhugetlbfs meson python-pyelftools

  1. 编译

cd dpdk-stable-20.11.6
meson build
ninja -C build
ninja -C build install

  1. 配置安装路径
    默认安装在/usr/local/lib64目录下,所以需要创建/etc/ld.so.conf.d/dpdk.conf
    并且把该路径写入配置文件中;

echo /usr/local/lib64 > /etc/ld.so.conf.d/dpdk.conf

  1. 配置环境变量
    执行一下命令查看libdpdk.pc:

pkg-config --variable $pc_path pkg-config

如果不存在,添加一下环境变量:

export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
然后执行一下命令reload

ldconfig

执行一下命令进行查看

pkg-config --modversion libdpdk

  1. 设置大页内存
    NUMA机器需要设置每个node的hugepage

mkdir -p /dev/hugepages
chmod 777 /dev/hugepages

mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages

echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

4. DPDK 操作

  1. 安装部署dpdk
  2. 加载驱动
    插入后使用ifconfig 查看网卡端口,网卡端口可能会消失,因为安装驱动以后,网卡归该驱动管理了。

modprobe uio

modprobe uio_pci_generic

注意:uio_pci_generic模块不支持创建虚拟函数。对于一些不支持传统中断的设备,例如虚拟功能(VF)设备,可能需要igb_uio模块来代替uio_pci_generic

insmod /usr/lib/modules/4.19.90-2011.4.0.0048.oe1.x86_64/extra/dpdk/igb_uio.ko


3. 绑定DPDK网卡
执行以下命令查看网卡型号和信息:

ethtool -i 网卡名

image

先将网卡端口设置down,然后执行以下命令绑定DPDK网卡:

dpdk-devbind.py -b uio_pci_generice 0000:03:00.1

  1. 解绑DPDK网卡
    执行以下命令解绑DPDK网卡:

dpdk-devbind.py -u 0000:03:00.1


使用这种方式解绑的网卡会放到other里,无法正常使用,因此解绑后,需要重新绑回原来的驱动:

dpdk-devbind.py -b igb 0000:03:00.1

参考命令

#查看网卡原始驱动类型
[root@localhost ~]# ethtool -i ens37 | grep driver
driver: e1000

#查看网卡对应的bus-info值
[root@localhost ~]# ethtool -i ens37 | grep bus-info
bus-info: 0000:02:05.0

#查看网卡对应的传输速率(千兆or万兆)
[root@localhost ~]# ethtool ens37 | grep Speed
Speed: 1000Mb/s

[root@localhost ~]# ethtool en5s0 | grep Speed
Speed: 10000Mb/s

#查看网卡对应的NUMA节点
[root@localhost ~]# ethtool -i ens37 | grep bus-info
bus-info: 0000:02:05.0
[root@localhost ~]# cat /sys/bus/pci/devices/0000:02:05.0/numa_node
0

Agenda

1.给NUMA节点配置内存大业失败

if ninja fails, run “ninja reconfigure” or “meson --reconfigure” to force Meson to reconfigure.

2.执行示例程序提示没有挂载对应的大页:

mount -t hugetlbfs none /mnt/huge_2M -o pagesize=2MB
使用以下命令查看挂载的大页:
mount | grep huge

3.Cannot create lock on ‘/var/run/dpdk/rte/config’.
is another primary process running?

/dpdk-helloworld -l 0-1 -n 2 --proc-type=auto

4.DPDK is running on a NUMA system, but is compiled without NUMA support.

在编译DPDK前安装numa相关的软件包:
dnf install numactl numactl-devel
numactl --show 进行查看

5.找不到so文件,例如报错如下:
EAL:libret_common_octeontx.so.20.0: cannot open shared object file: No such file or directory?

echo “/usr/local/lib64” >> /etc/ld.so.conf.d/dpdk.conf
ldconfig

6.No available hugepages reported in hugepages-1015246KB

系统没有分配1G的大页
mount -t hugetlbfs none /dev/hugepages -o pagesize=1GB

7.查看网卡在哪个node上,以及对应的cpu核

lspci -vvv | grep -A 10 “b1:00.0”


numactl -H

8.执行dpdk提供的example应用程序

(1) 进行example目录编译对应的应用程序

cd example/helloworld && meson configure-Dexample=helloworld
cd /dpdk/build && ninja

(2) 挂载2M大页:

mount -t hugetlbfs none /mnt/huge_2M -o pagesize=2MB
./examples/dpdk-helloworld -l 0-3 -n 4

(3) 编译之后进行test

$RTE_TARGE/app/test -c 1f -n 4
RTE >> ? # 查看help信息
RTE >> reources_test # 进行对应的测试

(4) 使用testpmd:

export DESTDIR=/usr/src/dpdk-19.11
export RTE_TARGET=x86_64-native-linuxapp-gcc
make -j install T=x86_64-native-linuxapp-gcc
./x86_64-native-linuxapp-gcc/app/testpmd -l 0-3 -n 4 – -i

(5) ice驱动的网卡绑卡后dpdk-testpmd初始化失败
AL: Probe PCI driver: net_ice (8086:159b) device: 0000:03:00.0 (socket 0)
ice_dev_init(): Failed to initialize HW
EAL: Requested device 0000:03:00.0 cannot be used
EAL: Bus (pci) probe failed.
TELEMETRY: No legacy callbacks, legacy socket not created
testpmd: No probed ethernet devices
解决办法:
cd /lib/firmware/intel/ice/ddp
ln -s ice-1.3.26.0.pkg ice.pkg
重启testpmd

2 个赞

ninja -C build这步执行失败
{standard input}:22608: Error: reg pair must start from even reg at operand 1 – `caspal x23,x24,x23,x24,[x3]