2. 对比NUMA架构

NUMA架构,非统一内存访问架构(英语:Non-uniform memory access,简称NUMA)。

在numa出现之前, cpu通过内存控制器访问内存,显然,当cpu核数逐渐增多的今天,内存控制器会成为瓶颈。 这个时候就考虑内存控制器进行拆分内存平均分配到各个node上,cpu访问本地的内存时速度快,跨片访问慢。

2.1. NUMA 距离

数据来自numactl工具的输出:

Kunpeng 920              │    Intel E5-2630

node distances:          │    node distances:
node   0   1   2   3     │    node   0   1
  0:  10  16  32  33     │      0:  10  21
  1:  16  10  25  32     │      1:  21  10
  2:  32  25  10  16     │
  3:  33  32  16  10     │

这里我们可以知道Kunpeng920有4个NUMA节点, Intel E5-2630有2个NUMA节点。同时我们认为NUMA节点数量在出厂的时候就已经是确定的。 在Intel平台上,服务器BIOS的SNC(Sub NUMA Clustering)设置会影响numa节点的数量。参考设置: 【华为】 【H3C】 【HPE1】 【HPE2】

根据上面的输出,先给出他们距离的示意图:

Kunpeng 920: numa_kunpeng

例如1: node0上的CPU访问本地内存,距离为10
例如2:  node0上的CPU访问node3的内存,距离为33 = 23 + 10

Intel E5-2630: numa_intel

在做性能优化时,针对numa结构的绑核可以让数据访问更快。比如网络性能测试,需要频繁从 网络收发数据, 这个时候测试程序和网卡在同一个numa节点上时,性能最好; 需要频繁将收来的数据 写入硬盘有时候也经常会被问硬盘是在哪个numa节点上的,网卡是在哪个numa节点上的,中断怎么绑定 效率最高,下面展开了解一下。lstopo给出了详细的说cpu拓扑说明。

2.2. 拓扑:Kunpeng 920

这里逐个片段解释附件 Kunpeng 拓扑 的内容

Machine (188GB total):
    Package L#0
    NUMANode L#0 (P#0 46GB)
        L3 L#0 (32MB)
        L2 L#0 (512KB) + L1d L#0 (64KB) + L1i L#0 (64KB) + Core L#0 + PU L#0 (P#0)
        L2 L#1 (512KB) + L1d L#1 (64KB) + L1i L#1 (64KB) + Core L#1 + PU L#1 (P#1)
        L2 L#2 (512KB) + L1d L#2 (64KB) + L1i L#2 (64KB) + Core L#2 + PU L#2 (P#2)
        L2 L#3 (512KB) + L1d L#3 (64KB) + L1i L#3 (64KB) + Core L#3 + PU L#3 (P#3)
        L2 L#4 (512KB) + L1d L#4 (64KB) + L1i L#4 (64KB) + Core L#4 + PU L#4 (P#4)
        L2 L#5 (512KB) + L1d L#5 (64KB) + L1i L#5 (64KB) + Core L#5 + PU L#5 (P#5)
Machine (188GB total)
主机188GB内存。 可以用free -g命令进行确认
Package L#0
独立的物理CPU封装, 这台服务器上有4826有两个CPU。 整个服务器一共64核
NUMANode L#0 (P#0 46GB)
numa node 0,有46G直连内存。暂时不明白为什么不是47GB,后续的其他node是47. 全部内容可以查看附件 Kunpeng 拓扑
L3 L#0 (32MB)
node0 的L3 cache 全部内容可以查看附件 Kunpeng 拓扑
L2 L#0 (512KB) + L1d L#0 (64KB) + L1i L#0 (64KB) + Core L#0 + PU L#0 (P#0)
  • L2 L#0 (512KB)表示node0下第一个L2 cache 512KB。
  • L1d L#0 (64KB)表示L1 Data Cache 64KB
  • L1i L#0 (64KB)表示L1 Instruction Cache 64KB
  • Core L#0 表示第0个物理核
  • PU L#0 (P#0)表示Processing Unit Processor 第0个cpu核心

        HostBridge L#0
        PCIBridge
            PCI 1000:0016
            Block(Disk) L#0 "sdj"
            Block(Disk) L#1 "sda"
            Block(Disk) L#2 "sdh"
            Block(Disk) L#3 "sdf"
