A NUMA API for LINUX(numa架构)
标签:
NUMA简介在传统的对称多处理器(SMP, Symmetric Multiprocessing)系统中,整个计算机中的所有cpu共享一个单独的内存控制器。当所有的cpu同时访问内存时,这个内存控制器常常成为性能瓶颈。同时,这种架构也不能适应使用大量的cpu的场景。于是,为了解决这些问题,越来越多的现代计算机系统采用了CC/NUMA(缓存一致性/非对称访存)架构。例如AMD* Opteron*, IBM* Power5*, HP* Superdome, and SGI* Altix*.
在SMP系统上,所有的cpu对共享内存控制器拥有相同的访问权限。cpu之间的访问这个共享资源的请求会导致拥塞。这个单独的内存控制器能够管理的内存大小也是有限的,很可能限制了整个系统的内存大小。另外,通过这个单独的通信中心也会导致时延高居不下。
于是,NUMA架构就被设计出来,解决SMP架构在扩展性方面的诸多限制。与SMP架构中整个系统只有一个内存控制器不同,NUMA系统中被分成多个node。每个node都有处理器和它自己控制的内存。这些处理器可以非常快速的访问node内部的本地内存。系统上所有的node使用一个快速的互联总线连接起来。每个新node加入,都会给系统提供更多的内存总带宽和内存访问性能,所以具备很高的扩展能力。
同一个node内部的处理器(一个numa node可能拥有多个cpu core)对于node内部的内存具有相同的读写能力。在一个numa系统中,cpu集成了内存控制器,例如AMD Opteron,一个numa node由一个单独的cpu组成,整个cpu具备了多个core或者多个处理线程。在其他更传统的NUMA系统中,例如SGI Altix或HP Superdome,大量的numa node(node内部类似一个SMP系统)由2个或4个cpu共享内存。
在一个NUMA系统中,每个cpu可以访问本地或者远端的内存,本地的内存位于同一个numa node中,cpu访问本地内存的时延开销很小。远端内存位于不同的numa node中,必须通过内部互联(例如QPI)才能访问。从软件的角度看来,访问远端内存与访问本地内存的方法相同;具有完全的缓存一致性。相对访问本地内存,访问远端内存要花费更长的时间,这是因为数据通过内部互联总线读取,导致了更多的时延。
理论上,软件可以按照相同的方式对待NUMA系统与SMP系统,忽略掉访问本地、远端内存的区别。实际上,也是经常这么做的。但是为了获得最佳的性能,应该考虑到NUMA、SMP架构差异引入的问题。
NUMA架构的一大优势就是:即使在一个拥有很多cpu的大系统中,cpu仍然能够以很低的时延访问本地内存。这是因为现代cpu的速度比内存芯片的速度快了很多。CPU经常要花费不小的时间来等待内存数据。最小化内存访问时延,可以显著的优化软件的性能。
NUMA的优化方式是:将内存通过特定node分配,并且让程序尽量快的读取这段内存。实现这种优化的首要方法是,线程通过node分配本地内存,并且保证这个线程一直工作在这个node上(通过node affinity来确定)。这将会获得最低的时延,最小的内部互联开销。
在SMP系统中,通常的优化方式被称为cache affinity。cache affinity尝试将数据维持在cpu的缓存中,而不是频繁的在cpu之间切换。这项工作通常有操作系统的调度器来完成。然后,这与node affinity有很大的不同点:在SMP系统中,当一个线程在cpu之间切换,它的缓存内容也跟着一同移动。一但一个内存区域被提交给一个特定的NUMA node,它将不会被一同调度到其他的numa node上。一个线程在不同node上切换,会增加访问内部互联总线的开销,导致访问时延的上升。这是为何NUMA系统比SMP系统更加需要实现node affinity。所以,cache affinity也是需要在NUMA系统上采用的优化手段。但是这些方法对于最佳的使用性能,并不足够。
The scheduler in the operating system cannot always optimize purely for node affinity, however. The problem is that not using a CPU in the system would be even worse than a process using remote memory and seeing higher memory latency. In cases where memory performance is more important than even use of all CPUs in the system,the application or the system administrator can override the default decisions of the operating system. This allows better optimization for specific workloads.
Linux上有系统调用用来将线程绑定到特定的cpu上(通过sched_set_affinity系统调用和schedutils库)。NUMA API拓展了这些功能,允许程序从特点的numa node上分配内存。为了使用户态程序能够更容易的优化NUMA配置,API导出了NUMA的拓扑信息,并且允许用户指定要使用的cpu和内存资源。同时,也有内核态的API为内核子系统提供了NUMA拓扑信息。
NUMA API可以描述线程与cpu、内存的布置情况。主要是用来关联内存的所在位置。另外,应用程序可以用它来单独设置cpu affinity。NUMA API当前(2005年)在SUSE LINUX Enterprise Server 9版本基于AMD64和Intel安腾系列处理器。
带宽优化温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66544.html
- 上一篇:WINDOWS消息和窗口简介
- 下一篇:ASP.NET开发规范:OWIN