最近项目需要高性能的抓包工具,找到了Intel开发的DPDK框架以及开源项目PcapPlusPlus,以下记录一下从源码编译到运行例子的踩坑之路
环境:vmware15 + ubuntu16.04 + DPDK18.02 + PcapPlusPlus
DPDK配置与编译
下载DPDK
由于截止本文写作的时候,PcapPlusPlus的抓包功能最高只支持DPDK18.02版本,更高的版本在编译时会报错找不到头文件。DPDK18.02.2
配置libpcap
由于DPDK抓包需要libpcap,下载并解压libpcap。
按照文档安装后,需要将/usr/lib
和/usr/local/lib
加入/etc/ld.so.conf
文件中,并用ldconfig
命令重置链接库的缓存,否则后续编译可能会发生找不到pcap.h文件的错误。
配置大内存页
用root用户执行以预留大内存页,此处分配的是2M的大内存页
hugepages=1024
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
让DPDK使用大内存页,同样用root用户执行
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
配置DPDK编译目标
DPDK支持多种平台(x86、x64、ARM),编译的目标由ARCH-MACHINE-EXECENV-TOOLCHAIN
给出
ARCH
can be:i686
,x86_64
,ppc_64
,arm64
MACHINE
can be:native
,power8
,armv8a
EXECENV
can be:linuxapp
,bsdapp
TOOLCHAIN
can be:gcc
,icc
在我的环境下,选择x86_64-native-linuxapp-gcc
# 配置编译目标
make config T=x86_64-native-linuxapp-gcc
# 编译
make
配置PcapPlusPlus
下载PcapPlusPlus
https://github.com/seladb/PcapPlusPlus
编译配置
运行PcapPlusPlus根目录下的configure-linux.sh,配置抓包方式为DPDK
运行setup-dpdk.sh绑定网卡设备到DPDK驱动,这会使linux内核丧失对该网卡的驱动,单网卡的情况下会断网
编译
make all
就好
运行PcapPlusPlus的样例程序
https://github.com/seladb/PcapPlusPlus/tree/master/Examples/DpdkExample-FilterTraffic
该样例程序使用DPDK抓包,并设置了基本的过滤选项
在虚拟机环境下,可能会出现EAL: Error reading from file descriptor 9: Input/output error
错误,这是由于VMWare的虚拟网卡的问题。参考这里解决。