1 前言
处理器性能的两个途径,一个是提高IPC(每个时钟周期内可以执行的指令条数),另一个是提高处理器主频率。每一代微架构的调整可以伴随着对IPC的提高,从而提高处理器性能,只是幅度有限。而提高处理器主频率对于性能的提升是明显而直接的,不过一位的提高频率很快会触及频率墙,毕竟处理器的功耗正比于主频的三次方。
所以,最终要取得性能提升的进一步突破,还是要回到提高IPC这个因素。经过处理器厂商的不懈努力,发现可以通过提高指令执行的并行度来提高IPC。而提高并行度主要有两种方法:
- 提高微架构的指令并行度
- 采用多核并发
2 多核性能和可扩展性
2.1 追求性能水平扩展
多核处理器是指在一个处理器中集成两个或者多个完整的内核(及计算引擎)。如果把处理器性能随着频率的提升看成是垂直扩展,那么多核处理器的出现使得性能水平扩展成为可能。原本在单核上顺序执行的任务,得以按逻辑划分成若干子任务,分别在不同的核上并行执行。在任务粒度上,指令的并行度得到了提升。
那随着核数的增加,性能是否能持续提升呢?Amdahl定律告诉我们了,其中Ws,Wp分别表示问题规模的串行分量(问题中不能进化的部分)和并行分量,p表示平行计算时序节点数量。
Amdahlg公式
当p->∞时,极限是W/Ws,其中,W= Ws+Wp。
这意味着无论如何增加平行处理器的数量,受限无法被并行处理的部分,加速比无法高于这个上限。所以结论就是 多核处理器提升固定工作量性能的关键在于降低那些不得不串行的部分占整个任务的执行比例。
那么对于DPDK的主要应用领域数据包处理来说,大部分场景不是完成一个固定工作量的任务,更关注的主要是单位时间内的吞吐量。
Guststafon 定律定义了加速比:加速比=采用改进措施前性能/采用改进措施后的性能=未采用改进措施前执行某任务时间/采用改进措施后执行某任务的时间
W'= n*W 串行部分 + (1-n)*p*W 并行部分
其中 W 为p个处理器串行+并行时完成任务的时间T2,W‘ 为1个处理器仅串行是完成任务的时间T1,p个处理器加速因子。
S = T1 / T2= W' / W= n + ( 1-n )*p,n为串行百分比任务
从公式得出多核并行计算的吞吐率随着核数增加而线性扩展,可并行处理部分占整个任务比重越高,则增长的斜率越大。那么我们带这个观点来了解DPDK,很多设计和实现的初衷就能豁然开朗,资源局部化、避免跨核共享、减少临界区碰撞、加快临界区完成速率,都不同程度地降低了不可并行部分和并发干扰部分的占比。
2.2 多核处理器
在数据包处理领域,多核处理器架构已经广泛应用。以Intel多核处理器为例,介绍DPDK中用到的概念,比如物理核,逻辑核,CPU node等。
2-1 单核结构
通过2-1图中的单核结构,我们先认识一下CPU物理核中主要的基本组件。为简化理解,将主要组件简化为这几个部分:CPU寄存器集合、中断逻辑(Local APIC)、执行单元和Cache。一个完整的物理核需要拥有这样的整套资源,提供一个指令执行线程。
2-2 多核处理器结构
多核处理器结构指的是多颗单独封装的CPU通过外部总线连接,构成统一计算机平台,如图2-2所示,每个CPU都需要独立的电路支持,有自己的Cache,而它们之间的通信是通过主板上的总线。在此架构上若一个多线程程序运行在某个CPU核上,跨CPU的线程都要走总线,而共享的数据还会付出因Cache一致性产生的开销。从内存子系统的角度,多处理器结构进一步衍生出了非一致的内存访问(NUMA),这个之前的文章中有介绍过,DPDK中对于NUMA结构,使用Socket node来标识,跨NUMA的内存访问一定是性能调优时最需要避免的。
2-3 超线程
如果说超线程还是站在一个核内部以资源切分的方式构成多个执行线程,多核体系结构2-3图中则是在一个CPU封装里放入了多个对等的物理核,每个物理核可以独立构成一个执行线程,当然也可以进一步分割成多个执行线程(采用超线程技术)。多核之间的通信使用芯片内部总线来完成,共享更低一级缓存(LLC,三级缓存)和内存。随着CPU制造工艺的提升,每个CPU封装中放入的物理核数也在不断提高。
多核体系结构
各种架构在总线占用、Cache、寄存器以及执行单元的区别大致可以归纳为:
架构 |
---|