现在的机器上都是有多个cpu和多个内存块的。以前我们都是将内存块看成是一大块内存,所有cpu到这个共享内存的访问消息是一样的。这就是之前普遍使用的smp模型。但是随着处理器的增加,共享内存可能会导致内存访问冲突越来越厉害,且如果内存访问达到瓶颈的时候,性能就不能随之增加。numa(non-uniform memory access)就是这样的环境下引入的一个模型。比如一台机器是有2个处理器,有4个内存块。我们将1个处理器和两个内存块合起来,称为一个numa node,这样这个机器就会有两个numa node。在物理分布上,numa node的处理器和内存块的物理距离更小,因此访问也更快。比如这台机器会分左右两个处理器(cpu1, cpu2),在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样numa node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。所以使用numa的模式如果能尽量保证本node内的cpu只访问本node内的内存块,那这样的效率就是最高的。
综上所述得出的结论就是,根据具体业务决定numa的使用。
如果你的程序是会占用大规模内存的,你大多应该选择关闭numa node的限制。因为这个时候你的程序很有几率会碰到numa陷阱。
另外,如果你的程序并不占用大内存,而是要求更快的程序运行时间。你大多应该选择限制只访问本numa node的方法来进行处理。