nxp l3fwd测试


难度 中等

dpdk层三转发。

核心网(x86机器)使用pktgen发包到nxpls2160(arm机器),nxp通过dpdk l3fwd进行转发。

网络拓扑图如下:

转发使用不同的网口,分为:

  • 前传
  • 后传

具体步骤分为两步:

  • 核心网(x86)跑pktgen
  • nxp(arm)跑l3fwd

核心网

核心网使用pktgen生成包进行发送。

pktgen

pktgen是一个位于linux内核层的高性能网络测试工具,主要用来测试网络驱动与网卡设备,支持多线程,能够产生随机mac地址、IP地址、UDP端口号的数据包。

pktgen基于dpdk开发,在进行发包时,需要使用dpdk。

执行步骤

  1. 准备工具板;

  2. 编译dpdk;

  3. 编译pktgen;

  4. 配置dpdk;

    modprobe uio
    cd dpdk-17.08/x86_64-native-linuxapp-gcc/kmod/
    insmod igb_uio.ko
    #设置大页
    echo 2048 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
    cd usertools
    #绑定前先down掉网卡
    ifconfig eno4 down
    #绑定网卡,可以用下面的b5:00.2 (./dpdk-devbind.py –status
    #可以查到),也可以用网卡名字eno4
    ./dpdk-devbind.py -b  igb_uio  b5:00.2
    #查看网卡状态
    ./dpdk-devbind.py –status
    #绑定成功会显示b5:00.2被DPDK接管
    #换成普通驱动
    ./dpdk-devbind.py -b i40e 0000:b5:00.2
    ifconfig eno4 121.168.1.13
  5. 配置pktgen;

  6. 执行pktgen;

    cd /home/liubin/new2/pktgen-dpdk-pktgen-3.4.2
    ./app/x86_64-native-linuxapp-gcc/pktgen -c 0x31 --socket-mem 2048 -n 2 -- -P -m [4:5].0 -s 0:5gc.pcap -T --crc-strip
    
    ./app/x86_64-native-linuxapp-gcc/pktgen -c 0xe0000 --socket-mem 2048 -n 2 -- -P -m [18:19].0 -s 0:5gc.pcap -T --crc-strip
    ./app/x86_64-native-linuxapp-gcc/pktgen -c 0xe0000 --socket-mem 2048 -n 2 -- -P -m [18:19].1 -s 1:5gc.pcap -T --crc-strip
    # -c cpu core mask
    # -m [18:19].1 18core用来做rx,19core用来作tx,使用dpdk的port1
    # -s 1:5gc.pcap 使用port1来回放5gc.pcap
    #启动发包
    >> str
    #停止发包
    >> stp
    #设置端口0按线速的99%发包
    >> set 0 rate 99% 
  7. pktgen参数说明

nxp

nxp使用l3fwd进行转发,l3fwd是dpdk提供的三层转发example。

