高效网络协议栈访问DPDK
软件优化方案:Intel DPDK
Intel DPDK软件优化网络处理性能
DPDK(Data Plane Development Kit)数据面的开发包:
- 绕过Linux的内核协议栈,使用户态直接访问内存缓冲区,进行数据包的收发和处理;
- 不采用中断,而是采用轮询(Poll Mode Driver, PMD)

DPDK框架图
通过mmap和外设共享内存,实现零拷贝

DPDK核心思想:穷尽一切手段优化性能
- 用户态模式下的PMD Driver
- 去除了中断影响,减少了操作系统内核的开销,消除了IO吞吐瓶颈;
- 避免了内核态和用户态的报文拷贝;
- 用户态下软件崩溃,不会影响系统的稳定性;
- Intel提供的PMD驱动,充分利用指令和网卡的性能;
- Huge Page和内存缓冲区管理
- 提供2M和1G的大页,减少了TLB miss,TLB Miss严重影响了报文转发性能;
- 高效的内存缓冲区,能灵活的组织报文,包括多buffer接收,分片/重组,都能够轻松应对;
- 向量指令
- 明显的降低内存等待开销,提升CPU的流水线效率;
- 避免缓存不命中
- 避免分支预测错误
- 控制平面与数据平面相分离
- 内核态负责“控制平面”:内核仅负责控制指令的处理;
- 用户态负责“数据平面”:将数据包处理、内存管理、处理器调度等任务转移到用户态空间去完成,避免繁重的模式切换;
- 用多核编程代替多线程技术
- 绑核:设置CPU亲和性,减少彼此间调度切换;
- 无锁环形队列:解决资源竞争问题;
- CPU核尽量使用所在NUMA节点的内存
- 避免跨NUMA内存访问;
- 核心库
- 包括系统抽象内存管理、无锁环、缓存池;
- 流分类
- 支持精准匹配、最长匹配和通配符匹配,提供常用的包处理表操作
- 软件加速库
- 一些常用的包处理软件库集合,比如IP分片、报文重组、排序等
- QoS
- 提供网络服务质量相关组件,比如限速和调度;
- 数据包分组架构
- 提供了搭建复杂的多核流水线模型的基础组件;
无锁环

-
首尾相连的数组,充当缓存
-
针对多生产者、多消费者的队列
-
不加锁,并行读写性能非常高
-
特殊点:元素定长,4字节或4字节的整数倍
内存池
内存对齐
内存条分多通道的,不同的通道空间可以同时访问
双通道:每条通道连接独立的总线;
内存空间需要对齐
- 因为连接着相同的数据总线,所以同一通道内的数据不能被同时获取

私有缓存

托普利哈希Toeplitz Hash
用于接受端数据包处理的负载均衡,尽量将数据均匀的划分到不同的CPU上,减少哈希碰撞。

DPDK的使用特点
-
DPDK本身只是2层协议栈,不提供socket接口
- 适合于软件虚拟的路由场景
-
如果要用于应用程序,提供socket抽象
-
类微内核方案:将DPDK+TCP/IP协议栈作为一个服务器,为每个应用单独维护socket fd和进程间的对应关系
-
LibOS方案:需要逐个应用添加协议栈支持
-
架构对比
-
-
有更多基于DPDK开发的完整协议栈款架
- 腾讯云的F-stack(http://f-stack.org)
- Linux基金会的Vector packer Processor(https://s3-docs.fd.io/vpp/22.06/#)
- mTCP(https://github.com/mtcp-stack/mtcp)
硬件优化方案:RDMA
在远端无感的情况下,直接读取远端内存数据,绕开内核协议栈

参考资料:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Feifanyulu's blog!
评论