描述系统上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上未来是否会onlineN_ONLINE:描述对应的node是否onlineN_NORMAL_MEMORY:描述对应的node是否有normal memoryN_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。
|
|