关于linux:阿里云用到的DPDK分析原理以及学习路线

前言:随着互联网的高速倒退,云产业的疾速突起,基础架构网络逐步偏差基于通用计算平台或模块化计算平台的架构交融,来反对多样化的网络性能,传统的PC机器在分布式计算平台上的劣势更为显著。在这些针对海量数据处理或海量用户的服务场景,高性能编程显得尤为重要。

一、背景剖析

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

从整体上看 为了满足日益增长的需要次要采纳分布式集群来分担负荷,应答大量的用户申请。
在这里插入图片形容
(1)集群
从构造上来看一个节点的服务器框架蕴含:
•网络模块
•事件驱动模块
•隔离,多核业务散发模块
•业务层
•在单个节点上,核的应用来看,次要包含
•单线程服务器 长处是无竞争,毛病是没有充分利用系统资源
•多过程模型 隔离性好,利用了零碎更多的资源,毛病是过程间资源共享难
•多线程模型 充分利用系统资源,竞争须要小心解决

(2)需要剖析

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

2.kni数据流程

3.dpdk实现dns

4.dpdk高性能网关实现

5.半虚拟化virtio/vhost的减速
(3)综合剖析
•在应答网络密集型的微小数据量时,个别抉择是横向扩大节点,然而节点的增多会变相的减少设施老本和技术危险,且当集群节点到肯定的量后,节点之间的交互老本自身就会成为瓶颈。
•在特定场合下,譬如嵌入式设施上的后盾服务,服务器不可能搭建集群。

因而晋升服务器自身性能同样重要。
(4)具体分析

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

•异步模式的弊病
个别咱们应用epoll来高效的解决网络读写事件。在基于多线程的服务器设计框架中,在没有申请到来的时候,线程将会休眠,当数据到来时,将由操作系统唤醒对应的线程,也就是说内核须要负责线程间频繁的上下文切换,咱们是在依附操作系统调度零碎来服务网络包的调度。在网络负载很大的场景下只会造成核满转且一直互相切换,进一步减少负荷.那么就须要回到最原始的形式,应用轮询形式来实现所有操作,来晋升性能。

•协定栈的扩展性
Linix诞生之初就是为电话电报管制而设计的,它的管制立体和数据转发立体没有拆散,不适宜解决大规模网络数据包。并且为了全面的反对用户空间的各个性能,协定栈中嵌入了大量用于对接的接口,如果能让应用程序间接接管网络数据包解决、内存治理以及CPU调度,那么性能能够失去一个质的晋升。为了达到这个指标,第一个要解决的问题就是绕过Linux内核协定栈,因为Linux内核协定栈性能并不是很优良,如果让每一个数据包都通过Linux协定栈来解决,那将会十分的慢。像WindRiver和6 Wind Gate等公司自研的内核协定栈声称比LinuxUDP/TCP协定栈性能至多进步500%以上,因而能不必Linux协定栈就不必。不必协定栈的话当然就须要本人写驱动了,应用程序间接应用驱动的接口来收发报文。PF_RING,Netmap和intelDPDK等能够帮忙你实现这些工作,并不需要咱们本人去破费太多工夫。Intel官网测试文档给出了一个性能测试数据,在1S Sandbridge-EP 8*2.0GHzcores服务器上进行性能测试,不必内核协定栈在用户态下吞吐量可高达80Mpps(每个包解决耗费大概200 cpuclocks),相比之下,应用Linux内核协定栈性能连1Mpps都无奈达到。

•多核的可扩展性
多核的可扩展性对性能晋升也是十分重要的,因为服务器中CPU频率晋升越来越慢,纳米级工艺改良曾经是十分艰难的事件了,但能够做的是让服务器领有更多的CPU和外围,像国家超级计算中心的天河二号应用了超过3w颗XeonE5来进步性能。在程序设计过程中,即便在多核环境下也很快会碰到瓶颈,单纯的减少了处理器个数并不能线性晋升程序性能,反而会使整体性能越来越低。一是因为编写代码的品质问题,没有充分利用多核的并行性,二是服务器软件和硬件自身的一些个性成为新的瓶颈,像总线竞争、存储体专用等诸多影响性能平行扩大的因素。那么,咱们怎样才能让程序能在多个CPU外围上平行扩大:尽量让每个核保护独立数据结构;应用原子操作来防止抵触;应用无锁数据结构防止线程间互相期待;设置CPU亲缘性,将操作系统和利用过程绑定到特定的内核上,防止CPU资源竞争;在NUMA架构下尽量避免远端内存拜访。

