DPDK 网络IO 优化

一、Linux + x86网络IO瓶颈

1.传统的收发报文方式都必须采用硬中断来做通讯,每次硬中断大约消耗100微秒,这还不算因为终止上下文所带来的Cache Miss。

2.数据必须从内核态用户态之间切换拷贝带来大量CPU消耗,全局锁竞争。

3.收发包都有系统调用的开销。

4.内核工作在多核上,为可全局一致,即使采用Lock Free,也避免不了锁总线、内存屏障带来的性能损耗。

5.从网卡到业务进程,经过的路径太长,有些其实未必要的,例如netfilter框架,这些都带来一定的消耗,而且容易Cache Miss。

 由于包处理任务存在内核态与用户态的切换,以及多次的内存拷贝,系统消耗变大,以CPU为核心的系统存在很大的处理瓶颈。为了提升在通用服务器(COTS)的数据包处理效能,Intel推出了服务于IA(Intel Architecture)系统的DPDK技术。

二、DPDK原理

    DPDK是Data Plane Development Kit的缩写。简单说,DPDK应用程序运行在操作系统的User Space,利用自身提供的数据面库进行收发包处理,绕过了Linux内核态协议栈,以提升报文处理效率。

 

左边是原来的方式数据从 网卡 -> 驱动 -> 协议栈 -> Socket接口 -> 业务

右边是DPDK的方式,基于UIO(Userspace I/O)旁路数据。数据从 网卡 -> DPDK轮询模式-> DPDK基础库 -> 业务

DPDK支持的CPU体系架构:x86、ARM、PowerPC(PPC)

三、DPDK的主要组件:

PMD:Pool Mode Driver,轮询模式驱动,通过非中断,以及数据帧进出应用缓冲区内存的零拷贝机制,提高发送/接受数据帧的效率
流分类:Flow Classification,为N元组匹配和LPM(最长前缀匹配)提供优化的查找算法
环队列:Ring Queue,针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销
MBUF缓冲区管理:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧,供应用程序使用
EAL:Environment Abstract Layer,环境抽象(适配)层,PMD初始化、CPU内核和DPDK线程配置/绑定、设置HugePage大页内存等系统初始化

四、Linux 网络报文处理流程如下:
NIC RX/TX queues<-->Ring Buffers<-->Driver<-->Socket<-->App
其瓶颈如下:

  • 昂贵的系统调用 (System calls)
  • Blocking  I/O 的上下文切换 (Context switching on blocking I/O)
  • 网络报文在kernel 和 user space之间的复制 (Data Copying from kernel to user space)
  • kernel 的终断(Interrupt) 处理 包括软硬终断(  Interrupt handling in kernel)

针对以上瓶颈DPDK从网卡driver上解决问题:

网络报文在DPDK的处理流程:
NIC RX/TX queues<-->Ring Buffers<-->DPDK<-->App

更准确的说,DPDK不仅仅是网卡PMD (Poll Mode Driver) Driver library,DPDK还包含内存优化管理,thread 管理等等.

  • 处理器粘合性 (Processor affinity)
  • 大内存页提高CPU 缓存使用率, 减少主内存swap (Huge pages( no swap, TLB))
  • kernel提供的UIO (User space I/O), 去除Kernel和User space之间的网络报文复制 ((no copying from kernel))
  • Poll Mode Driver (PMD) 去除终断(Interrupt)处理模式的瓶颈 (Polling (no interrupts overhead))
  • 无锁同步机制 (Lockless synchronization(avoid waiting))
  • 网络报文批处理 (Batch packets handling)
  • 利用CPU SSE指令特性.
  • 处理器本地内存使用特性 CPU NUMA awareness


五、mTCP解决Linux TCP/IP, socket system call 瓶颈的

mTCP 设计原理
首先kernel 具有以下局限性:

无TCP connection 处理器粘合性 (Lack of  connection locality) - 处理网络报文终断的CPU可能和运行应用程序的CPU不一致

运行程序文件字符 (File descriptor) 共享限制可用文件字符数. ( Shared file descriptor space)

单个网络报文处理 (Inefficient per-packet processing)

系统调用成本高 System call overhead

mTCP 设计特性:

批处理网络报文, TCP stream 以去除系统调用成本 (Batching in packet I/O, TCP processing, user applications ( reduce system call overhead))

多处理器系统上,同一连接在同一处理器上处理以提高处理器缓存使用率 (Connection locality on multicore systems - handling same connection on same core, avoid cache pollution (solve connection locality))

mTCP 线程之间不分享文件字符 ( No descriptor sharing between mTCP thread)

mTCP 网络报文处理流程:

DPDK/Netmap<-->mTCP thread<-->mTCP socket/epoll<-->mTCP App thread
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值