HostBridge L#0
表示主桥0
PCI 1000:0016

表示PCI号,查看pci设备可以使用命令 lspci -nn | grep 1000:0016 例如查看1822网卡

[root@ARM server home]# lspci -nn | grep 19e5:1822
83:00.0 Ethernet controller [0200]: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) [19e5:1822] (rev 45)
84:00.0 Ethernet controller [0200]: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) [19e5:1822] (rev 45)
85:00.0 Ethernet controller [0200]: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) [19e5:1822] (rev 45)
86:00.0 Ethernet controller [0200]: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) [19e5:1822] (rev 45)
Block(Disk) L#0 “sdj”
表示node0上的第一个机械硬盘,一次类推,可以看到后面有多个

        PCIBridge
            PCI 19e5:a222
            Net L#15 "enp125s0f0"
            PCI 19e5:a221
            Net L#16 "enp125s0f1"
            PCI 19e5:a222
            Net L#17 "enp125s0f2"
            PCI 19e5:a221
            Net L#18 "enp125s0f3"

这些是板载网卡的四个口


    Misc(MemoryModule)
    Misc(MemoryModule)
    Misc(MemoryModule)

这些是内存条物理插槽数量

同时我们也可以直接查看比较直观的拓扑图:

lstopo

2.3. 拓扑:Intel E5-2630

   Machine (128GB total):
     NUMANode L#0 (P#0 64GB)
       Package L#0 + L3 L#0 (25MB)
         L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
           PU L#0 (P#0)
           PU L#1 (P#20)
         L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
Machine (128GB total)
设备一共128G内存
NUMANode L#0 (P#0 64GB)
第0个numa节点, 可以看到一共两个numa节点。全部内容可以查看附件 Intel 拓扑
Package L#0 + L3 L#0 (25MB)
表示L3 cache 25MB
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
  • L2 L#0 (256KB)表示第0个L2 cache 256KB, 这个node上一共有10个
  • L1d L#0 (32KB)表示L1 data cache 32KB
  • L1i L#0 (32KB)表示L1 Instruction cache 32KB
  • Core L#0表示第0个物理核心
  • PU L#0 (P#0) 表示Processing Unit Processor 第0个cpu核心
  • PU L#1 (P#20) 表示Processing Unit Processor 第20个cpu核心
  • 这里注意,这里是一个物理核的两个线程, 一个线程能代表一个cpu核心

           PCI 1000:005d
             Block(Disk) L#0 "sda"
             Block(Disk) L#1 "sdb"

这里是node 0下的两个机械硬盘


         PCIBridge
           PCI 8086:154d
             Net L#2 "p7p1"
           PCI 8086:154d

这里是node 0下的一个网卡的两个端口

同时我们也可以直接查看比较直观的拓扑图:

image2

2.4. 网卡在哪个numa节点上?

从上面的输出我们是可以看出来的, 但是有时候我们需要一个更直接一点的方式。

其实我们完全可以直接查询网卡上的某个端口在哪个numa节点上

[user1@centos ~]$ cat /sys/class/net/enp125s0f1/device/numa_node
0
[user1@centos ~]$ cat /sys/class/net/enp189s0f2/device/numa_node
2

2.5. 硬盘在哪个numa节点上?

从上面的输出我们是可以看出来的, 但是有时候我们需要一个更直接一点的方式。

首先找到硬盘在哪个pci设备上。

[user1@centos block]$ ls -l /dev/disk/by-path/
total 0
lrwxrwxrwx. 1 root root  9 Jan 21 15:55 pci-0000:74:02.0-sas-0x5d0efc1ff03b3000-lun-0 -> ../../sda

然后查找pci设备的numa node

[user1@centos by-path]$ cat /sys/bus/pci/devices/0000\:74\:02.0/numa_node
0