编译打包
需要使用专门的交叉工具编译,交叉编译工具文件为fsl-qoriq-glibc-x86_64-fsl-toolchain-aarch64-toolchain-2.5.sh,使用如下命令安装:
fsl-qoriq-glibc-x86_64-fsl-toolchain-aarch64-toolchain-2.5.sh -d /opt/cross
若/opt/cross已存在该交叉编译工具无需安装。
注:暂时只能以该交叉工具编译vpp,且openssl、dpdk、vpp都需要以该工具链编译。
交叉编译工具链中包含的openssl库可以用来编译fastup,暂时先不用编译opens数量。
- openssl
#编译openssl
git checkout OpenSSL_1_1_0g
export CROSS=/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-
export CC=aarch64-fsl-linux-gcc
#./Configure linux-aarch64 --prefix=/opt/cross/sysroots/x86_64-fslsdk-linux/usr shared
./Configure linux-aarch64 --prefix=/home/duanyingshou/code/openssl/build_linux_aarch64/ shared
make depend
make CC="/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-gcc --sysroot=/opt/cross/sysroots/aarch64-fsl-linux -fPIC" LD="/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-ld" AR="/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-ar rv " EXTRA_CFLAGS='-g -Ofast -fPIC -ftls-model=local-dynamic' -j 8
make install
编译时打包/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-ar失败
解决方法添加rv参数
编译openssl成功,但在编译vpp时openssl报错找不到符号表
解决方法添加LD=”/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-ld”
- dpdk
# 编译dpdk
export CROSS=/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-
make config T=arm64-dpaa2-linuxapp-gcc CROSS=aarch64-fsl-linux- CROSS_COMPILE="aarch64-fsl-linux-" CC="/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-gcc --sysroot=/opt/cross/sysroots/aarch64-fsl-linux -fPIC -g" EXTRA_CFLAGS='-g -Ofast -fPIC -ftls-model=local-dynamic'
make T=arm64-dpaa2-linuxapp-gcc -j 4 CC="/opt/cross/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux/aarch64-fsl-linux-gcc --sysroot=/opt/cross/sysroots/aarch64-fsl-linux -fPIC" EXTRA_CFLAGS='-g -Ofast -fPIC -ftls-model=local-dynamic' CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n install -j 8
- vpp
修改vpp下的toolchain.cmake的20和21行如下:
set(CMAKE_C_COMPILER ${toolchain}/usr/bin/$ENV{CROSS_PREFIX}/$ENV{CROSS_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${toolchain}/usr/bin/$ENV{CROSS_PREFIX}/$ENV{CROSS_PREFIX}-g++)
#编译vpp
export PLATFORM=dpaa
export DPDK_PATH=/home/duanyingshou/code/dpdk/arm64-dpaa2-linuxapp-gcc
#export OPENSSL_PATH=/home/duanyingshou/code/openssl/build_linux_aarch64/
export CROSS_TOOLCHAIN=/opt/cross/sysroots/x86_64-fslsdk-linux
export CROSS_PREFIX=aarch64-fsl-linux
export CROSS_SYSROOT=/opt/cross/sysroots/aarch64-fsl-linux/
export PATH=$CROSS_TOOLCHAIN/bin:$CROSS_TOOLCHAIN/usr/bin/aarch64-fsl-linux:$PATH
cd build-root
make distclean
#TAG可以使用dpaa_debug,编译时不会优化,方便debug,详见 vpp/build-data/platforms/dpaa.mk
make V=0 PLATFORM=dpaa TAG=dpaa
- 打包
cp ~/code/fastup_nxp/src/fastuplibs/libup/lib/arm64/* ~/code/fastup_nxp/build-root/install-dpaa-aarch64/vpp/lib
cp ~/code/fastup_nxp/src/fastuplibs/libutils/lib/arm64/* ~/code/fastup_nxp/build-root/install-dpaa-aarch64/vpp/lib
cd ~/code/fastup_nxp/build-root/install-dpaa-aarch64/
tar zcvf ~/package/vpp_arm64.tar.gz vpp
配置
- dpaa2
export ROOT_DPRC=dprc.1
export PARENT_DPRC=dprc.2
export DPCON_COUNT=3
export DPBP_COUNT=4
export DPMCP_COUNT=1
export DPSECI_COUNT=8
export DPIO_COUNT=4
export DPCI_COUNT=2
export DPDMAI_COUNT=2
./vpp/dpaa2/dynamic_dpl.sh dpmac.4
export DPRC=dprc.2
- hugepage
echo 6 > /proc/sys/vm/nr_hugepages
echo 0 > /proc/sys/vm/swappiness
vpp
startup.conf
heapsize 256M plugin_path /root/vpp/lib/vpp_plugins unix { interactive #nodaemon gid vpp log /tmp/vpp.log full-coredump cli-listen /run/vpp/cli.sock # startup-config /etc/vpp/interface.txt startup-config /etc/vpp/interface_gtpu.txt } api-trace { on } api-segment { gid vpp } session { evt_qs_memfd_seg } socksvr { socket-name /tmp/vpp-api.sock } cpu { main-core 1 corelist-workers 3 #workers 2 } dpdk { ## Change default settings for all intefaces huge-dir /mnt/hugepages no-pci num-mem-channels 1 dev default { ## Number of receive queues, enables RSS ## Default is 1 num-rx-queues 1 num-rx-desc 40960 # rss { ipv4 } ## Number of transmit queues, Default is equal ## to number of worker threads or 1 if no workers treads num-tx-queues 1 } proc-type primary #log-level 8 } plugins { ## Adjusting the plugin path depending on where the VPP plugins are path /root/vpp/lib/vpp_plugins vat-path /root/vpp/lib/vpp_api_test_plugins plugin default { enable } plugin gtpu_plugin.so { disable } #plugin fastgtpu_plugin.so { disable } }interface.txt
set int state TenGigabitEthernet0 up set int ip address TenGigabitEthernet0 192.168.8.24/24 set int ip address TenGigabitEthernet0 192.168.9.24/24 set interface mac address TenGigabitEthernet0 42:4b:54:ae:6e:05 set int mtu 1500 TenGigabitEthernet0 set ip arp static TenGigabitEthernet0 192.168.8.25 90:e2:ba:8d:02:f0interface_gtpu.txt
set int state TenGigabitEthernet0 up set int ip address TenGigabitEthernet0 192.168.8.25/16 set interface mac address TenGigabitEthernet0 42:4b:54:ae:6e:05 set int mtu 1500 TenGigabitEthernet0环境变量
export PATH=/root/vpp/bin:$PATH export LD_LIBRARY_PATH=/root/vpp/lib
运行
pktgen
# -c cpu core mask # -m [18:19].1 18core用来做rx,19core用来作tx,使用dpdk的port1 # -s 1:5gc.pcap 使用port1来回放5gc.pcap ./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-stripvpp
vpp -c starup.conf
结果
only fastup
main线程1核、worker线程1核,收发满线速10g,15min无丢包。

fastup with fastgtpu, without callback
main线程1核、worker线程1核,收包满线速10g,15min无丢包。

fastup with fastgtpu and callback
main线程1核、worker线程1核,收包满线速6g,15min无丢包

main线程1核、worker线程1核,超过7g出现rx-miss,运用层收包能力不足,且无法通过调整rx ring来增加收发能力
问题
dpdk rx-errors丢包

dpdk rx-miss丢包

解决方式
rx-errors
rx-errors丢包是因为dpdk rx ring过小,只需要在startup.conf中配置dpdk的rx ring即可。
在startup.conf文件中设置num-rx-desc,默认值为1024,按实际测试情况:
dev default {
## Number of receive queues, enables RSS
## Default is 1
num-rx-queues 1
# dpdk rx ring size
num-rx-desc 8912
# rss { ipv4 }
## to number of worker threads or 1 if no workers treads
num-tx-queues 1
}
num-rx-desc大小作用效果如下:
无回调
- 1g线速1024大小不丢包
- 5g线速4096大小不丢包
- 10g线速8912大小不丢包
有回调
- 5g线速8192大小不丢包
- 6g线速8192大小不丢包
- 7g线速40960会出现rx-miss
rx-miss
rx-miss表示网卡收到了包,表示rte_rx_queue已经塞满了数据包,所以该包被丢失。此时该包存在于物理网卡的RX FIFO中,但是不会存在于内存中的rte_rx_queue中。
rx-miss由于应用层取包速度慢,无法及时消耗掉rte_rx_queue中的数据包。
结论
- vpp空转、vpp加载fastgtpu插件10g线速无丢包,dpdk的rx ring需设置为8192
- fastup回调无业务逻辑,6g线速无丢包,超过6g会出现丢包