DPDK AF_XDP

AF_XDP 是 kernel v4.18+ 新加入的一个协议族(如AF_INET), 主要使用 XDP 实现(下图是 XDP 的基本原理图). 核心原理是在 kernel NAPI poll 位置(网卡驱动内部实现, 为内核最早RX数据包位置)运行 BPF 程序, 通过不断调用 poll 方法, 最终将数据包送到正确的XDP程序处理.

XDP 支持 3 种工作模式:

  • Native XDP -运行在网卡驱动实现的 poll 函数中, 需网卡驱动支持;
  • Offloaded XDP - 可将 XDP 程序 offload 到网卡硬件中, 需要网卡硬件支持(Netronome);
  • Generic XDP - 网卡驱动不支持XDP, XDP 作为默认网络路径加载到内核并运行在 receive_skb 函数中, 这种模式达不到Native & Offload XDP 相同性能, 自 kernel 4.12 以后就可以加载运行, 适合用于测试XDP;

注: kernel 版本越高, 支持 XDP 的网卡型号越多, 建议尽量使用新版kernel.

DPDK AF_XDP PMD

DPDK 自 19.05 版本已添加AF_XDP pmd.

DPDK AF_XDP PMD 环境要求:

组件&特性 最低要求
mini kernel version > v4.18
libbpf kernel > v5.1-rc4
need_wakeup kerner > v5.3-rc1
PMD zero copy kernel > v5.4-rc1
shared_umem kernel > v5.10 & libbpf > 0.2.0
32-bit kernel > 5.4
busy polling kernel > 5.11

注: AF_XDP PMD 不支持 RX/TX Offload & Link Status Interrupt.

pmd Options

iface - 关联网卡名称(必选项);
start_queue - 关联网卡起始队列id(可选项-默认0);
queue_count - 关联网卡队列数量(可选项-默认1);
shared_umem - 是否启用UMEM(可选项-默认0);
xdp_prog - 自定义xdp程序(可选项-默认无-none);
busy_budget - busy polling budget(可选项-默认64);

MTU

Shared UMEM

--vdev net_af_xdp0,iface=enp5s0f0,shared_umem=1

Preferred Busy Polling

SO_PREFER_BUSY_POLL 是 kernel v5.11 的新加入特性. 据说可提升单核高负载流量下的处理性能. 当启用SO_PREFER_BUSY_POLL后, 调度到软中断 NAPI 上下文执行napi_poll检查到设置此标识, 则立即退出. 避免 busy-polling进程超出调度时间片后与NAPI调度频繁切换, 与SO_BUSY_POLL 相比减少了 NAPI 上下文调度, 提高了收包性能.
AF_XDP pmd 默认会自动开启此特性, 可通过 busy_budget=0 关闭.

--vdev net_af_xdp0,iface=enp5s0f0,busy_budget=0

busy_budget 为一个kernel 尝试在 netdev NAPI 上下文与busy polling进程中处理数据包的数量, 默认值为64, 可尝试增大此值.
AF_XDP pmd 默认会自动开启此特性, 可通过 busy_budget=0 关闭.

--vdev net_af_xdp0,iface=enp5s0f0,busy_budget=0

busy_budget 为一个kernel 尝试在 netdev NAPI 上下文中处理数据包的数量, 默认值为64, 可尝试增大此值.

强烈推荐设置以下参数获取最佳性能:

echo 2 | sudo tee /sys/class/net/enp5s0f0/napi_defer_hard_irqs
echo 200000 | sudo tee /sys/class/net/enp5s0f0/gro_flush_timeout

libbpf

https://github.com/libbpf/libbpf

git clone https://github.com/libbpf/libbpf
cd libbpf/src
make PREFIX=/usr install

注:
也可直接使用kernel源代码下 <kernel src tree>/tools/lib/bpf libbpf 版本.

make install_lib
make install_headers

dpdk 20.11

dnf install git rpm-build dnf-utils ninja-build meson bpftool libbpf-devel
$ export PKG_CONFIG_PATH=/mnt/ramfs/extra/rdma-core-devel-50mlnx1-1.50218.x86_64/usr/lib64/pkgconfig
$ CC=clang meson \-Dmax_lcores=64 \-Dmachine=sandybridge \-Ddisable_drivers=vpda/mlx5,net/mlx5,regex/mlx5,common/mlx5,net/dpaa,net/dpaa2,net/bnx2x,net/ark,net/atlantic,net/avp,net/axgbe,net/bnxt,net/cxgbe,net/ena,net/enetc,net/enic,net/hinic,net/hns3,net/igc,net/liquidio,net/memif,net/mlx4,net/netvsc,net/nfp,net/octeontx,net/pfe,net/qede,net/thunderx,net/txgbe \-Dexamples=l3fwd,l2fwd \-Dwerror=false \build
$ cd build
$ ninja

