接下来讲讲
NUMA
策略,也就是为了更好的利用NUMA来给咱们干活:
为描述在
NUMA
架构下针对内存访问的优化,我们可以引入
NUMA
策略的概念。
NUMA
策略
(NUMA Policy)
即是指在多个节点上合理的进行内存分配的机制。对于不同软件设计要求,策略的目标可能会不同:有一些设计可能强调低延迟访问,另一些则可能更加看重内存的访问带宽。
对于强调低延迟访问的设计,基本的分配方式就是尽量在线程的本地内存上为其进行分配,
并尽量让线程保持在该节点上。这被称为线程的节点亲和性
(Node affinity)
。这样既充分利用了本地内存的低延迟,
同时也能有效降低节点间的通信负担。
NUMA
架构的一个优势是,即便是在拥有大量
CPU
的大规模系统中,我们也可以保证局部内存访问的低延迟。通常来讲,
CPU
的处理速度是远大于内存的存取速度的。在读写内存时,
CPU
常常需要花大量的时钟周期来等待。降低内存访问的延迟因而能够有效的提升软件性能。
另外,为
SMP
设计的操作系统通常会有缓存亲和性
(Cache Affinity)
的优化措施。缓存亲和性机制可以让数据尽量长时间的保留在某一个
CPU
的缓存中,而不是来回在多个
CPU
的缓存里换来换去。操作系统通常是通过优化进行线程
/
进程调度来保证这一点:在线程被重新调入时,调度器会尽量让线程在之前运行的同一个
CPU
上运行,从而保证缓存利用率。这一机制显然是和
NUMA
系统尽量利用本地内存的策略是一致的,有利于面向
SMP
系统的程序向
NUMA
架构移植。
但缓存亲和性机制同
NUMA
系统的节点亲和性又是有区别的:首先,同一个节点间多个
CPU
或者核的线程迁移并不影响该线程的节点亲和性;其次,当线程被迫迁移到其他节点时,他所拥有的内存是不会跟着迁移的,
仍然保留在原来位置。这个时候,本地内存就变成了远端内存,对它的访问既慢又占用节点通信带宽。相对的,线程在迁移之后能够以较小的代价迅速建立起新的缓存,并继续在新
CPU
上体现缓存的亲和优势。
因此,
NUMA
系统对于节点亲和性的依赖更大。
操作系统的调度器同时也不能仅仅为保证节点亲和性做优化。因为通常相对于频繁访问远端内存来说,让
CPU
空闲带来的性能损失更大。如果特定应用系统的性能受内存访问的影响远大于
CPU
的利用率,这个时候程序员或者管理员则可采用特别的
NUMA
策略来强调节点的亲和性,从而提升性能。
另外
,
尽管大部分应用会因为优化响应时间而收益,还有一部分应用则对内存带宽比较敏感。为了提升内存带宽,
NUMA
架构下的多个内存控制器可以并行使用。这类似于
RAID
阵列通过并行处理磁盘
IO
来提升读写性能。通过适当的软件或者硬件机制,
NUMA
架构可以使内存控制单元在各个内存控制器上交替的分配内存。这意味着分配得到的连续内存页面会水平地分布到各个节点上。当应用程序对内存进行流式读写时,各个内存控制器的带宽就相当于累加了。此机制获得性能提升决定于
NUMA
架构的实现。对于远端内存访问延迟严重的架构,该提升往往会比较明显。在一些
NUMA
系统中,系统硬件本身提供了节点交织分配机制;而在没有硬件提供节点交织的系统中,可由操作系统来实现该机制。
本文转自Intel_ISN 51CTO博客,原文链接:http://blog.51cto.com/intelisn/130462,如需转载请自行联系原作者