首页 > 其他分享 >DPDK入门实践2——编译安装与helloworld

DPDK入门实践2——编译安装与helloworld

时间:2023-01-13 10:49:09浏览次数:61  
标签:gcc -- helloworld 编译 yum install DPDK dpdk

要想弄懂一个工程,在了解完它的基本概念和大体架构之后,就让它跑起来。看看是怎么玩转的,然后再深入细节。这里我先到GitHub上下载dpdk工程的18.11.2稳定版本,之所以选择这个版本是因为我们后面会用到DPVS,而DPVS支持到18.11. 另外,在安装编译dpdk之前需要升级linux系统并安装相关软件,我试了不下5次都没有成功,先是报了“make: *** /lib/modules/5.4.132-1.el7.elrepo.x86_64/build: 没有那个文件或目录”这样的错,我到https://pkgs.org/download/kernel-devel 下载并安装了kernel-lt-5.4.132-1.el7.elrepo.nosrc.rpm.然后再次编译又报错“dpdk-stable-18.11.2/lib/librte_eal/linuxapp/eal/eal.c:51:10: 致命错误:malloc_heap.h:没有那个文件或目录”系统安装了dpdk也不行,后来一次偶然的忘记升级内核了,居然成功了。所以,官网的信息不一定对应老版本的安装,这里只能反复尝试了。另外,在物理上在虚拟机上都可以安装,但是因为虚拟机的资源有限,即使安装编译成功了但运行时也可以可能因为资源不足而崩溃。所以,尽量选用一个高性能的服务器来做dpdk.一般性能的机器编译下面的GCC要花费4小时,而我选用了高性能的服务器只用了一个小时就完成了。

系统更新

我的系统是centos7,需要以下几个要求,后面详细说明升级步骤

  1. 核数:40个(至少两个)
  2. 内存:越大越好,我的是125G
  3. 网卡:intel支持dpdk的,不能是amd,需要至少两张有IP地址的up状态的网卡
  4. 增加Swap空间
  5. 升级内核,uname -r 查看内核版本要求 Kernel version >= 4.4
    注意,这里如果编译dpdk18.11版本,那么kernel version是3.10时可以成功,不需要升级到高版本
  6. ldd --version 查看glibc版本要求 glibc >= 2.7(拜托2.17 大于 2.7)
  7. 注意,在编译gcc之前查看 /usr/src/kernels/ 目录下一定要有有对应内核版本的文件,这些是kernel-devel安装文件。否则,编译gcc能成功但是编译dpdk时会失败。
    yum install kernel-devel -y
  8. gcc -v 版本要求是4.9以上,下载 https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz 版本并编译安装重启
  9. yum install python3 (Python 3.5 or later.)
  10. pip3 install meson ninja //Meson (version 0.49.2+) and ninja
  11. pip3 install pyelftools 或者yum install pyelftools
  12. yum install numactl-devel

增加Swap空间

1.查看你的系统里面的swappiness
$ cat /proc/sys/vm/swappiness
不出意外的话,你应该看到是 60,那么就需要修改
2.修改swappiness值
$ sudo sysctl vm.swappiness=70
但是这只是临时性的修改,在你重启系统后会恢复默认的,所以,还要做一步
$ sudo vi /etc/sysctl.conf
在这个文档的最后加上这样一行:
vm.swappiness=60
然后保存,重启。ok,你的设置就生效了。
1. 查看当前分区情况
    free -mh
2. 增加 swap 大小, 2G 左右。注意这里是一次增加2G
    dd if=/dev/zero of=/var/swap bs=1024 count=2048000
3. 设置交换文件
    mkswap /var/swap
4. 立即激活启用交换分区
    swapon /var/swap
5. 添加系统引导时自启动运行
     vi /etc/fstab
   添加一行
     /var/swap swap swap defaults 0 0

如果不用swap空间了,可以用如下命令收回:

 收回 swap 空间
     swapoff /var/swap
  从文件系统中回收
     rm /var/swap