执行步骤

  1. 准备工具板;

    • 管理口
    10.252.6.2 root root
    • cpu1
    ssh root@172.168.1.12
    • cpu2
    ssh root@114.168.1.12
  2. 编译dpdk;

    • not support kni
    # 打包代码上传
    scp dpdk-18.11.1-rc2.zip duanyingshou@10.252.0.19:/home/duanyingshou/dpdk/
    # 拷贝arm64-dpaa-linuxapp-gcc到dpdk目录下
    cp /home/xiaotao/dpdk-18.11.1-rc2/arm64-dpaa-linuxapp-gcc ./ -R
    # 解压缩
    unzip dpdk-18.11.1-rc2.zip
    # 交叉编译,使用dpaa2
    export CROSS=aarch64-linux-gnu-
    make config T=arm64-dpaa2-linuxapp-gcc
    make T=arm64-dpaa2-linuxapp-gcc -j 4 CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n install 
    export RTE_TARGET=arm64-dpaa2-linuxapp-gcc
    export RTE_SDK= <path/to/DPDK/source/code>
    make -C examples/l3fwd
    # 交叉编译,使用dpaa
    export CROSS=aarch64-linux-gnu-
    make config T=arm64-dpaa-linuxapp-gcc
    make T=arm64-dpaa-linuxapp-gcc -j 4 CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n install 
    • support kni
    export CROSS=aarch64-linux-gnu-
    make config T=arm64-dpaa2-linuxapp-gcc
    export RTE_KERNELDIR=/home/duanyingshou/linux
    make T=arm64-dpaa2-linuxapp-gcc CONFIG_RTE_KNI_KMOD=y CONFIG_RTE_EAL_IGB_UIO=n install  -j 32
    make examples T=arm64-dpaa2-linuxapp-gcc
  3. 编译l3fwd;

    • nxp
    export RTE_TARGET=arm64-dpaa2-linuxapp-gcc
    export RTE_SDK= <path/to/DPDK/source/code>
    make -C examples/l3fwd
    • x86
    export RTE_TARGET=x86_64-native-linuxapp-gcc
    export RTE_SDK= <path/to/DPDK/source/code>
    make -C examples/l3fwd
  4. 上传程序

    nxp已包含dpdk驱动,因而只需上传如下文件:

    • dpdk应用

      • l3fwd
      • pktgen
      • testpmd
      • ……
    • dpaa2

      • dynamic_dpl.sh
      • destroy_dynamic_dpl.sh

      如上两个文件用来对网卡进行驱动切换,类似于x86下的dpdk-devbind脚本。

  5. 配置dpdk;

    • 激活网卡

      默认网卡是down的状态,需要使用ifconfig配置ip激活。

      ifconfig eth3 121.168.1.12
      ifconfig eth4 121.168.1.11
      #网卡up较慢,可以在另一端使用ping快速激活网卡
      ping 121.168.1.12

      注意:必须先激活网卡,不然后续运行l3fwd时会出现port 0 link down。

    • 切换dpdk驱动

    # 根据实际情况来确定使用哪张网卡
    ./dpaa2/dynamic_dpl.sh dpmac.4
    export DPRC="dprc.2"

    注意:运行前需要导出环境变量 export DPRC=”dprc.2”

  6. 配置执行l3fwd;

    ./l3fwd -c 0x3 -n 4 -- -P -p 0x3 --config="(0,0,1)"
    ./l3fwd -c 0x3 -n 4 -- -P -p 0x1 --config="(0,0,1)"
    ./l3fwd -c 0x100000 -n 4 -- -P -p 0x1 --config="(0,0,20)"
    # -c cpu coremask,需转换为二进制,每一位代表一个核,bit位为1表示使用该核
    # -n 开启的通道数
    # -P 全部转发
    # -p port mask,可以使用的port,需转换为二进制,每一位代表一个核,bit位为1表示使用该port
    # --config="(0,0,1)"Map queue 0 from port 0 to lcore 1
  7. 统计丢包率;

    # 查看网口收发包情况
    restool dpmac info dpmac.4

    对比两端rx、tx。

结果

  • 开始

开始流量情况如下:

  • 2分钟

  • 10分钟

    10分钟时并未出现转发错误。

  • 20分钟

20分钟内总共有5个包转发出错,共丢失53个包。

丢包原因分析

我们的实测过程中,pktgen发送的都是大包。

由上面的图分析可知:

  1. 网络中存在杂包,即65-127字节的包;
  2. pktgen发送和接收包个数不相等,无法确认丢包是在哪个环节,需进行两端对比排查;

经过对比发现,启动pktgen的命令使用的核会被其他程序抢占,导致cpu切换。在执行时,绑定其他程序不使用的核可避免丢包。

使用如下命令执行pktgen时,将使用0核执行pktgen管理程序,4核进行发包,5核进行收包;

./app/x86_64-native-linuxapp-gcc/pktgen -c 0x31 --socket-mem 2048 -n 2 -- -P -m [4:5].0 -s 0:5gc.pcap -T --crc-strip

在实际机器上运行时,pktgen的rx和tx并非独占:

更换成如下命令,pktgen将使用17核执行pktgen管理程序,18核进行发包,19核进行收包;

./app/x86_64-native-linuxapp-gcc/pktgen -c 0xe0000 --socket-mem 2048 -n 2 -- -P -m [18:19].0 -s 0:5gc.pcap -T --crc-strip

在执行程序时,需留意现有cpu核的使用情况,尽量使程序独占核,避免与其他系统上的程序发送调度。

无丢包结果

10min时无丢包,情况如下图:

23min时无丢包,情况如下图:

以上为使用cpu-A跑的结果,达到线速,无丢包。

使用cpu-B同样达到线速,无丢包。17分钟结果如下:

24分钟结果如下:

杂包定位

nxp端存在杂包,为110字节大小。通过抓包发现,杂包为LLDP报文,每30秒发送一次。在测试时若出现丢包,该类报文对分析杂包会存在较大干扰。

  • LLDP

链路层发现协议(Link Layer Discovery Protocol,LLDP)是一种数据链路层协议。

