numa是为了应对多处理器系统共享同一个总线导致的总线负载过大问题。本质上将M个处理器分为N组,每组处理器之间用IMC BUS总线进行连接,每一组叫做一个Node,其结构类似于一个小的UMA(Uniform Memory Access),每个Node中有一个集成的内存控制器IMC,Intergrated Memory Controller。组内CPU用IMCBUS总线连接,Node之间用QPI总线连接,QPI延迟明显高于IMCBUS。
如果numa的available nodes数量大于1,则表明NUMA已开启。
NUMA的基本信息可以通过检查cpu状态,即使用lscpu指令来看到。执行如下指令:
lscpu | grep -i numa
得到如下格式结果:
NUMA node(s): 2 NUMA node0 CPU(s): 0-27,56-83 NUMA node1 CPU(s): 28-55,84-111
结果显示NUMA有2个node, 如果大于1个node,说明NUMA开启。此外对新手要注意:pcie上并没有NUMA信息,因为pcie上的信息都是硬件设备,NUMA并不是硬件,而只是一种内存技术,该技术和CPU的支持分不开,所以,用lscpu指令可以看到NUMA信息。
如果要看NUMA详细的信息,可以用numactl和numastat指令。
numactl --hareward #numactl -H
得到如下信息:
available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 node 0 size: 128445 MB node 0 free: 96356 MB node 1 cpus: 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 node 1 size: 128982 MB node 1 free: 97986 MB node distances: node 0 1 0: 10 20 1: 20 10
此外还要检查pcie上的设备是否和对应的NUMA节点对应。
例如,某一个pcie地址段是和NUMA的Node0绑定的,则该地址段上的设备应绑定Node0。如果本应是绑定Node0的设备绑定了Node1, 则必然导致该设备运行的性能下降。
注:通过实验得出,00-7f的bus上,所有设备均应绑定Node0,80-ff的bus上,所有设备均应绑定Node1。 7f对应十进制是127,ff对应十进制是255,正好是256位长度,说名pcie位宽是256位。前半部分属于Node0,后半部分属于Node1。
以网卡为例,通过lspci找到了某一张网卡的pcie地址号0000:4b:00.01,bus为4b,小于80,故应绑定Node0。通过以下指令查询该网卡是否绑定Node0:
cat /sys/bus/pci/devices/0000\:4b\:00.1/numa_node
如果返回的值为0,说明该网卡绑定NUMA正确。
另外,如果仅仅是查看某一个网卡绑定的numa_node,可以通过以下指令而不需要通过pcie查找:
cat /sys/class/net/enp129s0f0/device/numa_node
该指令的值会返回所属的Node号,如果返回0,便代表该网卡绑定在Node0上。
这两个指令共同点都是在sys文件系统中查找。
NUMA的配置对于性能至关重要。