Intel推出的DPDK开发包,有哪些值得关注的关键技术?

作者: 孙泳勇
2016-12-28
614
原创
所谓“人尽其才,物尽其用”,应用系统如果要达到极高的效率,除了需要采购高效的硬件设备之外,如何充分地发挥这些硬件的性能,也是至关重要的一步。

 首先我们需要充分了解这些硬件,以合理地协调调用,使硬件充分发挥它们的作用;作为全球最大的个人计算机零件和CPU制造商Intel,他们对硬件可以说是“了若指掌”;如果能站在他们的层面来了解如何充分发挥硬件的性能,就能达到事半功倍的效果。


近日,Intel提供了一套名为“DPDK”的开源代码库,可以作为洞悉高性能之道的一个窗口。下面我们简单介绍一下DPDK的几个关键技术: 


户态驱动

用户态驱动是指大部分代码运行在用户态,只有小部分代码运行在内核态的驱动程序运行模式。由于这种模式能够在用户态直接操作硬件设备,不用经过系统调用,这样不仅避免了因系统调用带来的线程切换,而且省掉了从用户态到内核态的数据拷贝过程。
 
线程切换对性能的影响或许很多人都不会太关心,因为它的耗时在几毫秒级,对于需要文件读写、数据库操作、网络访问的业务流程,当大量业务并发时,瓶颈必然不会是线程切换。然而高性能不仅仅是高并发,它还包括低延时,当你开始关注这一点时,你会发现线程切换的几毫秒已经严重影响到了你的性能。
 

从用户态到内核态的数据拷贝就更加少有人关注了,一般小数据块的拷贝耗时在几百纳秒级。但是如果要做极速的业务处理系统,当大量发生这种内存拷贝,而其他可优化的地方都已经优化到极致时,这几百纳秒的耗时也是非常显眼的。


大页内存

大页内存主要是指Linux 操作系统采用的基于hugetlbfs特殊文件系统2M字节大页面支持的功能。


在 Linux 操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为4KB,因而将会产生较多TLB Miss和缺页中断,从而大大影响应用程序的性能。当操作系统以2MB 甚至更大作为分页的单位时,将会大大减少TLB Miss和缺页中断的数量,显著提高应用程序的性能。


假设应用程序需要2MB的内存,而操作系统以4KB作为分页的单位,则需要512个页面,进而在TLB中需要512个表项,同时也需要512个页表项,操作系统需要经历至少512次TLB Miss和512次缺页中断才能将2MB应用程序空间全部映射到物理内存。


然而,当操作系统采用2MB作为分页的基本单位时,只需要一次TLB Miss和一次缺页中断,就可以为2MB的应用程序空间建立虚实映射,并在运行过程中无需再经历TLB Miss和缺页中断。


轮询方式

轮询方式主要是指在接收网卡数据时不再依赖硬件中断,而是通过主动轮询去获取网卡的数据。

中断模式下,网卡收到数据后会发起硬件中断,然后由内核的中断处理程序处理网卡的硬件中断,但是当大量硬件中断发生时,势必会影响性能的处理。而轮询模式是循环不断地去检测网卡是否已经收到数据,一旦数据到达或者大量数据到达就立刻处理,不用经过中断的调度,这样一方面提高了响应速度,又省去了执行中断处理程序的耗时。


绑定CPU

绑定CPU是指某个线程被系统调度时永远都被分配到同一个CPU上。这样就避免了线程在不同CPU间切换的情况,能够充分利用CPU的高速缓存。
 
现代CPU的工作频率已经达到相当高的速度,而内存总线的频率与内存芯片的性能却没有跟上这个速度,已经严重影响了CPU处理数据的能力,所以现代CPU都配置了独立的高速缓存,访问一次基本在1纳秒左右,而访问一次内存将近要耗费100纳秒的时间。因此,我们可以发现,充分利用CPU缓存能让程序提升100倍的速度。

高效的内存管理

DPDK中除使用了大页技术之外,还使用了一种进程间共享同一段虚拟地址空间的技术,这样一来,在跨进程的场景中,数据能够非常高效地在进程间传递。
 

假设主进程只做接收网卡数据的工作,其他三个工作进程将处理这些数据并作出应答,那么主进程需要将接收到的数据传递给这三个工作进程。


通过一块连续共享并且地址空间相同的内存来进行传递,一方面便于内存的分配和管理,另一方面使数据不需再发生拷贝。主进程与三个工作进程分别用三个无锁的循环队列进行对接,然后通过队列将接收到的数据分别传递到三个工作进程。

几项关键技术罗列完后大家是否发现,虽然说DPDK是为Intel网卡量身打造的,但是就这些关键技术而言其实跟网卡没有任何关系,这些技术完全是通用的,可以被广泛地应用到我们的业务代码中,尤其是当下金融行业火热的极速交易。在严峻的竞争局势下,只有探索和前行,才能立于不败之地。


版权所有 侵权必究

如需转载请联系

0571-28829811