•内存的可扩展性 内存的访问速度永远也赶不上cache和cpu的频率,为了能让性能平行扩大,最好是少拜访。 从内存耗费来看,如果每个用户连贯占用2K的内存,10M个用户将耗费20G内存,而操作系统的三级cache连20M都达不到,这么多并发连贯的状况下必然导致cache生效,从而频繁的拜访内存来获取数据。而一次内存拜访大概须要300cpuclocks,这期间CPU简直被闲暇。因而缩小访存次数来cachemisses是咱们设计的指标。指针不要随便指向任意内存地址,因为这样每一次指针的间接拜访可能会导致屡次cachemisses,最好将须要拜访的数据放到一起,不便一次性加载到cache中应用。 依照4K页来计算,32G的数据须要占用64M的页表,使得页表甚至无奈放到cache中,这样每次数据拜访可能须要两次拜访到内存,因而倡议应用2M甚至1G的大页表来解决这个问题。
(5)解决方案

•管制层留给Linux做,其它数据层全副由应用程序来解决。 缩小系统调度、零碎调用、零碎中断,上下文切换等。
•摒弃Linux内核协定栈,将数据包传输到用户空间定制协定栈
•应用多核编程技术代替多线程,将OS绑在指定核上运行
•针对SMP零碎,使CPU尽量应用所在NUMA零碎节点的内存,缩小内存刷写
•应用大页面,缩小拜访
•采纳无锁技术解竞争而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应用程序看作是一个一般的用户态过程,包含它的编译、连贯和加载形式和一般程序没有什么两样。
相干视频:
Linux服务器开发-阿里云用DPDK如何解决千万级流量并发\(上\)

Linux服务器开发-阿里云用DPDK如何解决千万级流量并发\(中\)

Linux服务器开发-阿里云用DPDK如何解决千万级流量并发\(下\)

次要有以下几个外围:
1、网络层模块
2、内存治理模块
3、内核治理模块

(1)网络模块
DPDK对从内核层到用户层的网络流程绝对传统网络模块进行了非凡解决,上面对传统网络模块构造和DPDK中的网络结构做比照。
(2)传统linux网络层
硬件中断--->取包散发至内核线程--->软件中断--->内核线程在协定栈中解决包--->处理完毕告诉用户层 用户层收包-->网络层--->逻辑层--->业务层
(3)DPDK网络层
硬件中断--->放弃中断流程 用户层通过设施映射取包--->进入用户层协定栈--->逻辑层--->业务层
1.DPDK劣势:

  • 缩小了中断次数。
  • 缩小了内存拷贝次数。
  • 绕过了linux的协定栈,进入用户协定栈,用户取得了协定栈的控制权,可能定制化协定栈升高复杂度。

2.DPDK劣势:

  • 内核栈转移至用户层减少了开发成本。
  • 低负荷服务器不实用,会造成内核空转。

3、具体分析

拦挡中断,不触发后续中断和流程流程,绕过协定栈。
如下所示,通过UIO可能重设内核中终端回调行为从而绕过协定栈后续的解决流程:

4.Trigger

无拷贝收发包,缩小内存拷贝开销 如图所示
dpdk的包全副在用户空间应用内存池治理。
内核空间与用户空间的内存交互不必进行拷贝,只做控制权转移。

5.packet trans

协定栈库 dpdk为用户提供了局部协定解决封装,使用户能轻松定制化协定栈。
(4)内存治理

1.hugepage技术

Linux零碎的内存治理依赖于存储器上,如下所示 Linux在内存治理中采纳受爱护的虚拟地址模式,在代码中地址分为3类:逻辑地址、线性地址、物理地址。程序应用具体内存简略说就是逻辑地址通过分段机制映射转化为线性地址,而后线性地址通过分页机制映射转化为物理地址的过程,而在理论应用中,仅将线性地址映射为物理地址的过程中,须要从内存中读取至多四次页目录表(Page Directory)和页表 (Page Table),为了放慢内核读取速度,CPU在硬件上对页表做了缓存,就是TLB。 线性地址先从TLB获取高速缓存内存,如果不存在就从内存表获取,如果有间接的映射,间接从内存读取,没有则产生缺页中断,从新调配物理内存,或者从硬盘上将swap读取。具体图示如下:

