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架构关闭iommuiommu.passthrough=1
arm64架构开启iommuintel_iommu=off
intel架构关闭iommuamd_iommu=off
amd架构关闭iommuintel_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——表示网卡,或者网口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