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: 需要在物理机上部署,至少需要两张网卡】
- 获取源码包并解压
官网地址:DPDK
tar xf dpdk-20.11.6.tar.xz
cd dpdk-stable-20.11.6
- 安装依赖
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
- 编译
cd dpdk-stable-20.11.6
meson build
ninja -C build
ninja -C build install
- 配置安装路径
默认安装在/usr/local/lib64目录下,所以需要创建/etc/ld.so.conf.d/dpdk.conf
并且把该路径写入配置文件中;
echo /usr/local/lib64 > /etc/ld.so.conf.d/dpdk.conf
- 配置环境变量
执行一下命令查看libdpdk.pc:
pkg-config --variable $pc_path pkg-config
如果不存在,添加一下环境变量:
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
然后执行一下命令reload
ldconfig
执行一下命令进行查看
pkg-config --modversion libdpdk
- 设置大页内存
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 操作
- 安装部署dpdk
- 加载驱动
插入后使用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 网卡名
先将网卡端口设置down,然后执行以下命令绑定DPDK网卡:
dpdk-devbind.py -b uio_pci_generice 0000:03:00.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