升级内核

    uname -ra //查看内核版本
    yum -y update
    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
    yum -y update
    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
    yum --enablerepo=elrepo-kernel install kernel-lt kernel-devel
    sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
    grub2-mkconfig -o /boot/grub2/grub.cfg  
    grub2-set-default 0 
    reboot

升级GCC

选择合适的版本,这里选择用的是7.5版本,你也可以选择自己想要的版本。

    sudo yum -y update
    sudo yum -y install bzip2 wget gcc gcc-c++ gmp-devel mpfr-devel libmpc-devel make
    sudo yum -y install zlib
    sudo yum -y install zlib-devel    
    sudo yum -y install glibc-headers
    wget  https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz
    tar  -zxvf  gcc-7.5.0.tar.gz
    cd  gcc-7.5.0    
    ./contrib/download_prerequisites
    mkdir  gcc-build-7.5
    cd  gcc-build-7.5    
    ../configure --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --enable-gnu-indirect-function --with-tune=generic --disable-multilib 
    make
    make install
    reboot

安装dpdk

1.下载dpdk 18.11版本,因为IPVS目前支持到18.11所以下载此版本
$ wget https://fast.dpdk.org/rel/dpdk-18.11.2.tar.xz # download from dpdk.org if link failed.
$ tar xf dpdk-18.11.2.tar.xz
进入工程 /root/share/dpdk/dpdk-18.11.2/
2. 输入 meson build // 配置构建目录
如果不是在dpdk工程的root目录下构建,则需要指定Dpdk工程根目录作为第一个参数,构建的目录作为第二个参数,例如,在目录/tmp/dpdk-build构建dpdk: user@host:/tmp$ meson ~user/dpdk dpdk-build
meson configure -Dbuildtype=debug build // 如果修改参数用类似命令配置构建目录
3. 完成后,cd build目录,依次输入命令
ninja // 构建
ninja install // install DPDK system-wide
ldconfig // 使动态加载器ld.so更新其缓存以考虑新objects
4. 执行./usertools/dpdk-setup.sh 根据运行环境选择编译选项,我是linux64位系统,所以我选择15

编译example

  1. export RTE_SDK=/root/share/dpdk/dpdk-stable-18.11.2
    export RTE_TARGET=x86_64-native-linuxapp-gcc
  2. cd $RTE_SDK
  3. Build DPDK: //之前make 也安装过了呀,还需要再编译一遍吗?
    make defconfig
    make
    4.make -C examples
    因为我的系统是x86-64位系统,所以编译的二进制文件在各个examples目录下的./x86_64-native-linuxapp-gcc/文件夹内

hello-world

  1. rte_eal_init 函数只在main函数中被调用,初始化dpdk所需要的环境,初始化参数、设置log等级等
  2. rte_eal_remote_launch 在每个lcore上执行函数
  3. rte_eal_mp_wait_lcore 等所有子线程执行退出,并清理dpdk环境
  4. 运行命令: ./examples/helloworld/x86_64-native-linuxapp-gcc/helloworld -l 0-3 -n 4
    选择0-3号核,-n 表示的是Number of memory channels. 是memory的号码?还是数量??
  5. 运行报错:
EAL: Cannot get hugepage information.
PANIC in main():
Cannot init EAL

根据报错日志判断应该是没有创建hugepage,使用脚本dpdk-setup.py 创建hugepage,当然也可以手动创建hugepage再次运行,结果如下:

hello from core 1
hello from core 2
hello from core 3
hello from core 0

如果已经有一个dpdk主进程了,那么可以通过添加参数proc-type以第二进程的方式来跑:

./examples/helloworld/x86_64-native-linuxapp-gcc/helloworld -l 0-3 -n 4 --proc-type=secondary
或者
./examples/helloworld/x86_64-native-linuxapp-gcc/helloworld -l 0-3 -n 4 --proc-type=auto

标签:gcc,--,helloworld,编译,yum,install,DPDK,dpdk
From: https://www.cnblogs.com/janeysj/p/15062384.html

相关文章