一般页大小是每个4K,如果是4K页的寻址如下,应用物理内存时须要多级查找能力找到对应的内存。

4K的页表是linux针对个别状况得出的适合大小,然而对于非凡利用能够通过扩充页表面积进步内存应用效率。
dpdk应用hupage的思维就是让程序尽量独占内存避免内存换出,扩充页表进步hash命中率,通过hugage技术扩充了该应用的页表大小,设定为更适宜高频内存应用程序的状态,取得了以下几点劣势。
1.无需替换。也就是不存在页面因为内存空间有余而存在换入换出的问题
2.缩小TLB负载。
3.升高page table查问负载
2.NUMA

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

dpdk内存调配上通过proc提供的内存信息,使cpu尽量应用凑近其所在节点的内存,防止拜访近程内存影响效率。

(3)内核治理模块

Affinity是过程的一个属性,这个属性指明了过程调度器可能把这个过程调度到哪些CPU上。在Linux中,咱们能够利用CPU affinity 把一个或多个过程绑定到一个或多个CPU上。CPU Affinity分为2种,soft affinity和hard affinity。soft affinity仅是一个倡议,如果不可避免,调度器还是会把过程调度到其它的CPU上。hard affinity是调度器必须恪守的规定。为什么须要CPU绑定?
•减少CPU缓存的命中率CPU之间是不共享缓存的,如果过程频繁的在各个CPU间进行切换,须要一直的使旧CPU的cache生效。如果过程只在某个CPU上执行,则不会呈现生效的状况。在多个线程操作的是雷同的数据的状况下,如果把这些线程调度到一个处理器上,大大的减少了CPU缓存的命中率。然而可能会导致并发性能的升高。如果这些线程是串行的,则没有这个影响。
•适宜time-sensitive利用在real-time或time-sensitive利用中,咱们能够把零碎过程绑定到某些CPU上,把利用过程绑定到残余的CPU上。典型的设置是,把利用绑定到某个CPU上,把其它所有的过程绑定到其它的CPU上。
(4)核治理构造

dpdk启动时会建设会剖析零碎的逻辑核属性建设映射表并对立治理,每个核次要属性如下:

每个核属性包含逻辑核id, 硬核id, numa节点id。dpdk会依据零碎默认状态生成一一绑定的映射表,用户能够依据需要更改映射表,后续dpdk框架会依据该映射表进行核绑定。

`class core{

lcore_id;           //逻辑核id
core_id;            //硬核id
socket_id;         //NUMA节点id

}
class core coremap[ ] //所有逻辑核的映射表`

(5)多核调度框架
•服务器启动时选取一个逻辑核做主核
•而后启动其余核做从核
•所有线程都依据映射表做核绑定
•管制核次要实现pci,内存,日志等零碎的初始化
•从核启动后期待主核初始化结束后挂载业务解决入口
•从核运行业务代码

(6)竞争解决
•多线程在构建服务器时经常要解决竞争问题,dpdk提供了反对多个线程操作的无锁循环队列来躲避抵触,替换数据。
•数据包等须要大量重复使用的构造能够互相隔离,线程持有独立的可用内存池。
(七)性能剖析
Seastar是开源的C++框架用于构建在古代硬件上构建高性能的服务器利用。该框架基于DPDK,利用Seastar开发的利用能够运行在Linux或OSv之上。

上面是seastar的介绍以及利用其开发的内存服务器与其余服务器的比照,可见dpdk性能绝对传统框架有肯定劣势,且在网络密集型的场景下成果很好。
`Seastar uses a shared-nothing model that shards all requests onto individual cores.
Seastar offers a choice of network stack, including conventional Linux networking for ease of development, DPDK for fast user-space networking on Linux, and native networking on OSv.
an advanced new model for concurrent applications that offers C++ programmers both high performance and the ability to create comprehensible, testable high-quality code.
a design for sharing information between CPU cores without time-consuming locking.`

三、扩大

(1)热更新

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

(2)底层转发

如下图所示,大部分程序交互时是在传输层及以上,但DPDK从二层切入,在构建集群须要大规模转发数据时能够应用三层转发,这样将使数据包转发升高1层协定栈的开销。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理