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

目录

前言

一、克隆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

二、安装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 build
  • cd build
  • ninja
  • ninja install   (root)
  • ldconfig   (root)

六、编译nff-go

  • cd nff-go
  • go mod download
  • make -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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值