赞
踩
步骤1 升级GCC依赖包设置
编译安装gmp:
cd /home
tar -xvf /home/gmp-6.1.2.tar.bz2
cd /home/gmp-6.1.2
./configure --prefix=/usr/local/gmp-6.1.2
make
make install
编译安装mpfr:
cd /home
tar -zxvf mpfr-3.1.5.tar.gz
cd /home/mpfr-3.1.5
./configure --prefix=/usr/local/mpfr-3.1.5 --with-gmp=/usr/local/gmp-6.1.2
make
make install
编译安装mpc:
cd /home
tar -zxvf mpc-1.0.3.tar.gz
cd /home/mpc-1.0.3
./configure -prefix=/usr/local/mpc-1.0.3 -with-gmp=/usr/local/gmp-6.1.2 -with-mpfr=/usr/local/mpfr-3.1.5
make
make install
安装isl:
cd /home
tar -xvf /home/isl-0.18.tar.bz2
cd /home/isl-0.18
yum -y install gmp-devel
./configure --prefix=/usr/local/isl-0.18 --with-gmp=/usr/local/gmp-6.1.2
make
make install
步骤2 安装gcc 7.3.0
cd /home tar -zxvf gcc-7.3.0.tar.gz cd /home/gcc-7.3.0 ./configure --prefix=/usr/local/gcc-7.3.0 --enable-languages=c,c++,fortran --enable-shared --enable-linker-build-id --without-included-gettext --enable-threads=posix --disable-multilib --disable-nls --disable-libsanitizer --disable-browser-plugin --enable-checking=release --build=aarch64-linux --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-3.1.5 --with-mpc=/usr/local/mpc-1.0.3 --with-isl=/usr/local/isl-0.18 export LD_LIBRARY_PATH=/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-3.1.5/lib:/usr/local/gcc-7.3.0/lib64:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH export PATH=/usr/local/gcc-7.3.0/bin:$PATH ./configure --prefix=/usr/local/gcc-9.3.0 --enable-languages=c,c++,fortran --enable-shared --enable-linker-build-id --without-included-gettext --enable-threads=posix --disable-multilib --disable-nls --disable-libsanitizer --disable-browser-plugin --enable-checking=release --build=aarch64-linux --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-3.1.5 --with-mpc=/usr/local/mpc-1.0.3 --with-isl=/usr/local/isl-0.18 export LD_LIBRARY_PATH=/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-3.1.5/lib:/usr/local/gcc-9.3.0/lib64:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH export PATH=/usr/local/gcc-9.3.0/bin:$PATH make -j 40 make -j 40 install gcc -v
步骤3 设置环境变量
在etc/profile文件添加:
vi /etc/profile
export LD_LIBRARY_PATH=/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-3.1.5/lib:/usr/local/gcc-7.3.0/lib64:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/gcc-7.3.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-3.1.5/lib:/usr/local/gcc-9.3.0/lib64:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/gcc-9.3.0/bin:$PATH
步骤4 加载环境变量
生效
source /etc/profile
步骤1 修改sysctl.conf增加内存大页设置
vim /etc/sysctl.conf
vm.nr_hugepages = 120
步骤2 修改系统启动项增加iommu设置
vim /boot/efi/EFI/openEuler/grub.cfg
增加iommu.passthrough=1
设置完成后重启系统,执行cat /proc/cmdline确认设置是否生效
cat /proc/cmdline
步骤1 安装DPDK所需依赖包
安装numa库
yum install numactl-devel
安装libcap第三方软件,提供pcap.h
yum install libpcap-devel
步骤2 解压编译dpdk软件包
unzip dpdk-19.08.2.zip
cd dpdk-19.08.2/
打开config/common_base文件中的 Mellanox网卡PMD驱动开关:
vi common_base
设置 CONFIG_RTE_LIBRTE_MLX5_PMD=y
设置 CONFIG_RTE_LIBRTE_MLX5_DEBUG=y
export RTE_TARGET=arm64-armv8a-linuxapp-gcc # 以当前环境CPU架构为准
export RTE_SDK=/root/dpdk-19.08.2
make install T=$RTE_TARGET
如果这里报错,在执行一次步骤1
步骤3 Mellanox网卡驱动安装
(1)Mellanox官网下载对应OS的Mellanox驱动
https://www.mellanox.com/page/products_dyn?product_family=27
(2)配置环境变量,现在rpm包编译使用的cpu核最大个数,否则编译报错
echo %_smp_ncpus_max 16 > ~/.rpmmacros
(3)安装驱动:
./mlnx_add_kernel_support.sh -m ./ --without-mlx5_fpga_tools --kmp -v
./mlnxofedinstall --dpdk --upstream-libs --add-kernel-support
/etc/init.d/opnibd restart
步骤4 添加dpdk环境变量
vi ~/.bashrc
export RTE_TARGET=arm64-armv8a-linuxapp-gcc # 以当前环境CPU架构为准
export RTE_SDK=/root/dpdk-19.08.2
将dpdk环境变量加入.bashrc文件中
source ~/.bashrc
DPDK会利用自己的igb_uio/vfio驱动来接管传统内核驱动,这样往往会导致一些问题,就是我们一些传统的类unix工具,诸如ifconfig、ip、ethtool等工具无法再查看被DPDK驱动接管的网卡状态。
在传统linux场景下,我向看一下网卡丢包原因、网卡寄存器状态、网卡的feature,通过一个ethtool就可以搞定,但是到了DPDK这里就行不通了,因为上述传统工具实际上都是去内核拿数据,ethtool底层就是用ioctl去读的内核数据,但是现在网卡驱动已经被DPDK驱动接管了,用ethtool再也拿不到信息了。
注意:
Mellanox网卡不需要绑定,Intel && Broadcom需要绑定,Intel && Broadcom需要使用DPDK驱动,绑定成功后在“ip a”下不可见
步骤1加载igb_uio模组
cd usertools/
./dpdk-setup.sh
./dpdk-devbind.py --status
查看当前网卡状态
如果绑定的网卡状态是Active,需要执行:
ifconfig ethx down 或者 ifdown ethx
步骤2 绑定被测网口到用户态
./dpdk-devbind.py --bind=igb_uio 0000:bd:00.0 0000:bd:00.1
./dpdk-devbind.py --status
绑定成功
该工具所在位置
cd /home/dpdk-stable-19.08.2/arm64-armv8a-linuxapp-gcc/build/app/test-pmd
备注:列出部分命令行参数意义,详细意义可以在DPDK官网获取。
参数 | 说明 |
---|---|
-c | 指定参与转发的CPU核掩码 |
-n | 指定系统内存通道个数 |
-w | 指定参与DPDK转发的网口的PCIE地址 |
–rxd/txd | 指定转发使用的网口队列深度 |
–txq/rxq | 指定参与转发的网卡队列数 |
–nb-cores | 指定实际参与转发的cpu核数 |
-i | 交互模式启动程序 |
开始测试 |
./testpmd -l 2-11 -n 4 -- -i --rxq=1 --txq=1 --rxd=4096 --txd=4096 --nb-cores=2 --burst=64 --mbuf-size=2048 --total-num-mbufs=20480 --mbcache=512
出现报错信息:testpmd: No probed ethernet devices
(1)如果你使用的是 Intel 的网卡,那么上述的步骤当然没有问题。但笔者使用了华为的网卡,所以还需要做一些适配的工作,需要安装华为方提供的网卡驱动。
(2)还有一种可能是内存不足造成的,绑定网卡后,导致大页内存分配不足,扩大内存就好了。
解决后:
testpmd> show port stats all
testpmd> set fwd txonly
testpmd> start
查看网卡状态:
./dpdk-devbind.py --status
进行解绑:
./dpdk-devbind.py -u 0000:01:00.1
./dpdk-devbind.py -u 0000:01:00.0
再次查看网卡状态:
./dpdk-devbind.py --status
发现该网卡在Other里,无法正常使用
解绑后,需要再重新绑会原来的驱动,该卡原来的驱动是mlx5_core,执行:
./dpdk-devbind.py -b mlx5_core 0000:01:00.0
./dpdk-devbind.py -b mlx5_core 0000:01:00.1
查看网卡状态,恢复正常:
./dpdk-devbind.py --status
执行example/下的例子要先绑定网卡。
Helloworld,testpmd,skeleton的测试例子就不说了,l3fwd还不懂怎么构建拓扑,这里
详细说一下l2fwd二层转发的例子:
模型
这里用二张网卡测试,以上面的模型收发包。
运行:./build/l2fwd -c 0x50 -n 4 – -p 0x0c -q 1
参数分为两部分,以 – 分隔,前面部分是配置EAL环境的,后面是程序的参数
-c 0x50 是指用4,6两个核,-n 4指的是用4个内存通道。0x50是core的16进制掩码。
-p 0x0c 是指网卡的16进制掩码,即2,3两个口。
-q 1 是用一个无锁队列。
由于网卡是由DPDK接管的,是没有IP地址的,所以是以MAC地址通信。确定好各自的源MAC和目的MAC,类似于二层交换机的功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。