testpmd 示例

NIC 型号: Mellanox CX5/CX6-Dx、INTEL 82599ES

$ lspci  |grep Eth
02:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
02:00.3 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
05:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
05:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
06:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
06:00.1 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]

单队列:

$ ethtool  -L enp5s0f0  combined 1$ dpdk-20.11/build/app/dpdk-testpmd --iova-mode=va --log-level="pmd.net.af_xdp":8 --log-level="lib.eal":8 --log-level=pmd:8 \-c 0xffff -m 4096 -n 2 -r 2 --no-pci --vdev net_af_xdp0,iface=enp5s0f0 \-- -i -a --rxq=1 --txq=1 --rxd=2048 --txd=2048 --forward-mode=icmpecho

多队列:

$ ethtool  -L enp5s0f0 combined  4$ dpdk-20.11/build/app/dpdk-testpmd --log-level="pmd.net.af_xdp":8 --log-level="lib.eal":8 --log-level=pmd:8  -c 0xffff -m 4096 -n 2 -r 2 --no-pci \--vdev net_af_xdp,iface=enp5s0f0,start_queue=0,queue_count=4 \-- -i -a --rxq=4 --txq=4 --rxd=2048 --txd=2048 --nb-cores=4 \--forward-mode=icmpecho
# CX5
$ ethtool  -L enp5s0f0 combined  4
$ ethtool  -X enp5s0f0 weight 0 1 1 1
$ ethtool  -N enp5s0f0 flow-type ip4 l4proto 1 action 0
# IXGBE 只支持部分 flow-type
$ ethtool  -L enp5s0f0 combined  4
$ ethtool  -K enp5s0f0 ntuple on
$ ethtool  -N enp5s0f0 flow-type tcp4 src-ip 10.23.4.6 dst-ip 10.23.4.18 action 0
$ ethtool  -N enp5s0f0 flow-type tcp4 src-ip 192.168.10.1 dst-ip 192.168.10.2 src-port 2000 dst-port 2001 action 2 loc 33
# DROP udp
$ ethtool  -N enp5s0f0 flow-type udp4 src-ip 10.4.82.2 action -1
$ dpdk-20.11/build/app/dpdk-testpmd --iova-mode=va --log-level="pmd.net.af_xdp":8 --log-level="lib.eal":8 --log-level=pmd:8 \-c 0xffff -m 4096 -n 2 -r 2 --no-pci --vdev net_af_xdp0,iface=enp5s0f0 \-- -i -a --rxq=1 --txq=1 --rxd=2048 --txd=2048 --forward-mode=icmpecho

xdpsock

$ NETDEV=enp5s0f0
$ ethtool -N $NETDEV rx-flow-hash udp4 fn
$ ethtool -N $NETDEV flow-type udp4 src-port 4242 dst-port 4242 \action 4
bpftool map -p
samples/bpf/xdpsock -i $NETDEV -q 4 -r -N

Other

kernel AF_XDP overview
IOVisor’s XDP page
“[What Is] XDP/AF_XDP and its potential”
Cilium’s BPF and XDP reference guide - stable
Cilium’s BPF and XDP reference guide - latest
lwn.net - Introducing AF_XDP support
lwn.net - Accelerating networking with AF_XDP
Dive into BPF: a list of reading material
DPDK PMD for AF_XDP Tests
Design: Having XDP programs per RX-queue
The Cloudflare Blog - Kernel bypass
The Cloudflare Blog - Single RX queue kernel bypass in Netmap for high packet rate networking
Suricata eBPF and XDP
Scalable TCP Session Monitoring with Symmetric Receive-side Scaling
libbpf
xdp-project
xdp-tutorial
bpf-examples

