2.4 基于dpdk的用户态协议栈的实现

操作系统Posix API所提供的网络接口,数据收发是基于用户态与内核态的频繁切换实现。而dpdk实现了绕过内核监管,直接在用户态访问网络硬件,避免频繁状态切换。

DPDK安装与配置

虚拟机环境配置

  • 检查是否支持多队列网卡 cat /proc/interrupts | grep ens33(获取整个机器的终端),               结果 19: 42 0 212 0 IO-APIC 19-fasteoi ens33,不支持多队列网卡。
  • 虚拟机关机,修改文件 .vmx文件,找到 ethernet0.virtualDev = "e1000",把 e1000 改成 vmxnet3,并添加 ethernet0.wakeOnPcktRcv = "TRUE"
  • Hugepage(大页/巨页)
  • 进入 sudo vim /etc/default/grub 在 GRUB_CMDLINE_LINUX= 后 增加三个配置 default_hugepagesz=1G hugepagesz=2M hugepages=1024
  • 然后虚拟机重启 sudo update-grub

用dpdk实现收取数据

环境搭建


DPDK源码下载:

core.dpdk.org/download/选择 19.08版本下载
进入dpdk/usertools/dpdk-setup.sh编译DPDK环境变量(只需要编译一次) :

如果不需要修改源码,选择 [36] x86_64-native-linuxapp-gcc
如果需要修改源码,选择 [39] x86_64-native-linux-gcc
如果出现报错:ERROR: Target does not have the DPDk uIo Kernel Module。To fix, please try to rebuild target.的解决方法:
设置环境变量1:export RTE_SDK=/home/king/share/dpdk/dpdk-stable-19.08.2/
设置环境变量2:export RTE_TARGET=x86_64-native-linux-gcc


设置Linux环境变量:

[43] Insert IGB UIO module
[44] Insert VFIO module
[45] Insert KNI module
[46] Setup hugepage mappings for non-NUMA systems
[47] Setup hugepage mappings for NUMA systems
[48] Display current Ethernet/Baseband/Crypto device settings
[49] Bind Ethernet/Baseband/Crypto device to IGB UIO module

  • [43] Insert IGB UIO module

        功能:IGB UIO(Intel Gigabit Ethernet Userspace I/O)模块是一种用户空间输入 / 输出驱动模块。它允许绕过内核网络栈,直接在用户空间对网卡进行操作。在 DPDK(Data Plane Development Kit )中使用该模块,能使应用程序更高效地处理网络数据包,减少内核态和用户态之间的切换开销,提升数据包处理性能和吞吐量 。比如在高并发的网络服务器场景下,可让 DPDK 应用直接快速地与网卡交互。

  • [44] Insert VFIO module

        功能:VFIO(Virtual Function I/O)是一种用于设备虚拟化的框架。插入 VFIO 模块后,可支持将物理设备(如网卡)以更灵活的方式分配给虚拟机或用户空间应用程序。在 DPDK 环境中,它能实现对设备的高效隔离和共享,方便在多租户或虚拟化场景下,让不同的应用或虚拟机安全、独立地使用设备资源,增强系统的灵活性和资源利用率 。

  • [45] Insert KNI module

        功能:KNI(Kernel NIC Interface)模块提供了一种在 DPDK 应用和内核网络栈之间建立接口的方式。它允许 DPDK 处理后的数据包能够与内核网络栈进行交互,比如将经过 DPDK 处理的数据包发送到内核网络栈进行进一步的处理(如防火墙规则检查、路由等),或者从内核网络栈接收数据包进行 DPDK 层面的处理。这在一些需要结合用户态高性能处理和内核态网络功能的场景中很有用 。

  • [46] Setup hugepage mappings for non-NUMA systems 这里大页输入512

        功能:大页(hugepage)是一种内存分页机制,相比普通的 4KB 页,大页通常为 2MB 或 1GB。对于非 NUMA(Non-Uniform Memory Access,非统一内存访问架构 )系统,设置大页映射可减少内存页表项数量,降低 CPU 在内存地址转换时的开销,提高内存访问效率。在 DPDK 这种对内存读写频繁的场景下,使用大页能显著提升应用性能,减少内存管理的开销 。

  • [47] Setup hugepage mappings for NUMA systems这里大页输入512

        功能:NUMA 系统中,不同的 CPU 节点访问内存的速度不同。为 NUMA 系统设置大页映射,除了能享受类似非 NUMA 系统中减少页表项、提升内存访问效率的好处外,还能更好地结合 NUMA 架构特性,让每个 CPU 节点更高效地访问本地内存,进一步优化内存访问性能,使 DPDK 应用在 NUMA 架构的服务器上能充分发挥硬件优势,提升整体性能 。

  • [48] Display current Ethernet/Baseband/Crypto device settings这一步不用执行

        功能:该选项用于显示当前以太网设备、基带设备以及加密设备的相关设置信息。比如网卡的工作模式(全双工、半双工等)、速率、MAC 地址,基带设备的参数配置,加密设备的算法、密钥等设置情况。通过查看这些信息,用户可以了解设备当前的运行状态,判断是否符合 DPDK 应用的需求,以便进行相应的调整和优化 。

  • [49] Bind Ethernet/Baseband/Crypto device to IGB UIO module这里选择 eth0对应的pci码 0000:03:00.0,注意需要先 sudo ifconfig eth0 do

你可能感兴趣的:(高性能网络设计专栏,开发语言,网络)