一文了解DPDK
发布网友
发布时间:14小时前
我来回答
共1个回答
热心网友
时间:12小时前
在现代网络中,实时处理大量数据包是关键任务,以往高效数据包处理通常依赖昂贵的专用硬件。数据平面开发套件(DPDK)的出现,使低成本商用硬件成为可能,实现网络功能的转移与虚拟化运行。最初由Intel于2010年发起,后在2017年4月成为Linux基金会项目,DPDK已在众多开源项目中得到应用,包括MoonGen、mTCP、Ostinato、Lagopus、Fast Data (FD.io)、Open vSwitch、OPNFV和OpenStack等。
然而,DPDK亦面临挑战,如不支持某些网卡、对Windows支持有限、调试困难、版本兼容性问题等。那么,DPDK是如何改进数据包处理的?传统方式数据包先到内核再至用户层处理,增加了延迟与CPU开销,影响性能。DPDK通过在用户空间实现快速数据包处理,绕过内核空间,直接在网卡(NIC)和用户空间应用程序间传输数据包。它由一组网络驱动程序和库组成,环境抽象层(EAL)从应用程序抽象出硬件操作。传统中断驱动处理转变为轮询驱动,避免中断开销。重要优化包括零拷贝技术,避免数据包从内核空间复制到用户空间,用户空间对开发者更具吸引力,无需修改内核,任意DPDK网络堆栈均可针对特定应用优化。
DPDK的数据包处理模型主要有两种:Run-to-Completion和Pipeline。在Run-to-Completion中,CPU内核负责数据包接收、处理和传输,支持多个内核与专用端口关联。通过接收端扩展(RSS)分配单个端口流量至多个内核。Pipeline模型中,每个内核专注于特定任务,例如接收/传输或应用程序处理,数据包通过memory rings在内核间传递。单核多CPU部署中,一个CPU用于操作系统,另一个用于DPDK应用;多核部署下,内核可分配给特定任务,决定取决于数据包周期、数据模块间交换范围、特定优化、代码可维护性等。
尽管DPDK不包含TCP/IP堆栈,但可使用F-Stack、mTCP、TLDK、Seastar和ANS等用户空间网络堆栈,提供阻塞和非阻塞套接字API,适用于FreeBSD实现。DPDK避免了网络堆栈的通用实现低效率问题,应用程序可包含针对特定用例优化的网络模块,适用于不需更高层(L2以上)处理的用例。
在DPDK之前,厂商如何实现高效数据包处理?专用硬件如定制ASIC、可编程FPGA或网络处理单元(NPU)以优化方式完成任务,但成本高昂且维护耗时,全职网络管理员应用升级和安全补丁也极为耗时。转向商用现成(COTS)硬件虽然成本效益更高且易于维护,但性能受限。数据包从NIC移动至操作系统,并通过内核堆栈处理,即使快速NIC,内核堆栈亦为瓶颈。系统调用、中断、上下文切换、包复制和逐包处理降低性能。DPDK解决了COTS硬件上的性能问题,无需昂贵定制硬件即可实现高效数据包处理。
DPDK的应用场景广泛,包括负载均衡、流分类、路由、访问控制(防火墙)和流量监管等。不仅在电信行业,也在云环境和企业中使用,如流量生成器(TRex)和存储应用(SPDK)。DPDK移植到Open vSwitch后,性能提升了7倍。在物联网应用中,数据包小,DPDK减少延迟,允许处理更多数据包。5G中的用户平面功能(UPF)处理用户数据包,延迟、抖动和带宽为关键性能指标,部分研究已提出将DPDK用于5G UPF的实现。在边缘网络部署UPF时,可通过DPDK API连接UPF应用(UPF-C)和SmartNIC(UPF-U)。
DPDK面临的挑战包括需要专业知识、管理内存、传递数据包、多核架构使用、PID命名空间问题、mmap使用不当、线程与CPU内核分配、DPDK库选择、失去Linux内核保护与工具、协议(如ARP、IPSec)、调试难度与高CPU使用率等问题。其他替代选择包括Snabbswitch、Netmap、StackMap、PacketShader和修改Linux内核的工具如eXpress Data Path(XDP)和基于远程直接内存访问(RDMA)的网络堆栈等。其他有效工具还包括packet_mmap(不绕过内核)和PF_RING(带有ZC驱动程序)。