一、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