DPDK编译运行

939 阅读4分钟

前言

平常每周都会有一些心得感悟,这些在大家工作中可能会有许多共性。我觉得花一些时间整理一下,跟粉丝读者们分享一下日常学习工作的想法和所得,这是一个很好的互动和文章分享的痛点。

这是第十七篇。

DPDK编译

上周在Ubuntu上面编译安装DPDK这个开源库,配置运行了一下简单的几个application。记录一下。

编译

wget http://fast.dpdk.org/rel/dpdk-21.11.tar.xz
tar dpdk-21.11.tar.xz
cd dpdk-21.11
meson build 
cd build
ninja
ninja install
ldconfig

编译的步骤比较简单,具体的DPDK最新的版本使用了meson+ninja的编译工具。需要安装meson, ninja。还对其他库有依赖,主要如下:

项目	版本	安装命令
GCC	9.2.1	
pkg-config	>0.27	apt install build-essential
python	>3.5	               apt install python3.6   
meson 	>0.49.2	pip3 install meson
ninja	1.9.0	pip3 install  ninja
pyelftools	> 0.22	pip3 install pyelftools

上面这些是基础的依赖,对应到不同的component,还有其他的依赖,可以查看官方文档或者根据编译错误自行安装对应的包。

编译安装完成之后,很多二进制执行文件都会被拷贝到bin目录,在终端下面直接敲dpdk然后tab键可以看到相关的命令。

大页配置

运行之前必须做的一个是大页内存的配置。

可以通过命令dpdk-hugepages.py -s查看配置的情况:

root@keep-VirtualBox:~# dpdk-hugepages.py -s
Node Pages Size Total
0    4     2Mb    8Mb

Hugepages mounted on /dev/hugepages
root@keep-VirtualBox:~#

有对应的Pages就是正常的, 上面这个说明系统已经配置了2MB大小的大页,最多支持4个页。否则需要先配置。

可以通过往配置文件写入pages数目,或者使用dpdk-hugepages.py脚本配置

echo 4 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

dpdk-hugepages.py --setup 8M

这种方式只在当次配置后生效,系统重启后就重置了。

还可以通过内核启动参数配置,就是要写入grub,保证系统启动的时候就分配hugepage内存。

nano /etc/default/grub
# 在GRUB_CMDLINE_LINUX后添加hugepage=4
GRUB_CMDLINE_LINUX_DEFAULT="quiet splashi hugepages=4 iommu=pt intel_iommu=on"

update-grub
reboot

系统并不是支持任意大小的pagesz,针对intel的cpu可以通过查看cpu flags来确定,如果有pse则表示支持2MB大小,有pdpe1gb 则支持1GB的大小。IBM power架构支持16MB和16GB。

root@keep-VirtualBox:/# cat /proc/cpuinfo | grep flags
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch vmmcall fsgsbase avx2 invpcid rdseed clflushopt arat nrip_save flushbyasid decodeassists
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch vmmcall fsgsbase avx2 invpcid rdseed clflushopt arat nrip_save flushbyasid decodeassists
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch vmmcall fsgsbase avx2 invpcid rdseed clflushopt arat nrip_save flushbyasid decodeassists
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch vmmcall fsgsbase avx2 invpcid rdseed clflushopt arat nrip_save flushbyasid decodeassists

可以看到我的虚拟机平台 cpu flags只有pse的。只支持2MB大小的pagesz。

helloworld运行

直接进入example目录编译运行即可:

root@keep-VirtualBox:/# cd /root/dpdk/examples/helloworld/
root@keep-VirtualBox:~/dpdk/examples/helloworld# make
ln -sf helloworld-shared build/helloworld
root@keep-VirtualBox:~/dpdk/examples/helloworld#
root@keep-VirtualBox:~/dpdk/examples/helloworld#
root@keep-VirtualBox:~/dpdk/examples/helloworld#
root@keep-VirtualBox:~/dpdk/examples/helloworld# ./build/helloworld
EAL: Detected CPU lcores: 4
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 2
hello from core 3
hello from core 0
root@keep-VirtualBox:~/dpdk/examples/helloworld#

更多

今天小结了一下DPDK的源码编译安装、大页配置及helloworld的运行。

清明节放假,宅家里好好学习,天天向上!活到老,学到老了。


行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。

博客地址: fishmwei.gitee.io/ 掘金主页: juejin.cn/user/208432…