DPDK-22.11.2 [二] 使用建议和注意事项

驱动

建议使用vfio-pci,依赖系统的vfio

igb_uio从DPDK v20.02开始禁止编译。可以通过CONFIG_RTE_EAL_IGB_UIO打开编译。igb_uio计划迁移到其他项目。

uio_pci_generic是linux系统提供的,不支持virtual function (VF)。

如果想支持virtual function (VF),请使用igb_uio,依赖系统的uio

由于igb_uio不安全,提供了vfio,更安全,功能更多。

如果BIOS开启了UEFI,就无法使用UIO。

vfio需要条件

  • Linux kernel大于3.6.0
  • BIOS支持IO virtualization(IO虚拟技术),比如Intel® VT-d

如果使用uio_pci_generic或者igb_uio,需要关闭IOMMU或者设置passthrough。使用vfio-pci需要打开IOMMU

在grub中配置是否开启iommu

  • iommu.passthrough=0 arm64架构关闭iommu
  • iommu.passthrough=1 arm64架构开启iommu
  • intel_iommu=off intel架构关闭iommu
  • amd_iommu=off amd架构关闭iommu
  • intel_iommu=on iommu=pt intel架构开启iommu,使用pt

https://doc.dpdk.org/guides-20.05/linux_gsg/linux_drivers.html

大页内存

linux大页内存只有2MB和1GB。如果支持1GB,建议使用1GB。

1GB大页内存不建议动态创建,需要增加到grub开启创建。

但是如果是有多个numa,设置在grub中的大页内存会被平分到每个numa node上。这是我们不想看到的。也可以增加一个开机启动脚本,配置大页内存到指定的node上。

查看支持哪种大页内存

#如果有对应信息,则支持2MB
cat /proc/cpuinfo|grep pse

#如果有对应信息,则支持1GB
cat /proc/cpuinfo|grep pdpe1gb

grub配置大页内存

编辑/etc/default/grub

GRUB_CMDLINE_LINUX一行增加default_hugepagesz=1G hugepagesz=1G hugepages=4

更新grub

RHEL系列

grub2-mkconfig -o /boot/grub2/grub.cfg

Debian系列

Update-grub

动态配置大页内存

为node1的1GB大页,配置4个

echo 4 > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages

为系统分配1GB大页内存8个,具体分配到哪个numa node,由系统自己决定。如果内存足够,会平分

echo 8 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages

手动挂载大页内存

mkdir /mnt/huge创建挂载目录
mount -t hugetlbfs nodev /mnt/huge挂载大页内存

默认是挂载2M的大页,如果配置的是1GB的大页,需要指定挂载大页内存的pagesize:mount -t hugetlbfs nodev /mnt/huge -o pagesize=1GB

自动挂载大页内存

编辑/etc/fstab,增加nodev /mnt/huge hugetlbfs pagesize=1GB 0 0

网卡 numa node

网卡与内存一样,会被分配到不同的numa node上,可以通过lspci -nnks 0000:84:00.0 -v查看。
DPDK程序绑定的内核所在的numa node,分配的大页内存所在的numa node与网卡所在的numa node,建议一致,最大化提高性能。

总结

如果是64位系统,或者CPU支持1GB大页,那么就使用1GB大页。

虽然有的系统在运行时创建1GB大页可能不支持,但是我们也只能在脚本中设置1GB大页,不能在grub中配置。因为在grub中不能指定把大页内存分配在哪个numa node,导致内存浪费。之所以不建议在运行时分配1GB大页,是因为太大,可能在运行时分配,系统没有那么多连续的内存了。所以可以在系统启动时,增加开机运行脚本配置。

如果不能在grub配置大页,那么也不能在fstab中自动挂载。建议写入到配置大页的同一脚本中。

1GB大页mount需要指定pagesize,不然会遇到EAL: 4 hugepages of size 1073741824 reserved, but no mounted hugetlbfs found for that size,配置了1GB大页,mount完成,还是提示找不到,因为mount的是2MB的大页,不匹配。

https://edc.intel.com/content/www/us/en/design/products/ethernet/config-guide-e810-dpdk/hugepages-setup/
https://doc.dpdk.org/guides/linux_gsg/sys_reqs.html

工具类库

pkgconf

Python 3.6 or later

Meson and ninja

pip3 install meson ninja

ninja

虽然ninja -jxx可以指定xx个job并行执行,理论上更快,但是试用下来,好像没有默认不加-j参数速度好。

pyelftools

Centos
pip3 install pyelftools

Ubuntu/Debian
apt install python3-pyelftools

支持NUMA

numactl-devel in RHEL/Fedora
libnuma-dev in Debian/Ubuntu

https://doc.dpdk.org/guides/linux_gsg/sys_reqs.html

关闭ptype解析

在dpdk19开始,增加了过滤接收数据包的功能。可以设定接收指定类型数据包。如果不需要这个功能,调用如下api关闭ptype,不然可能会出现一张网卡,两个网口同时接收数据,运行一段时间后,无法接收到数据的问题。

rte_eth_dev_set_ptypes(portid, RTE_PTYPE_UNKNOWN, NULL, 0);
int rte_eth_dev_set_ptypes 	( 	uint16_t  	port_id,
		uint32_t  	ptype_mask,
		uint32_t *  	set_ptypes,
		unsigned int  	num 
	)

port_id——要设置的网口id
ptype_mask——要设置的接收数据的类型,按位设置,多个数据类型使用与运算一起设置。
set_ptypes——一个数组,用来保存设置了哪些类型。也就是虽然指定了接收过滤哪些数据,也可能不支持,这里会返回成功设置的类型。最后一个类型是RTE_PTYPE_UNKNOWN,表示结束了。这个数组由用户提供,具体数据最大长度,也就是可以支持的类型,由rte_eth_dev_get_supported_ptypes()获得,但是数组大小还要加上1,因为最后一个元素需要设置为RTE_PTYPE_UNKNOWN
num——数组的长度

专有名词

  • port/network port——表示网卡,或者网口
posted @ 2023-08-16 12:49  秋来叶黄  阅读(1021)  评论(0编辑  收藏  举报