借图
1. 环境
root@dpdk:/home/bb# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 45 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Vendor ID: GenuineIntel
Model name: Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
CPU family: 6
Model: 165
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 8
Stepping: 5
BogoMIPS: 5808.01
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xto
pology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_l
m abm 3dnowprefetch invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsave
s arat flush_l1d arch_capabilities
Virtualization features:
Hypervisor vendor: VMware
Virtualization type: full
Caches (sum of all):
L1d: 256 KiB (8 instances)
L1i: 256 KiB (8 instances)
L2: 2 MiB (8 instances)
L3: 128 MiB (8 instances)
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-7
Vulnerabilities:
Gather data sampling: Unknown: Dependent on hypervisor status
Itlb multihit: Not affected
L1tf: Mitigation; PTE Inversion
Mds: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
Meltdown: Mitigation; PTI
Mmio stale data: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
Retbleed: Mitigation; IBRS
Spec rstack overflow: Not affected
Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Spectre v2: Mitigation; IBRS, IBPB conditional, STIBP disabled, RSB filling, PBRSB-eIBRS Not affected
Srbds: Unknown: Dependent on hypervisor status
Tsx async abort: Not affected
root@dpdk:/home/bb# driverctl -v list-devices | grep -i net
0000:02:01.0 e1000 (82545EM Gigabit Ethernet Controller (Copper) (PRO/1000 MT Single Port Adapter))
0000:02:05.0 e1000 (82545EM Gigabit Ethernet Controller (Copper) (PRO/1000 MT Single Port Adapter))
# 可以看到现在默认的网卡类型是 e1000
e1000 "一词是指计算机中使用的一种网络接口卡(NIC)。它特别与英特尔的 PRO/1000 系列网络适配器有关。在提供的示例中,"e1000 "与 Linux 错误信息和网卡配置有关。它通常用于识别网卡类型,或指示与网络连接或驱动程序类型有关的问题。
在 Linux 环境中,"e1000 "通常与英特尔的 PRO/1000 网络连接有关,可能出现在错误信息中或网卡配置过程中。在讨论网卡类型和配置的 DPDK(数据平面开发工具包)和 VMware 中也与此相关。
e1000 网卡以其兼容性和广泛使用而著称,但可能存在某些局限性,如潜在的网络性能问题。因此,有人建议将默认的 e1000 网卡修改为 VMware 中的 vmnet3 等替代选项,以改善网络性能。
e1000 "的具体含义可能因使用环境而异,但一般是指一种网络接口卡,尤其是与英特尔 PRO/1000 系列相关的网络接口卡。
2. 使用 vfio-pci 驱动
输入输出内存管理单元(IOMMU)是从用户空间安全驱动支持 DMA 的硬件所必需的,因此也是使用 VFIO 的先决条件。但并非所有系统都有 IOMMU,因此需要检查硬件是否支持 IOMMU,以及 BIOS 设置中是否启用了 IOMMU(英特尔系统上的 VT-d 或 Directed I/O 虚拟化技术)。
最后,还需要在内核中分拆启用 IOMMU。为此,在内核命令行中添加 intel_iommu=on(英特尔系统)或 amd_iommu=on(AMD 系统)。此外,建议使用 iommu=pt 选项,它可以提高主机设备的 IO 性能。
系统启动后,检查 /sys/kernel/iommu_groups/ 目录的内容。**如果该目录非空,则说明 IOMMU 设置成功。 **
要将其永久添加到内核命令行,请将其附加到 /etc/default/grub 中的 GRUB_CMDLINE_LINUX 后执行:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt default_hugepagesz=1GB hugepagesz=1G hugepages=8"
# grub2-mkconfig -o /boot/grub2/grub.cfg
# grub-mkconfig -o /boot/grub/grub.cfg
update-grub
reboot
ls -l /sys/kernel/iommu_groups/
# 这个可能不准确
查看 dmesg 确认启用 iommu
root@dpdk:/home/bb# dmesg | grep -i -e DMAR -e IOMMU
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-5.15.0-88-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro intel_iommu=on iommu=pt default_hugepagesz=1GB hugepagesz=1G hugepages=8
[ 0.071023] Kernel command line: BOOT_IMAGE=/vmlinuz-5.15.0-88-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro intel_iommu=on iommu=pt default_hugepagesz=1GB hugepagesz=1G hugepages=8
[ 0.071023] DMAR: IOMMU enabled
[ 3.746151] iommu: Default domain type: Passthrough (set via kernel command line)
/sys/kernel/iommu_groups/ 目录包含子目录,每个子目录代表一个 IOMMU 组。如果启用 IOMMU 后该目录为空,可能有以下几个原因。
IOMMU 配置:确保系统中正确配置了 IOMMU。这包括检查 BIOS/UEFI 设置以启用 IOMMU 支持,并确保正确设置内核参数以启用 IOMMU。
设备支持:验证系统中的设备是否支持 IOMMU 并正确分配到 IOMMU 组。某些设备可能不支持 IOMMU,或需要特定配置才能正确分配到 IOMMU 组。
内核参数:检查内核参数,确保 IOMMU 已正确初始化。这可能需要设置 iommu=on 或 intel_iommu=on(英特尔系统)或 amd_iommu=on(AMD 系统)内核参数。
驱动程序支持:确保 IOMMU 支持所需的驱动程序已加载并正常运行。某些设备可能需要特定的驱动程序或驱动程序配置才能与 IOMMU 协同工作。
内核版本:验证正在使用的内核版本是否支持系统中的特定 IOMMU 功能和硬件。
请务必查阅系统文档、硬件规格和相关内核文档,以确保 IOMMU 在系统上得到正确配置和支持。
/sys/kernel/iommu_groups/ 目录应包含代表 IOMMU 组的子目录,每个组都包含分配给该组的设备。如果启用 IOMMU 后,该目录仍然为空,则有必要进一步调查系统配置和硬件支持情况
root@dpdk:/home/bb/dpdk/usertools# ethtool -i ens37
driver: e1000
version: 5.15.0-88-generic
firmware-version:
expansion-rom-version:
bus-info: 0000:02:05.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
这个问题其实还是 iommu 的问题,可以使用不安全的 iommu 来绕过该问题。 但是如果真的要使用 iommu,这个绕过其实没有解决问题:
vfio-noiommu 与标准 vfio 的区别
vfio-noiommu 与标准 vfio 的主要区别在于是否支持 IOMMU(输入输出内存管理单元)。
标准 vfio:该版本的 VFIO(虚拟功能 I/O)支持 IOMMU,IOMMU 是一个将设备 I/O 地址映射到虚拟地址的硬件单元,可为设备提供内存保护和隔离。
2
.
vfio-noiommu:另一方面,vfio-noiommu 是 VFIO 的一种变体,不支持 IOMMU。当系统没有 IOMMU 或不需要 IOMMU 时,可以使用它。不过,除非必要,一般不建议启用 vfio-noiommu。
5
.
总之,vfio-noiommu 与标准 vfio 的主要区别在于是否支持 IOMMU,vfio-noiommu 用于没有 IOMMU 或不需要 IOMMU 的情况。
modprobe vfio enable_unsafe_noiommu_mode=1
echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
vfio 如果用不了,可以尝试下 igb_uio
git clone http://dpdk.org/git/dpdk-kmods
cd dpdk-kmods/linux/igb_uio/
apt install make gcc
make
modprobe uio
insmod igb_uio.ko
root@dpdk:/home/bb/dpdk-kmods/linux/igb_uio# ethtool -i ens37
driver: e1000
version: 5.15.0-88-generic
firmware-version:
expansion-rom-version:
bus-info: 0000:02:05.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
root@dpdk:/home/bb/dpdk-kmods/linux/igb_uio# driverctl set-override 0000:02:05.0 igb_uio
root@dpdk:/home/bb/dpdk-kmods/linux/igb_uio#
root@dpdk:/home/bb/dpdk-kmods/linux/igb_uio# dmesg -T | tail -n 10
[Sat Nov 18 15:18:55 2023] Started bpfilter
[Sat Nov 18 15:18:55 2023] Initializing XFRM netlink socket
[Sat Nov 18 15:35:50 2023] igb_uio: loading out-of-tree module taints kernel.
[Sat Nov 18 15:35:50 2023] igb_uio: module verification failed: signature and/or required key missing - tainting kernel
[Sat Nov 18 15:35:50 2023] igb_uio: Unknown symbol __uio_register_device (err -2)
[Sat Nov 18 15:35:50 2023] igb_uio: Unknown symbol uio_event_notify (err -2)
[Sat Nov 18 15:35:50 2023] igb_uio: Unknown symbol uio_unregister_device (err -2)
[Sat Nov 18 15:36:26 2023] igb_uio: Use MSIX interrupt by default
[Sat Nov 18 15:38:26 2023] igb_uio 0000:02:05.0: mapping 1K dma=0x114a92000 host=00000000892dc17f
[Sat Nov 18 15:38:26 2023] igb_uio 0000:02:05.0: unmapping 1K dma=0x114a92000 host=00000000892dc17f
root@dpdk:/home/bb/dpdk-kmods/linux/igb_uio#
参考 ovs-dpdk 给 vfio 权限
$ modprobe vfio-pci
$ /usr/bin/chmod a+x /dev/vfio
$ /usr/bin/chmod 0666 /dev/vfio/*
$ $DPDK_DIR/usertools/dpdk-devbind.py --bind=vfio-pci eth1
$ $DPDK_DIR/usertools/dpdk-devbind.py --status
参考: docs.openvswitch.org/en/latest/i…
参考:
1. dpdk 中的 AVX512
AVX-512在DPDK中并不是默认使用的,但可以在运行时由应用程序通过EAL API选择,也可以由用户通过命令行参数进行选择
.AVX-512在DPDK中主要用于内存复制,可以在一次传输中进行计算和复制结果,以最大化吞吐量
.AVX-512指令集在处理N维数据方面具有优势,例如64位双精度浮点矢量、32位单精度浮点矢量、64位整数矢量和32位整数矢量等
.总的来说,AVX-512在DPDK中可以提供更好的性能,特别是在处理大规模数据、AI计算、图像/音视频处理、数据分析、科学计算、数据加密和压缩等密集型计算应用场景中
.
2. igb_uio 对比 uio_pci_generic
igb_uio 和 uio_pci_generic 的比较
igb_uio 和 uio_pci_generic 都是 DPDK(数据平面开发工具包)中的内核模块,用于将网络接口卡(NIC)绑定到用户空间驱动程序。下面是根据现有信息对两者进行的比较:
IGB_UIO
支持 VF(虚拟功能)设备:igb_uio 支持在主机上创建 VF 设备,因此适用于需要 VF 设备的情况
DPDK 中的使用:igb_uio 在 DPDK 中一直用于将特定网卡绑定到用户空间驱动程序中。
uio_pci_generic
VF 设备支持:与 igb_uio 不同,uio_pci_generic 不支持创建 VF 设备。
DPDK 中的用法:对于缺乏传统中断的设备,如缺乏 VF 虚拟函数的设备,uio_pci_generic 可用于替代 igb_uio。
总之,igb_uio 适用于需要 VF 设备支持的情况,而 uio_pci_generic 可用于缺乏传统中断的设备。在 DPDK 中,这两个模块都用于将网卡绑定到用户空间驱动程序。
需要注意的是,igb_uio 和 uio_pci_generic 之间的选择取决于网络接口卡的具体要求和当前的使用情况。