网络设备可以通过在本地网络中发送LLDPDU(Link Layer Discovery Protocol Data Unit)来通告其他设备自身的状态。是一种能够使网络中的设备互相发现并通告状态、交互信息的协议。

杂包情况如下:

通过对比mac地址可发现确实为nxp端发出的报文,如下图:

LLDP报文来源

阅读nxp用户手册发现:

The DPAA2 Ethernet driver supports enabling PFC for a subset of the traffic classes. This configuration is done using a higher
level protocol, LLDP - Link Layer Discovery Protocol.

dpaa2支持LLDP协议。

There’s a current known limitation for PFC to work only with DPNIs created using the DPL. DPNIs created with restool will not
behave as expected.

使用DPL方式创建DPNI时默认会启用PFC,即LLDP协议。使用restool创建DPNI不会启用RFC。

结论

  • 核心网到nxp能达到线速,且零丢包

  • nxp端启动l3fwd会每30秒发送LLDP报文,会对测试进行干扰(丢包情况下)

  • cpu-A和cpu-B均达到线速,且无丢包

思考

  • nxp网口从down状态到up状态所需时间较长,后续需留意
  • nxp板已包含dpdk驱动,用户态无法看到dpdk相关实现,后续也需留意

文章作者: growdu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 growdu !
  目录
分类导航
随笔3 AI29 计算机基础13 算法1 博客搭建7 ChatGPT2 集群63 计算机通信1 数据库59 数据库深入93 数据库93 Docker11 DPDK26 编辑工具4 Elasticsearch4 FAQ1 Go Web1 hometown2 编程语言16 人生11 网络9 Linux38 OPC1 openGauss4 页面12 PostgreSQL54 程序员自我修养1 协议11 stock1 存储5 成长之路1 工具20 视频作品1 VPP18 Vue13 Web1 代码示例11 BenchmarkSQL1 PostgreSQL 源码修炼之路14
最热文章
1
PostgreSQL 逻辑复制全链路:以一个真实事务为例,从 `INSERT` 到 `apply` 的源码级旅程
数据库🔥 2162
2
PostgreSQL 逻辑复制 Stream 执行逻辑源码级拆解:从 reorderbuffer 触发到订阅端落盘回放
数据库🔥 1765
3
PostgreSQL 行锁机制源码级深度拆解:4 种锁模式 + xmax + MultiXact 的完整链路
数据库🔥 1656
4
PostgreSQL reorderbuffer.c 函数级源码全集:5615 行 / 95 个函数的逐函数解析
数据库深入🔥 1650
5
PostgreSQL 目录快照源码级深度拆解:系统表读取的 MVCC 真相与失效机制
数据库🔥 1604
6
13 逻辑复制深入
数据库深入🔥 1570
7
0 Postgresql存储、索引及系统优化、主备切换
PostgreSQL🔥 1495
8
PostgreSQL 读一行数据源码级深度拆解:MVCC 在每个环节的落点
数据库🔥 1464
9
PostgreSQL WAL 记录类型完全指南:21 个 RMGR × 80+ 种记录的源码级拆解
数据库🔥 1431
10
一文读懂openguass dcf网络模块
集群🔥 1420
11
PostgreSQL 元数据存储机制:从磁盘文件到内存缓存,`pg_class` 撑起的整个系统表体系
数据库🔥 1411
12
openGauss 并行解码设计原理深度拆解:reader + 多 worker + CSN 三层架构的源码级剖析
数据库深入🔥 1344
13
逻辑复制源码分析
数据库深入🔥 1327
14
PostgreSQL 逻辑复制:catalog 改动、可见性判定与 xmin/xmax 推进全景
数据库深入🔥 1317
15
自托管服务全家桶:从原文方案到可复制实操手册
人生🔥 1278
16
PostgreSQL CREATE_REPLICATION_SLOT 端到端源码分析:从 SQL 到 snapbuild 状态机的完整链路(每个函数每个参数)
数据库深入🔥 1277
17
PostgreSQL syscache 模块源码深度拆解:CatCache 数据结构、LRU 哈希表、cache invalidation 全链路
数据库深入🔥 1216
18
PostgreSQL 18 内核数据结构全景:RangeVar 与 20+ 个核心数据结构源码级拆解
数据库🔥 1158
19
PostgreSQL 逻辑复制里 `RUNNING_XACTS` 写入机制与快照 `xmin / xmax / xip` 的演化:源码级深度拆解
数据库🔥 1119
20
PostgreSQL 分区表:从一行 `PARTITION BY` 到路由热路径的全链路拆解
数据库🔥 1094