要想弄懂一个工程,在了解完它的基本概念和大体架构之后,就让它跑起来。看看是怎么玩转的,然后再深入细节。这里我先到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,需要以下几个要求,后面详细说明升级步骤
- 核数:40个(至少两个)
- 内存:越大越好,我的是125G
- 网卡:intel支持dpdk的,不能是amd,需要至少两张有IP地址的up状态的网卡
- 增加Swap空间
- 升级内核,uname -r 查看内核版本要求 Kernel version >= 4.4
注意,这里如果编译dpdk18.11版本,那么kernel version是3.10时可以成功,不需要升级到高版本 - ldd --version 查看glibc版本要求 glibc >= 2.7(拜托2.17 大于 2.7)
- 注意,在编译gcc之前查看 /usr/src/kernels/ 目录下一定要有有对应内核版本的文件,这些是kernel-devel安装文件。否则,编译gcc能成功但是编译dpdk时会失败。
yum install kernel-devel -y - gcc -v 版本要求是4.9以上,下载 https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz 版本并编译安装重启
- yum install python3 (Python 3.5 or later.)
- pip3 install meson ninja //Meson (version 0.49.2+) and ninja
- pip3 install pyelftools 或者yum install pyelftools
- 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
- export RTE_SDK=/root/share/dpdk/dpdk-stable-18.11.2
export RTE_TARGET=x86_64-native-linuxapp-gcc - cd $RTE_SDK
- Build DPDK: //之前make 也安装过了呀,还需要再编译一遍吗?
make defconfig
make
4.make -C examples
因为我的系统是x86-64位系统,所以编译的二进制文件在各个examples目录下的./x86_64-native-linuxapp-gcc/文件夹内
hello-world
- rte_eal_init 函数只在main函数中被调用,初始化dpdk所需要的环境,初始化参数、设置log等级等
- rte_eal_remote_launch 在每个lcore上执行函数
- rte_eal_mp_wait_lcore 等所有子线程执行退出,并清理dpdk环境
- 运行命令: ./examples/helloworld/x86_64-native-linuxapp-gcc/helloworld -l 0-3 -n 4
选择0-3号核,-n 表示的是Number of memory channels. 是memory的号码?还是数量?? - 运行报错:
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