一、安装Mellanox MT28908驱动mlx5及其依赖的外部组件
使用Mellanox OFED直接安装:
Mellanox OFED下载
下载时需要选择自己所用 OS和 CPU架构对应的版本,下载压缩包版本,解压进入
如果版本完全匹配,执行下面这个命令就可以安装成功:
$ sudo ./mlnxofedinstall --dpdk
如遇到内核版本不匹配,就还需要加一个参数:
$ sudo ./mlnxofedinstall --add-kernel-support --dpdk
安装完毕执行:重新加载驱动
sudo /etc/init.d/openibd restart
确认相关依赖都安装成功:
$ pkg-config --modversion libibverbs
$ pkg-config --modversion libmlx5
$ lsmod |egrep "^mlx5_core|^mlx5_ib|^ib_uverbs"
mlx5_ib 3211264 0
ib_uverbs 1097728 1 mlx5_ib
mlx5_core 10534912 1 mlx5_ib
$ ibv_devinfo
二、修改Mellanox MT28908为ETHERNET模式
在安装完驱动后,网卡默认模式为ib,可通过
$ ibv_devinfo
来查看网卡模式,要使用dpdk,要求网卡模式为ETH,需要修改网卡模式,否则dpdk无法使用网卡,报错:
eval ......cannot use
安装MFT工具
Mellanox Firmware Tools (MFT) (nvidia.com)
我下的版本是4.22.1 LTS Linux DEB x64
ar xvf mft-4.22.1-11-x86_64-deb.tgz
cd mft-4.22.1-11-x86_64-deb
sudo bash install.sh
sudo mst start
将设备切换到ETH模式
sudo mlxconfig -d /dev/mst/mt4119_pciconf0 set LINK_TYPE_P1=2 LINK_TYPE_P2=2
重启设备
sudo reboot
再次查看网卡模式
$ ibv_devinfo
hca_id: mlx5_0
transport: InfiniBand (0)
fw_ver: 20.31.1014
node_guid: 88e9:a4ff:ff38:5b08
sys_image_guid: 88e9:a4ff:ff38:5b08
vendor_id: 0x02c9
vendor_part_id: 4123
hw_ver: 0x0
board_id: HPE0000000036
phys_port_cnt: 1
port: 1
state: PORT_DOWN (1)
max_mtu: 4096 (5)
active_mtu: 1024 (3)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet
hca_id: mlx5_1
transport: InfiniBand (0)
fw_ver: 20.31.1014
node_guid: 88e9:a4ff:ff38:5b09
sys_image_guid: 88e9:a4ff:ff38:5b08
vendor_id: 0x02c9
vendor_part_id: 4123
hw_ver: 0x0
board_id: HPE0000000036
phys_port_cnt: 1
port: 1
state: PORT_DOWN (1)
max_mtu: 4096 (5)
active_mtu: 1024 (3)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet
三、搭建dpdk环境
1、工具安装:
GCC
sudo apt install build-essential
gcc --version
ninja
pip3 install meson ninja
numa依赖
sudo apt-get install libnuma-dev
2、开启设置HUGE
1.查看宿主机中内存页的大小
通常情况下,内存页大小为4KB。
getconf PAGESIZE
4096
2.查看宿主机中透明大页是否开启
cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
3.开启透明大页
echo always > /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
4.查看宿主机中HugePage的大小
cat /proc/meminfo |grep -i HugePages
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
HugePages_Total: Hugepage的页面数量
HugePages_Free: 剩余的页面数量
HugePages_Rsvd: 被分配预留但是还没有使用的page数目
HugePages_Surp:HugePages_Total减去/proc/sys/vm/nr_hugepages中的值
5.挂载大页
内存只有被挂载了之后,才能被应用程序使用。到刚创建的huge目录下,挂载hugetlbfs文件系统。
sudo mount -t hugetlbfs nodev /mnt/huge
mount |tail -1
//nodev on /mnt/huge type hugetlbfs (rw,relatime,pagesize=2M)
6.使用sysctl(sysctl命令用于设置和显示在/proc/sys目录中的内核参数)命令设置vm.nr_hugepages,将大页个数设置为200(200 * 2M=400M,需要确保宿主机有足够可以分配的内存)。
这里具体大小设置依据自己需要的大小
sudo sysctl vm.nr_hugepages=200
//vm.nr_hugepages = 200
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 200
HugePages_Free: 200
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
7.大页内存挂载
mkdir /mnt/huge
sudo mount -t hugetlbfs pagesize=1GB /mnt/huge
通过在/etc/fstab文件中添加以下行,可以使挂载点在重新引导期间永久存在:
sudo vim /etc/fstab
//大页大小为1GB
nodev /mnt/huge hugetlbfs pagesize=1GB 0 0
//大页大小为2MB
nodev /mnt/huge hugetlbfs defaults 0 0
8、在引导文件grub中添加:
sudo gedit /etc/default/grub
在GRUB_CMDLINE_LINUX=“ ”,“ ”中添加
GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=10 intel_idle.max_cstate=0 processor.max_cstate=0 intel_pstate=disable rcu_nocb_poll audit=0 nosoftlockup"
sudo update-grub
reboot
3、安装DPDK
tar xJf dpdk-20.11.1.tar.xz
cd dpdk-stable-20.11.1
meson build
cd build
ninja
//[2415/2415] Linking target app/test/dpdk-test
sudo ninja install
sudo ldconfig
如需绑定网卡到dpdk,即更换网卡的驱动,以igb_uio为例
在uio文件夹中启用uio
sudo modprobe uio
sudo insmod igb_uio.ko
sudo ./usertools/dpdk-devbind.py --bind=igb_uio 0000:07:00.0
Mellanox网卡不需要绑定到dpdk上,使用的就是mlx5驱动,可以直接识别dpdk,绑到dpdk上以后反而无法使用网卡。
运行helloworld实例
make
./helloworld
sudo ./helloworld