概述

随着互联网的高速发展,云产业的快速突起,基础架构网络逐渐偏向基于通用计算平台或模块化计算平台的架构融合,来支持多样化的网络功能,传统的PC机器在分布式计算平台上的优势更为明显。在这些针对海量数据处理或海量用户的服务场景,高性能编程显得尤为重要。

全文路线

背景分析

前10年中,网络程序性能优化的目标主要是为了解决C10K问题,其研究主要集中在如何管理数万个客户端并发连接,各种I/O框架下如何进行性能优化,以及操作系统参数的一些优化。当前,解决C10K问题的服务器已经非常多。Nginx和Lighttpd两款非常优秀的基于事件驱动的web服务框架,Tornado和Django则是基于python开发的非阻塞的web框架这些软件使得C10K已经不再是问题了。

dpdk详解 DPDK分析原理以及学习路线(1)

集群

需求分析DPDK学习路线以及视频讲解后台私信【架构】获取

1.dpdk PCI原理与testpmd/l3fwd/skeletion

2.kni数据流程

3.dpdk实现dns

4.dpdk高性能网关实现

5.半虚拟化virtio/vhost的加速

dpdk详解 DPDK分析原理以及学习路线(2)

综合分析

因此提升服务器本身性能同样重要。

具体分析

传统服务器可能有下面的潜在问题

解决方案

而DPDK恰好为我们提供了解决问题的脚手架。

DPDK概述

Intel® DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不同于Linux系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。目前已经验证可以运行在大多数Linux操作系统上,包括FreeBSD 9.2、Fedora release18、Ubuntu 12.04 LTS、RedHat Enterprise Linux 6.3和Suse EnterpriseLinux 11 SP2等。DPDK使用了BSDLicense,极大的方便了企业在其基础上来实现自己的协议栈或者应用。需要强调的是,DPDK应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。Linux内核将DPDK应用程序看作是一个普通的用户态进程,包括它的编译、连接和加载方式和普通程序没有什么两样。

总体结构

主要有以下几个核心

网络模块总体分析

DPDK对从内核层到用户层的网络流程相对传统网络模块进行了特殊处理,下面对传统网络模块结构和DPDK中的网络结构做对比

传统linux网络层:

硬件中断--->取包分发至内核线程--->软件中断--->内核线程在协议栈中处理包--->处理完毕通知用户层 用户层收包-->网络层--->逻辑层--->业务层

dpdk网络层:

硬件中断--->放弃中断流程 用户层通过设备映射取包--->进入用户层协议栈--->逻辑层--->业务层

对比后总结

dpdk优势:

dpdk劣势

具体分析

dpdk详解 DPDK分析原理以及学习路线(3)

trigger

dpdk详解 DPDK分析原理以及学习路线(4)

packet trans

内存管理hugepage技术

Linux系统的内存管理依赖于存储器上,如下所示Linux在内存管理中采用受保护的虚拟地址模式,在代码中地址分为3类:逻辑地址、线性地址、物理地址。程序使用具体内存简单说就是逻辑地址通过分段机制映射转化为线性地址,然后线性地址通过分页机制映射转化为物理地址的过程,而在实际使用中,仅将线性地址映射为物理地址的过程中,需要从内存中读取至少四次页目录表(Page Directory)和页表 (Page Table),为了加快内核读取速度,CPU在硬件上对页表做了缓存,就是TLB。线性地址先从TLB获取高速缓存内存,如果不存在就从内存表获取,如果有直接的映射,直接从内存读取,没有则产生缺页中断,从新分配物理内存,或者从硬盘上将swap读取。具体图示如下:

dpdk详解 DPDK分析原理以及学习路线(5)

hupage.jpg

普通页大小是每个4K,如果是4K页的寻址如下,使用物理内存时需要多级查找才能找到对应的内存

dpdk详解 DPDK分析原理以及学习路线(6)

page-1.gif

4K的页表是linux针对一般情况得出的合适大小,然而对于特殊应用可以通过扩大页表面积提高内存使用效率。

dpdk使用hupage的思想就是让程序尽量独占内存防止内存换出,扩大页表提高hash命中率,通过hugage技术扩大了该使用的页表大小,设定为更适合高频内存使用程序的状态,获得了以下几点优势。

NUMA

为了解决单核带来的CPU性能不足,出现了SMP,但传统的SMP系统中,所有处理器共享系统总线,当处理器数目越来越多时,系统总线竞争加大,系统总线称为新的瓶颈。NUMA(非统一内存访问)技术解决了SMP系统可扩展性问题,已成为当今高性能服务器的主流体系结构之一。NUMA系统节点一般是由一组CPU和本地内存组成。NUMA调度器负责将进程在同一节点的CPU间调度,除非负载太高,才迁移到其它节点,但这会导致数据访问延时增大。下图是2颗CPU支持NUMA架构的示意图,每颗CPU物理上有4个核心。

dpdk内存分配上通过proc提供的内存信息,使cpu尽量使用靠近其所在节点的内存,避免访问远程内存影响效率。

dpdk详解 DPDK分析原理以及学习路线(7)

numa.png

内核管理模块

Affinity是进程的一个属性,这个属性指明了进程调度器能够把这个进程调度到哪些CPU上。在Linux中,我们可以利用CPU affinity 把一个或多个进程绑定到一个或多个CPU上。CPU Affinity分为2种,soft affinity和hard affinity。soft affinity仅是一个建议,如果不可避免,调度器还是会把进程调度到其它的CPU上。hard affinity是调度器必须遵守的规则。为什么需要CPU绑定?

核管理结构

dpdk启动时会建立会分析系统的逻辑核属性建立映射表并统一管理,每个核主要属性如下.

每个核属性包括逻辑核id, 硬核id, numa节点id。dpdk会根据系统默认状态生成一一绑定的映射表,用户可以根据需求更改映射表,后续dpdk框架会根据该映射表进行核绑定。

class core{ lcore_id; //逻辑核id core_id; //硬核id socket_id; //NUMA节点id } class core coremap[ ] //所有逻辑核的映射表

多核调度框架

dpdk详解 DPDK分析原理以及学习路线(8)

thread

竞争处理性能分析

Seastar是开源的C 框架用于构建在现代硬件上构建高性能的服务器应用。该框架基于DPDK,利用Seastar开发的应用可以运行在Linux或OSv之上。

下面是seastar的介绍以及利用其开发的内存服务器与其他服务器的对比,可见dpdk性能相对传统框架有一定优势,且在网络密集型的场景下效果很好。

dpdk详解 DPDK分析原理以及学习路线(9)

性能分析

扩展热更新

DPDK在多线程管理上隔离性相当好,主核和从核通过管道进行命令交互,主核可以轻松的将业务下发给从核,因此可以很容易的利用这个特点做业务接口热更新支持。

底层转发

如下图所示,大部分程序交互时是在传输层及以上,但DPDK从二层切入,在构建集群需要大规模转发数据时可以使用三层转发,这样将使数据包转发降低1层协议栈的开销.

dpdk详解 DPDK分析原理以及学习路线(10)

7层模型

,