描述系统上cpu和memory的状态:node_states
Contents
在内存管理和调度负载均衡中,有许多代码逻辑要遍历node
上的内存和cpu信息,加上现在的内核都支持内存和cpu
的热插拔,所以系统上node
的状态在内核上要有专门的数据结构进行描述。
本文就研究一下用于描述node
信息的数据结构。
系统环境
- 发行版:
centos7.5
- 内核版本:3.10.0-862.14.4.el7.x86_64
- 处理器:
40core(Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz)
- 内存:
128GB
,两个NUMA node
查看numa信息
我们知道,现在的服务器一般都是NUMA
架构,通常包含两个numa node
,每个node
上都有与其比较近的cpu
和内存,我们可以通过命令numactl --hardware
查看信息:
|
|
此外,在linux
系统中,每个node
的详细信息,可以通过目录/sys/devices/system/node
进行查看:
|
|
node_states 全局变量
linux
内核定义了一个全局变量node_states
,其类型为nodemask_t
:
|
|
通过crash
命令,我们可以看到在真实的服务器系统上,这些变量的实际定义:
|
|
从上可以看出:
NR_NODE_STATES
的值为5
,经过对比代码,目前系统上描述了以下几种资源N_POSSIBLE
: 描述对应的node
上未来是否会online
N_ONLINE
:描述对应的node
是否online
N_NORMAL_MEMORY
:描述对应的node
是否有normal memory
N_MEMORY
:描述对应的node
是否有内存N_CPU
:描述对应的node
上是否有cpu
- 通过
nodemask_t
可以看出,系统上最大支持1024
(16*64
)个node,其实,通过内核的config
,也可以计算出系统最大支持1024
个node
,这里的CONFIG_NODES_SHIFT
为10
。
|
|
我所查看的机器上有两个node
,那么接下来我们通过crash
查看一下node_states
的值:
|
|
- 第一行
3
代表系统上只会有两个node
,node0
和node1
- 第二行
3
代表系统上目前node0
和node1
都是online
的 - 第三行
3
代表系统上node0
和node1
都有normal memory
- 第四行
3
代表系统上node0
和node1
都有内存 - 第五行
3
代表系统上node0
和node1
上都有cpu
有了node_states
后,我们就可以方便的遍历所有node
,并且跳过那些已经不存在或者没有某些资源的node
。
|
|