作者:weijitao
来源:CSDN
原文:https://blog.csdn.net/weijitao/article/details/52884422

目前多核已经越来越普遍的使用,Linux对NUMA架构的支持也越来越完善。对于内存管理、多处理的负载均衡调度等进行了大量的优化工作。

NUMA相关的几个概念有Node、Socket、Core 以及 Thread。

  1. Socket是一个物理上的概念,指的是主板上的cpu插槽。
  2. Node是一个逻辑上的概念,对应于socket。
  3. Core就是一个物理cpu,一个独立的硬件执行单元。
  4. Thread就是超线程的概念,是一个逻辑cpu,共享core上的执行单元。

1. 查看主机Node

下面将结合自己机器来看下NUMA架构下的CPU拓扑关系。
NUMA使用node来管理cpu和内存。

ls /sys/devices/system/node/node

在这里插入图片描述
在自己环境上查询只有一个node;所以只能看到node0;

[root@domain ~]# ls /sys/devices/system/node/
has_cpu  has_memory  has_normal_memory  node0  online  possible  power  uevent

2. 查看主机Socket

Socket的信息可以通过/proc/cpuinfo查看,里面的physical id标示的就是socket号。

cat /proc/cpuinfo | grep "physical id" | sort -u
cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l

在这里插入图片描述
可以看到机器上面有两个socket,编号分别为0和1,原作者机器上一个node对应于一个scoket。

下面是我自己机器上查询的结果:一个node对应2个socket?

[root@domain ~]# cat /proc/cpuinfo | grep "physical id" | sort -u
physical id	: 0
physical id	: 1
[root@domain ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    1
座:                 2
NUMA 节点:         1
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              58
型号名称:        Intel Xeon E3-12xx v2 (Ivy Bridge)
步进:              9
CPU MHz:             2099.998
BogoMIPS:            4199.99
超管理器厂商:  KVM
虚拟化类型:     完全
L1d 缓存:          32K
L1i 缓存:          32K
L2 缓存:           4096K
L3 缓存:           16384K
NUMA 节点0 CPU:    0-3

3 查看每个Node的cpu

ls /sys/devices/system/node/node0/cpu

在这里插入图片描述Node0上共有20个cpu,编号为cpu0cpu9,cpu20cpu29

ls /sys/devices/system/node/node1/cpu

在这里插入图片描述
Node1上共有20个cpu,编号为cpu10cpu19,cpu30cpu39

下面是我自己电脑的上的,查询结构。

[root@domain ~]# ls /sys/devices/system/node/node0/cpu
cpu0/    cpu1/    cpu2/    cpu3/    cpulist  cpumap

4. 查看主机Core信息

下面看下core的信息,core也是通过/proc/cpuinfo查看,其中和core相关的信息有:

core id 此cpu在所在core中的编号
cpu cores 一个socket上面有多少个core

作者的机器上每个socket上面有10个core

cat /proc/cpuinfo | grep "cpu cores" | sort -u

在这里插入图片描述

cat /proc/cpuinfo | grep "core id" | sort -u

在这里插入图片描述
上面的信息可知每个Node上面有20个cpu,10个core,则每个core里面有两个cpu,也就是Thread的概念。

我自己的虚拟机上显示如下:

[root@domain ~]# cat /proc/cpuinfo | grep "cpu cores" | sort -u
cpu cores	: 1
[root@domain ~]# cat /proc/cpuinfo | grep "core id" | sort -u
core id		: 0
root@domain ~]# cat /proc/cpuinfo | grep "core id"
core id		: 0
core id		: 0
core id		: 0
core id		: 0

5. 查看主机Thread

下面来看下thread的信息,cat /proc/cpuinfo可以看到每个thread,也就是每个逻辑cpu的详细信息。

cat /proc/cpuinfo

在这里插入图片描述
上面是cpu0的详细信息,红色框中是相关的几条信息。
physical id为0表示此cpu在socket0也就是node0上面
cpu cores为10表示此node上面有10个core
core id为0表示此cpu在node0的core0上面
siblings为20表示此cpu0在core0里面的兄弟逻辑cpu为cpu20

6. CPU拓扑结构

到目前为止我们知道了cpu0和cpu20是node0上的core0里面的两个兄弟逻辑cpu,按照intel的组织架构,这两个cpu是应该共享L1 cache和L2 cache的。L1 cache又分为数据cache和指令cache。
在这里插入图片描述

CPU0的cache信息如上图所示,index0对应的是L1 Data Cache,index1对应的是L1 Instruction Cache,index2对应的是L2 Cache,index3对应的是L3 Cache。

L1 Data Cache的大小为32k字节,共享此cache的cpu有cpu0和cpu20。

L1 Instruction Cache的大小为32k字节,共享此cache的cpu有cpu0和cpu20。

L2 Cache的大小为256k字节,共享此cache的cpu有cpu0和cpu20。

L3 Cache的大小为25600K字节,共享此cache的cpu有cpu0cpu9和cpu20cpu29,即node0上的所有cpu。

遍历所有的cpu信息,可知cpu的拓扑架构如下所示:
在这里插入图片描述
上面的CPU拓扑架构图还不完整,每个node都有一个对应的本地内存。假设node0的本地内存标记为mem0,node1的本地内存标记为mem1。mem0对于node0就是本地内存,mem1对于node0就是远端内存;反之对于mem1亦有类似关系。

访问本地内存的速度要快于访问远端内存的速度。访问速度与node的距离有关系,node间的距离我们称为node distance。
在这里插入图片描述
Node0的本地内存大小为32209MB,Node1的本地内存大小为32316MB。Node0到本地内存的distance为10,到node1的内存distance距离为20;Node1到本地内存的distance为10,到node0的内存distance距离为20。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