DPDK由Intel开发,在用户态处理数据包,采用轮询方式取代传统的中断方式从网卡接收数据。由于intel只提供到ip层的协议栈,没有提供开发人员熟悉的操作系统提供的开发TCP/UDP协议的Socket,给应用开发带来很大的困难。F-Stack是腾讯基于dpdk开发的一套用户态协议栈,目前已经开源。F-Stack 使用纯 C 实现,在DPDK之上封装了FreeBSD 用户态协议栈、Posix API、微线程框架,使绝大部分的网络应用可以通过直接修改配置或替换系统的网络接口即可接入 F-Stack,或者通过修改事件处理方式,从而获得更高的网络性能。
F-Stack在Intel网卡环境很少遇到问题,但在Mellanox(麦洛斯)网卡(NIVDIA芯片)时候会遇到不少问题,F-Stack官方讨论很少。本文总结笔者在使用Mellanox网卡部署F-Stack应用的过程,供F-Stack使用者参考。
1 部署环境
操作系统:CentOs7.9
内核:4.18.0-3.0.el7.x86_64
网卡:Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
# lspci|grep Ether
17:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
17:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
98:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
98:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
F-STACK选择版本:v1.22 (使用dpdk 20.11.6版)
2 部署过程
2.1 环境准备
(1)内核开发包安装
#rpm -ivh kernel-devel-4.18.0-3.0.el7.x86_64.rpm
查看内核开发版本:
# rpm -q kernel-devel
注:一定要确认内核和内核开发包是相同版本,小版本也要一致。
(2)依赖包安装
下面是笔者服务器安装的依赖包。
#yum install python-devel redhat-rpm-config rpm-build gcc libtool -y
#yum install -y createrepo
#yum install gcc-gfortran fuse-libs tcsh tk –y
#yum install libnl3 libnl3-devel –y
注:其他依赖包按实际需要再装,缺少的话驱动安装过程会提示。
2.2 Mellanox驱动安装
2.2.1 驱动下载
https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/
选择合适的版本下载。
4.18.0-3.0.el7.x86_64有俩版本可用(其他的版本未尝试过):
- MLNX_OFED_LINUX-5.5-1.0.3.2-rhel7.9-x86_64
- MLNX_OFED_LINUX-5.6-2.0.9.0-rhel7.9-x86_64
2.2.2 驱动安装
(1)先解压
#tar -zxvf MLNX_OFED_LINUX-5.6-2.0.9.0-rhel7.9-x86_64.tgz
#cd MLNX_OFED_LINUX-5.6-2.0.9.0-rhel7.9-x86_64
(2)首先确认内核是否在支持版本里
#cat .supported_kernels //查看此安装包支持的内核版本
(3)如果本机内核在支持的版本里,继续安装
# ./mlnxofedinstall --upstream-libs –dpdk
安装时间较长,中间有提示输入“Y/N”,输入“Y”即可。
最后提示如下,表示驱动装完:
You may need to update your initramfs before next boot. to that, run:
dracut -f
To load the new driver, run: /etc/init.d/openibd restart
(4)如果本机内核不在支持版本里,要先生成支持本机内核安装包
#./mlnx_add_kernel_support.sh -k 4.18.0-3.0.el7.x86_64 -m /home/houguanghua/MLNX_OFED_LINUX-5.6-2.0.9.0-rhel7.9-x86_64 -v
运行完,在/tmp下生成新的MLNX_OFED_LINUX-5.6-2.0.9.0-rhel7.9-x86_64.tgz
在/tmp下重复步骤(3)即可。
(5)升级网卡固件
#dracut -f (大约半分钟,无任何提示)
(6)重启网卡
#/etc/init.d/openibd restart
这个命令只在安装时候运行一次。有的服务器会出现不能远程登录情形。
2.2.3 驱动验证
- 检查网卡固件版本:
# ibv_devinfo |grep fw_ver
# ibv_devinfo |grep fw_ver
fw_ver: 14.32.1010
fw_ver: 14.32.1010
fw_ver: 14.32.1010
fw_ver: 14.32.1010
- 驱动版本安装好
# lsmod |egrep "^mlx5_core|^mlx5_ib|^ib_uverbs"
# lsmod |egrep "^mlx5_core|^mlx5_ib|^ib_uverbs"
mlx5_ib 442368 4
mlx5_core 1900544 1 mlx5_ib
ib_uverbs 155648 14 rdma_ucm,mlx5_ib
2.2.4 驱动安装问题
(1)安装过程提示固件升级失败
Failed to update Firmware.
See /tmp/MLNX_OFED?LINIX.24660.logs/fw_update.log
可以不搭理
(2)如果本机内核不在支持版本里
最好找到直接支持本机内核版本的驱动,笔者曾尝试过,未成功。
(3)/etc/init.d/openibd restart 运行后服务器不能远程登录
可能原因较多,笔者服务器是因为出口网卡配置子接口,重启后缺省网关丢失了。
重启网卡后重启网络就没问题了。
#/etc/init.d/openibd restart && systemctl restart network
2.3 DPDK安装
2.3.1 安装
F-Stack使用较高版本的DPDK。首先查看dpdk版本:
#export PKG_CONFIG_PATH=/usr/lib64:/lib64:/usr/local/lib64:/usr/lib64/pkgconfig: /usr/local/lib64/pkgconfig
# pkg-config --modversion libdpdk-libs
# pkg-config --modversion libdpdk-libs
20.11.6
进入dpdk目录后,
# meson -Dibverbs_link=dlopen -Denable_kmods=true build
//若需要编译示例软件 -Dexamples=all
# ninja -C build install
2.3.2 验证
安装完,验证下是否可用。
#cd build/examples/
#./dpk-hellowdorld -l 0-3 -n 4
如下显示表示dpdk可用。
# ./dpdk-helloworld -l 0-3 -n 4
EAL: Detected 112 lcore(s)
EAL: Detected 2 NUMA nodes
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:17:00.0 (socket 0)
mlx5_pci: No available register for Sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:17:00.1 (socket 0)
mlx5_pci: No available register for Sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:98:00.0 (socket 1)
mlx5_pci: No available register for Sampler.
EAL: Probe PCI driver: mlx5_pci (15b3:1015) device: 0000:98:00.1 (socket 1)
mlx5_pci: No available register for Sampler.
EAL: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 2
hello from core 0
hello from core 3
2.3.3 问题
(1)运行出现:“No probed ethernet devices”
intel网卡不会出现这问题,其他网卡检查驱动是否安装正确。大概率是驱动安装有问题。
另,内存不够用也会报这个错。
2.4 F-Stack安装
和正常安装没啥两样。
#export FF_PATH=/tmp/src/unbound/fstack
#export PKG_CONFIG_PATH=/usr/lib64:/lib64:/usr/local/lib64:/usr/lib64/pkgconfig:/usr/local/lib64/pkgconfig
#make
#make install
安装工具
#cd ../tools
#make
#make install
2.5 应用编译和运行
2.5.1 编译选项
链接库选项增加两个:-libverbs -lmlx5
2.5.2 运行前环境准备
(1)加载内核模块
#modprobe -a ib_uverbs mlx5_core mlx5_ib
不必加载uio and igb_uio
(2)大页内存
#dpdk-hugepages.py --setup 2G
或
#echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages/nr_hugepages
(3)Kni加载
#insmod /usr/lib/modules/4.18.0-3.0.el7.x86_64/extra/dpdk/rte_kni.ko
igb_uio.ko不用加载
2.5.3 helloworld示例
helloword在f-stack的example目录下。
Makefile修改如下:
LIBS+= $(shell $(PKGCONF) --static --libs libdpdk)
LIBS+= -L${FF_PATH}/lib -Wl,--whole-archive,-lfstack,--no-whole-archive
LIBS+= -Wl,--no-whole-archive -libverbs -lmlx5 -lrt -lm -ldl -lcrypto -pthread -lnuma
配置文件/etc/f-stack.conf修改如下:
[port0]
addr=59.49.8.41
netmask=255.255.255.192
broadcast=59.49.8.63
gateway=59.49.8.1
if_name=ens5f0
注:网卡名要配置。
运行helloworld
#./helloworld --conf /etc/f-stack.conf --proc-type=primary
运行结果如下所示,表示正常了。
# ./helloworld --conf /etc/f-stack.conf --proc-type=primary
......
Checking link statusdone
Port 0 Link Up - speed 25000 Mbps - full-duplex
link_elf_lookup_symbol: missing symbol hash table
link_elf_lookup_symbol: missing symbol hash table
Timecounters tick every 10.000 msec
WARNING: Adding ifaddrs to all fibs has been turned off by default. Consider tuning net.add_addr_allfibs if needed
Attempting to load tcp_bbr
tcp_bbr is now available
TCP Hpts created 1 swi interrupt threads and bound 0 to cpus
Timecounter "ff_clock" frequency 100 Hz quality 1
TCP_ratelimit: Is now initialized
ens5f0: No addr6 config found.
ens5f0: Ethernet address: 30:b9:30:04:e7:82
3 总结
Mellanox网卡部署F-STACK过程比较复杂,主要注意事项总结如下:
- 网卡不要卸载到用户态
- 驱动版本要选择好,最好是下载直接支持本机内核的驱动
未尽事宜:
- Kni如何使用
- vip验证
- Ecmp负载均衡
后续会继续验证Mellanox网卡F-Stack使用方法,还会研究下如何生成F-Stack应用的docker镜像。有进展会继续分享,也欢迎大家共同探讨。