记录一次不太正规nff-go(基于DPDK)的环境配置

记录一次不太正规nff-go(基于DPDK)的环境配置,第1张

目录

前言

一、克隆nff-go

二、安装nff-go

三、配置go环境

四、配置dpdk

 五、编译dpdk

六、编译nff-go

七、运行自己的nff-go程序

总结



前言

所需环境:

我用的的ubantu 18 系统,在我的虚拟机上进行的,首先是环境准备工作:

        1.保证系统cpu有4个处理器。(总之不能少于两个,具体没测试过,我的是4个)

        2.保证有两个网卡,其中一个网卡需要是多队列网卡。

具体查看自己网卡是否支持多队列,请利用命令行查看:

                cat /proc/interrupts | grep 网卡名字

出现以下结果就代表是了,就是有多条,而不是一条

如果发现自己的所有网卡都不支持多队列,就请在虚拟机安装目录找到.vmx的文件,加入以下一行,注意,ethernet1代表的是我的第二个网卡

        ethernet1.virtualDev = "vmxnet3"

重启虚拟机就可以了。

这个就是所需要的环境。


提示:以下是本篇文章正文内容。

一、克隆nff-go git clone --recurse-submodules http://github.com/intel-go/nff-go 二、安装nff-go

apt install liblua5.3-dev libmnl-dev libelf-dev libnuma-dev build-essential libibverbs-dev libpcap-dev

pip3 install meson ninja

git clone https://github.com/libbpf/libbpf.git

cd libbpf/src

make

sudo make install

echo "/usr/lib64" >> /etc/ld.so.conf   (root)

ldconfig   (root)

cp -rf  ./libbpf/include/uapi/linux   nff-go安装路径/nff-go/internal/low/

三、配置go环境

自己去百度吧

四、配置dpdk

1.切到nff-go的dpdk/dpdk文件夹下

新建一个文件dpdkenv,输入

export RTE_SDK=`pwd`
export RTE_TARGET=x86_64-native-linuxapp-gcc
export EXTRA_CFLAGS="-O0 -g"

 然后输入命令:source dpdkenv

2、编译dpdk

        先在dpdk安装目录下make clean, 清除一些残留信息。 由于我的系统是64位的,因此使用make install T=x86_64-native-linuxapp-gcc开始编译。如果是32位 *** 作系统,则使用make install T=i686-native-linuxapp-gcc

make clean
make install x86_64-native-linuxapp-gcc

3、设置大页内存

        系统默认每个大页的大小是2M, 在这里设置256个大页,也就是大页内存一共512M。  大页内存尽量设置大一些,通常设置为512---1024M之间, 否则后续执行测试例子的时候有可能会报大页内存不足错误信息。 设置好大页内存后,挂载大页系统

echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge

 之后可以在/proc/meminfo文件中看到大页内存信息

cat /proc/meminfo | grep Huge

4、安装igb_uio驱动

        编译好dpdk后,会在dpdk的安装目录下生成uio驱动: i686-native-linuxapp-gcc/kmod/igb_uio.ko,需要把这个驱动加载到内核

modprobe uio
insmod x86_64-native-linuxapp-gcc/kmod/igb_uio.ko

5、将物理网卡与igb_uio驱动进行绑定

        使用dpdk自带的脚本,查看网卡信息。从中可以看出我有两个网卡,其中一个已经是绑定在了dpdk驱动下。

此处切换文件夹到dpdk/dpdk/usertools下

cd ./usertools
./dpdk-devbind.py --status

 如果没有绑定,则使用以下命令进行绑定 *** 作。

./dpdk-devbind.py -b igb_uio 0000:03:00.0
 五、编译dpdk cd nff-go/dpdk/dpdk/meson buildcd buildninjaninja install   (root)ldconfig   (root) 六、编译nff-go cd nff-gogo mod downloadmake -j8 七、运行自己的nff-go程序
package main

import "github.com/intel-go/nff-go/flow"

func main() {
	flow.SystemInit(nil)
	flow.SystemStart()
}

这是从nff-go官网上抄下来的最简短的代码,进行测试。

go run main.go

会发现报错: go build github.com/intel-go/nff-go/internal/low: invalid flag in #cgo LDFLAGS: -Wl,--whole-archive

此时运行以下两条命令即可:

export CGO_CFLAGS_ALLOW=".*"
export CGO_LDFLAGS_ALLOW=".*"

再进行go run main.go 会发现还再会报错

In file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:41:0,
                 from /usr/lib/gcc/x86_64-linux-gnu/7/include/x86intrin.h:48,
                 from /usr/local/include/rte_vect.h:28,
                 from /usr/local/include/rte_memcpy.h:17,
                 from /usr/local/include/rte_ether.h:21,
                 from /usr/local/include/rte_ethdev.h:160,
                 from ./low.h:11,
                 from github.com/intel-go/nff-go/internal/low/low.go:16:
/usr/local/include/rte_memcpy.h: In function 'rte_mov32':
/usr/lib/gcc/x86_64-linux-gnu/7/include/avxintrin.h:926:1: error: inlining failed in call to always_inline '_mm256_storeu_si256': target specific option mismatch 

错误主要是这个:: inlining failed in call to always_inline '_mm256_storeu_si256': target specific option mismatch 

此时再执行以下两个命令:

export CGO_CFLAGS="-I${RTE_SDK}/${RTE_TARGET}/include -O3 -std=gnu11 -m64 -pthread -march=native -mno-fsgsbase -mno-f16c -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_RDRAND -DRTE_MACHINE_CPUFLAG_F16C -include rte_config.h -Wno-deprecated-declarations"
export CGO_LDFLAGS="-L${RTE_SDK}/${RTE_TARGET}/lib -Wl,--no-as-needed -Wl,-export-dynamic"

 前提是你的环境变量中存在RTE_SDK和RTE_TARGET

之后再运行main.go就成功了


总结

以上就是整个过程,现在网上nff-go的资料特别少,而且好像nff-go的官网代码也停止了更新,很有可能现在这个项目已经没有人在维护了,所以配置起来特别麻烦,这个流程我一共走了将近十天的时间,才把流程走通,特此记录下来,方便他人。

参考资料:

nff-go官方文档

虚拟机dpdk环境搭建_ApeLife技术博客-CSDN博客_dpdk环境搭建

GitHub - guozijing/nff-go: README of nff-go

Home · intel-go/nff-go Wiki · GitHub

https://github.com/intel-go/nff-go/wiki/Building-Packet-Processing-Graph

https://github.com/intel-go/nff-go/wiki/Helper-API

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/990277.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存