飞凌嵌入式今年6月推出的——FET1043A-C核心板,采用NXP公司的QorIQ® LS1043A处理器设计,拥有四颗ARMv8-A架构的Cortex-A53核,主频1.6G,低功耗,高能效。四通道高达10GB的SerDes包含多种灵活配置,在飞凌设计的配套底板中最大程度上发挥了QorIQ® LS1043A 处理器网络性能,采用一个万兆,六个千兆的设计,配合处理器内部的DPAA1加速引擎,再加上2GB大容量DDR4内存简直就是网络性能怪兽。 硬件如此的优秀,那么传统的Linux内核还是否与其门当户对?答案是否定的。 原因有以下几个方面: ❶ 中断处理。当网络中大量数据包到来时,会产生频繁的硬件中断请求,这些硬件中断可以打断之前较低优先级的软中断或者系统调用的执行过程,如果这种打断频繁的话,将会产生较高的性能开销。 ❷ 内存拷贝。正常情况下,一个网络数据包从网卡到应用程序需要经过如下的过程:数据从网卡通过DMA等方式传到内核开辟的缓冲区,然后从内核空间拷贝到用户态空间,在Linux内核协议栈中,这个耗时操作甚至占到了数据包整个处理流程的57.1%。 ❸ 上下文切换。频繁到达的硬件中断和软中断都可能随时抢占系统调用的运行,这会产生大量的上下文切换开销。另外,在基于多线程的服务器设计框架中,线程间的调度也会产生频繁的上下文切换开销,同样,锁竞争的耗能也是一个非常严重的问题。 ❹ 局部性失效。如今主流的处理器都是多个核心的,这意味着一个数据包的处理可能跨多个CPU 核心,比如一个数据包可能中断在cpu0,内核态处理在cpu1,用户态处理在cpu2,这样跨多个核心,容易造成CPU 缓存失效,造成局部性失效。如果是NUMA 架构,更会造成跨NUMA 访问内存,性能受到很大影响。 ❺ 内存管理。传统服务器内存页为4K,为了提高内存的访问速度,避免cache miss,可以增加cache 中映射表的条目,但这又会影响CPU 的检索效率。 综合以上问题,可以看出内核本身就是一个非常大的瓶颈所在。那很明显解决方案就是想办法绕过内核。经很多前辈先驱的研究,DPDK在众多方案脱颖而出。 “纸上得来终觉浅,绝知此事要躬行”,下面我们通过一个实例来体验下DPDK。 首先,使用DPDK环境,需要修改设备树,将网络配置到用户态。需要使用到的设备树文件: OK10xx-linux-fs/flexbuild/build/linux/linux/arm64/fsl-ls1043a-rdb-usdpaa.dtb 将fsl-ls1043a-rdb-usdpaa.dtb拷贝到开发板根目录,使用如下命令替换设备树: mv/run/media/mmcblk0p2/fsl-ls1043a-rdb-sdk.dtb/run/media/mmcblk0p2/fsl-ls1043a-rdb-sdk.dtb.bak cp/fsl-ls1043a-rdb-usdpaa.dtb /run/media/mmcblk0p2/boot ln-s /run/media/mmcblk0p2/boot/fsl-ls1043a-rdb-usdpaa.dtb/run/media/mmcblk0p2/boot/fsl-ls1043a-rdb-sdk.dtb reboot 替换成功后启动开发板输入:ifconfigfm1-mac1 如果提示Devicenot found 就是已经替换成功。 测试DPDK完成后恢复默认配置方法: cp/run/media/mmcblk0p2/fsl-ls1043a-rdb-sdk.dtb.bak/run/media/mmcblk0p2/fsl-ls1043a-rdb-sdk.dtb reboot 将网络配置到用户态之后,那么我们该如何使用它们呢?TCP/UDP咋用?不要急在DPDK中使用TCP或者UDP的话还需要移植一个协议栈到DPDK中。入门阶段我们还是先来体验一把DPDK中包含了二层转发的测试例程吧。 二层转发网络拓扑如下图所示: 使用OK1043A-C平台的Port2和Port3(对应fm1-mac3和fm1-mac4),对LinuxHost 和 OK1012A-C之间的数据进行转发。LinuxHost 和 OK1012A-C您可以替换成其他的网络设备。 配置OK1043A-C: l2fwd-c 0xf -n 1 -- -p 0xc -q 1 --no-mac-updating 配置OK1012A-C: ifconfigeth0 192.168.1.200 tcpdump-i eth0 -vv -n -e 配置Linux Host: ifconfigeth0 192.168.1.120 sudomodprobe pktgen.ko echo"add_deviceeth0"> /proc/net/pktgen/kpktgend_0 echo"dst_mac6e:56:7d:85:ce:4d"> /proc/net/pktgen/eth0 echo"dst192.168.1.200">/proc/net/pktgen/eth0 echo"pkt_size64"> /proc/net/pktgen/eth0 echo"count1000000"> /proc/net/pktgen/eth0 echo"start"> /proc/net/pktgen/pgctrl 我们让LinuxHost主机发送100万个64字节大小的包出去,测试OK1043A-CDPDK对这些数据包的转发能力。 通过查看OK1043A-C的串口打印信息,我们发现DPDK已经将所有收到的数据包完完全全的转发了出去。同时细心的你会发现采用DPDK进行数据转发时,CPU的负载一直居高不下,因为它一直在应用层轮询,查看是否有数据包需要处理。
|