numa相关的工具
随着NUMA架构的不断发展,现在NUMA架构已经成为了企业级数据中心的主流。
然而,NUMA架构在性能调优方面面临了新的挑战,例如内存分配的问题在NUMA系统之前并没人感兴趣,而numastat命令提供了一个监测NUMA架构的工具。
numastat
显示每个per-NUMA-node的统计数据。
对于系统中的每个节点,内核维护了一些有关NUMA分配状态的统计数据。numastat命令会基于节点对内存的申请,分配,转移,失败等等做出统计,也会报告NUMA策略的执行状况。这些信息对于测试NUMA策略的有效性是非常有用的。
[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numastat -a node0 node1 numa_hit 1453391677 1610480305 numa_miss 154554297 161470711 numa_foreign 161470711 154554297 interleave_hit 20016 20014 local_node 1453279663 1610457366 other_node 154666311 161493650
numactl
numactl的主要功能包括:
1. 设定进程的内存分配基本策略
2. 限定内存分配范围,如某一特定节点或部分节点集合
3. 对进程进行节点或节点集合的绑定
4. 修改命名共享内存,tmpfs或hugetblfs等的内存策略
5. 获取当前策略信息及状态
6. 获取NUMA硬件拓扑
numactl 查看节点的分布情况
[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl -H available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 8 9 10 11 node 0 size: 24567 MB node 0 free: 20763 MB node 1 cpus: 4 5 6 7 12 13 14 15 node 1 size: 24576 MB node 1 free: 20303 MB node distances: node 0 1 0: 10 20 1: 20 10
numactl 设定进程NUMA策略
[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl --cpubind=0 --membind=0,1 program 在节点0上的CPU运行名为program的程序,并且只在节点0,1上分配内存。Cpubind的参数是节点编号,而不是cpu编号。在每个节点上有多个CPU的系统上,编号的定义顺序可能会不同。
numactl 更改共享内存段的分配策略
[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl --length=1G --file=/dev/shm/interleaved --interleave=all 对命名共享内存interleaved进行设置,其策略为全节点交织分配,大小为1G。
non-NUMA vs NUMA
从系统架构来说,目前的主流企业服务器基本可以分为三类:
SMP (Symmetric Multi Processing,对称多处理架构)
NUMA (Non-Uniform Memory Access,非一致存储访问架构)
MPP (Massive Parallel Processing,海量并行处理架构)
SMP(Symmetric Multi Processing)
SMP是非常常见的一种架构。在SMP模式下,多个处理器均对称的连接在系统内存上,所有处理器都以平等的代价访问系统内存。
特点是: 对内存的访问是平等、一致的;
缺点是:大家都是一致的,在传统的 SMP 系统中,所有处理器都共享系统总线,因此当处理器的数目增多时,系统总线的竞争冲突迅速加大,系统总线成为了性能瓶颈,所以目前 SMP 系统的处理器数目一般只有数十个,可扩展性受到很大限制。
MPP (Massive Parallel Processing)
MPP则是逻辑上将整个系统划分为多个节点,每个节点的处理器只可以访问本身的本地资源,是完全无共享的架构。节点之间的数据交换需要软件实施。它的优点是可扩展性非常好;缺点是彼此数据交换困难,需要控制软件的大量工作来实现通讯以及任务的分配、调度,对于一般的企业应用而言过于复杂,效率不高。
NUMA(Non-Uniform Memory Access)
NUMA架构则在某种意义上是综合了SMP和MPP的特点:逻辑上整个系统也是分为多个节点,每个节点可以访问本地内存资源,也可以访问远程内存资源,但访问本地内存资源远远快于远程内存资源。
它的优点是兼顾了SMP和MPP的特点, 易于管理,可扩充性好;缺点是访问远程内存资源的所需时间非常的大。相对于SMP,每个计算机不再只有唯一的内存控制器,而是把整个系统分成多个节点。每个节点分别有自己的处理器和内存。系统中所有的节点都通过全互联的方式连接。所以,每当在系统中增加新的节点,系统所能够支持的内存和带宽都会增加。在实际系统中使用比较广的是SMP和NUMA架构。像传统的英特尔IA架构就是SMP,而很多大型机采用了NUMA架构。
现在已经进入了多核时代,随着核数的越来越多,对于内存吞吐量和延迟有了更高的要求。正是考虑到这种需求,NUMA架构出现在了最新的英特尔下一代Xeon处理器中。
Xeon
Intel QuickPath Interconnect (Intel QPI)技术
使用QPI架构代替了原来的FSB架构,QPI是基于数据包传输,高带宽低延迟的点到点传输技术,速度可以达到6.4GT/s,对双向传输的QPI总线连接来说理论最大值可以达到25.6GB/s的数据传输,远远高于原来基于FSB架构的数据带宽。具体平台的实现中QPI连接数目可以根据目标市场和系统复杂性而有所不同,表现出极大的灵活性和扩展性。
FSB和QPI的对比图。
QPI可以实现不同CPU之间数据的快速传输。
Xeon中,同一CPU的不同core之间数据的快速传输,可以通过cache共享实现。
Intel QuickPath 集成内存控制器(IMC)
在每一个socket上集成了独立的DDR3内存控制器(IMC)供接口访问内存,较之非IMC的平台,大大提高了带宽(使用DDR3-1333可以达到32GB/s的峰值带宽,较之以前的平台具有四到六倍的带宽提升),显著地降低了内存延迟,从而提升了性能,为每个CPU提供了访问本地内存资源的快速通道。与前一代平台不同的是,内存访问采用NUMA架构,对于NUMA-aware的应用来说可以得到更大的性能提升。DDR3的IMC最大支持到每个CPU接口96GB的DDR3内存容量,将来最大容量可以达到144GB,为高端的企业运算提供了强有力的内存支持。
改进的电源管理
集成在芯片上的电源管理使得能耗的控制更加高效。
同步多线程技术(SMT)
同步多线程技术使得每个核心可以同时执行2个线程,所以对于4核的CPU来说,就可以在每个处理器芯片上达到最大8个逻辑处理器。
NUMA的内存组织
在NUMA系统中,每个CPU可以访问两种内存:本地内存(Local Memory)和远端内存(Remote Memory)。和CPU在同一个节点的内存称为本地内存,访问延迟非常低。和CPU在不同节点上的内存叫做远端内存,CPU需要通过节点互联方式访问,所以访问延迟要比访问本地内存长。
对于常规的内存操作,如清空(Memset),块复制(Memcpy),流读写(Stream),指针追溯(Pointer Chase)等操作来说,本地内存的访问速度要远远优于远端内存。
访问远端内存的开销与访问本地内存的开销比率称为 NUMA 比率。如果 NUMA 比率为 1,则它是对称多处理 (SMP)。比率越高,访问其他节点内存的开销就越大。不支持 NUMA 的 应用程序有时在 NUMA 硬件上的执行效果非常差。
NUMA的内存策略
NUMA策略(NUMA Policy)即是指在多个节点上合理的进行内存分配的机制。对于不同软件设计要求,策略的目标可能会不同:有一些设计可能强调低延迟访问,另一些则可能更加看重内存的访问带宽。
低延迟访问(low latency)的设计
对于强调低延迟访问的设计,基本的分配方式就是尽量在线程的本地内存上为其进行分配, 并尽量让线程保持在该节点上。这被称为线程的节点亲和性(Node affinity)。这样既充分利用了本地内存的低延迟, 同时也能有效降低节点间的通信负担。
NUMA架构的一个优势是,即便是在拥有大量CPU的大规模系统中,我们也可以保证局部内存访问的低延迟。通常来讲,CPU的处理速度是远大于内存的存取速度的。在读写内存时,CPU常常需要花大量的时钟周期来等待。降低内存访问的延迟因而能够有效的提升软件性能。
节点亲和性 VS 缓存亲和性
为SMP设计的操作系统通常会有缓存亲和性(Cache Affinity) 的优化措施。缓存亲和性机制可以让数据尽量长时间的保留在某一个CPU的缓存中,而不是来回在多个CPU的缓存里换来换去。操作系统通常是通过优化进行线程/进程调度来保证这一点:在线程被重新调入时,调度器会尽量让线程在之前运行的同一个CPU上运行,从而保证缓存利用率。这一机制显然是和NUMA系统尽量利用本地内存的策略是一致的,有利于面向SMP系统的程序向NUMA架构移植。
但缓存亲和性机制同NUMA系统的节点亲和性又是有区别的:首先,同一个节点间多个CPU或者核的线程迁移并不影响该线程的节点亲和性;其次,当线程被迫迁移到其他节点时,他所拥有的内存是不会跟着迁移的, 仍然保留在原来位置。这个时候,本地内存就变成了远端内存,对它的访问既慢又占用节点通信带宽。相对的,线程在迁移之后能够以较小的代价迅速建立起新的缓存,并继续在新CPU上体现缓存的亲和优势。 因此,NUMA系统对于节点亲和性的依赖更大。
代价:本地内存访问 < 远程内存访问 < CPU空闲
操作系统的调度器同时也不能仅仅为保证节点亲和性做优化。因为通常相对于频繁访问远端内存来说,让CPU空闲带来的性能损失更大。如果特定应用系统的性能受内存访问的影响远大于CPU的利用率,这个时候程序员或者管理员则可采用特别的NUMA策略来强调节点的亲和性,从而提升性能。
内存的访问带宽(high bandwidth)的设计
另外, 尽管大部分应用会因为优化响应时间而收益,还有一部分应用则对内存带宽比较敏感。为了提升内存带宽,NUMA架构下的多个内存控制器可以并行使用。这类似于RAID阵列通过并行处理磁盘IO来提升读写性能。通过适当的软件或者硬件机制,NUMA架构可以使内存控制单元在各个内存控制器上交替的分配内存。这意味着分配得到的连续内存页面会水平地分布到各个节点上。当应用程序对内存进行流式读写时,各个内存控制器的带宽就相当于累加了。此机制获得性能提升决定于NUMA架构的实现。对于远端内存访问延迟严重的架构,该提升往往会比较明显。在一些NUMA系统中,系统硬件本身提供了节点交织分配机制;而在没有硬件提供节点交织的系统中,可由操作系统来实现该机制。
参考资料: http://www.360doc.com/content/11/1219/18/2245786_173438994.shtml