DPDK AF_XDP相关推荐

  1. DPDK内存篇(二): 深入学习 IOVA

    Anatoly Burakov:英特尔软件工程师,目前在维护DPDK中的VFIO和内存子系统. "文章转载自DPDK与SPDK开源社区公众号" 目录 引言 环境抽象层(EAL)参数 ...

  2. DPDK支持的硬件:CPU、网卡NIC、加密引擎、基带加速器

    DPDK支持的硬件:CPU.网卡NIC.加密引擎.基带加速器 https://core.dpdk.org/supported/ 目录 CPUs - 处理器 NICs - 网卡 Crypto Engin ...

  3. DPDK Release 22.11

    新功能 添加了初始LoongArch架构支持. 添加了对 LoongArch 架构的 EAL 实现.在 Loongson 3A5000, Loongson 3C5000 和 Loongson 3C50 ...

  4. DPDK - 通过源码安装dpdk并运行examples (by quqi99)

    作者:张华 发表于:2021-08-11 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 前言 2016年通过源码安装过dpdk,但过时了,见: https:/ ...

  5. 五分钟看懂抓包神技:DPDK

    我是一个网络监控软件,我被开发出来的使命就是监控网络中进进出出的所有通信流量. 一直以来,我的工作都非常的出色,但是随着我监控的网络越来越庞大,网络中的通信流量也变得越来越多,我开始有些忙不过来了,逐 ...

  6. 一个高速lvs-dr替代系统设计 -- 基于dpdk的高性能负载均衡器

    # LVS DR 原理 LVS-DR不同于普通的haproxy代理机制,它在网络中的作用层级更加底层.haproxy一般代理应用层的应用数据,所有的数据都会通过haproxy收发,导致了haproxy ...

  7. 直播 | DPDK中国技术峰会2017

    时光荏苒 技术发展与创新脚步永不停息 回首过去一年 DPDK已经正式加入Linux基金会 社区发展与参与度前所未有 更多贡献者的添砖加瓦 使得网络数据面的软件创新层出不穷 为了进一步促进数据平面技术的 ...

  8. l3fwd 是什么_服务器DPDK l3fwd性能测试

    1.测试背景 由于项目中需要用到dpdk,当时在服务器平台选型上有如下2种不同配置可供选择,为了理解老的Xeon处理器和Xeon金牌处理器对DPDK转发性能的影响,需要在两台服务器上分别进行DPDK ...

  9. DPDK架构与特点(转)

    from:http://www.cnblogs.com/mylinuxer/p/4277676.html DPDK架构与特点 当年在某公司实习的时候,当时老大给了我一份DPDK的文档,说是将来很有用, ...

  10. DPDK — 安装部署(Ubuntu 18.04)

    目录 文章目录 目录 环境参数 环境依赖准备 安装 DPDK 测试 附 1:Enable pcap 环境参数 Intel x86 Ubuntu 18.04 LTS Python 3.6 DPDK 18 ...

最新文章

  1. 图像处理之噪声---椒盐,白噪声,高斯噪声三种不同噪声的区别
  2. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布
  3. SAP 常用业务数据表设计
  4. 【Linux】目录组织结构、文件类型和文件权限
  5. 【CF1179 A,B,C】Valeriy and Deque / Tolik and His Uncle / Serge and Dining Room
  6. java安装pydev找不到_为什么安装成功也重启了,但是在window-preferences里找不到PyDev...
  7. linux修改私钥的密码,linux使用密钥+密码登录ssh(centos7)
  8. 《CLR Via C# 第3版》笔记之(二十一) - 异步编程模型(APM)
  9. 问题十:【总结】解决了问题四~问题九,vec3这个类的代码应该都能看懂了
  10. 勇者斗恶龙UVa11292 - Dragon of Loowater
  11. [Data]Link cut tree
  12. 【UDS诊断服务入门】
  13. Apache安装成功,测试时无法跳出It works!页面
  14. Luogu 3332 [ZJOI2013]K大数查询
  15. hass智能 小米扫地机器人_Siri能控制小米扫地机器人吗_小米智能家居控制系统...
  16. Inno一个程序打包安装工具
  17. java8/jdk1.8 官网下载地址
  18. 干货,新手小白做影视剪辑,这样做,帮你99%避免违规侵权
  19. [NodeJS实战][Vue实战]Vue-PixiJS [开箱可用][新手极简]
  20. 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法

热门文章

  1. Java继承的基本概念及其限制(基础语法二)
  2. 使用matlab计算并绘制连续信号的傅里叶变换
  3. BZOJ1911[APIO2010] 特别行动队
  4. element-UI-tab选项卡
  5. python中测试字符串类型的函数_Python新手学习基础之数据类型——字符串类型
  6. python成员变量_Python——成员变量
  7. alter table add column多个字段_element中el-table单行暂无数据和整体暂无数据的默认修改...
  8. oracle归档日志百分比,Oracle归档日志处理
  9. static import java_Java 静态导入Static import
  10. java对某个字段排序_Java8对List集合对象某个字段进行排序