DPDK的环境抽象层向应用与函数库隐藏了底层环境的细节,因而能扩展到任何处理器上使用。就操作系统来说,它提供了对Linux和FreeBSD的支持。
工作原理
DPDK使用了轮询(polling)而不是中断来处理数据包。在收到数据包时,经DPDK重载的网卡驱动不会通过中断通知CPU,而是直接将数据包存入内存,交付应用层软件通过DPDK提供的接口来直接处理,这样节省了大量的CPU中断时间和内存拷贝时间
DPDK主要有以下几个核心思想:
1.通过UIO技术将报文拷贝到用户空间进行处理,从而绕过内核协议栈;
图6. 网络报文处理方式 Kernel Space V.S. User Space
2.通过大页内存,提高TLB命中率,降低TLB miss开销,进而提高CPU访问速度;
图7. TLB的使用
3.通过CPU亲和性,绑定网卡和线程到固定的core,减少CPU任务切换;
4.通过无锁队列,减少资源竞争;
虚拟机搭建dpdk:
--------------------------常见问题:
(1)大页配置:
echo 100 > /proc/sys/vm/nr_hugepages
(2)运行testpmd程序时输出:
EAL: Error reading from file descriptor 23: Input/output error
原因:
在虚拟机添加的网卡,dpdk不支持导致的。
需要修改一行代码,跳过dpdk pci 检查
修改代码行
lib/librte_eal/linuxapp/igb_uio/igb_uio.c
找到
pci_intx_mask_supported(dev)
这行代码
然后修改为
pci_intx_mask_supported(dev)||true
-----------------------------gdb调试
export RTE_SDK=`pwd`
export RTE_TARGET=x86_64-native-linuxapp-gcc
export EXTRA_CFLAGS="-O0 -g"
make -C x86_64-native-linuxapp-gcc
make -C examples/l2fwd/
make -C app/testpmd/