问题引发
在看书看到物理内存的时候,看到有UMA(一致内存访问)和NUMA(非一致内存访问)两种方式,不太懂这个NUMA是个什么概念,所以大致去网上了解了下。
几个命令
-
numactl
这个命令的一些选项可以用来查看当前的numa的信息:numactl --show
numactl --hardware
可以看到当前物理机上面有两个NUMA节点。均分所有的CPU,并且还能看到分到的物理内存总量。 -
dmesg
这个命令打印内核日志,需要自己grep一下:
上面grep了NUMA相关的信息。
这个grep了Page相关的信息。 -
lscpu
查看CPU的信息
这个命令可以看到CPU型号,NUMA节点分配情况等。 -
free
标准查看内存使用情况命令,可以看到总的内存有多少
计算
我们可以根据上面的图来计算下内存:
- 根据地址空间来计算:
最大地址空间:0x207fffffff
折算成GB单位:139586437119 / 1024 /1024 /1024 = 129GB
- 根据页数来算:
16695919 + 16777216 = 33473135 Pages = 133892540KB = 127GB
- 根据numactl --hardware来计算
(64088 + 64484) / 1024 = 126GB
- free命令
125GB
- 内存条规格
128GB
可以看到三种方式计算出来的内存差不多,但是有一些差距,我暂时还不知道是怎么回事。
NUMA
从维基可以看到,NUMA是给多处理器计算机设计的,就是有一大堆的Core的计算机,可以让一部分的Core只访问“本地”的内存,以获得更好的性能。从上面的图也可以看出来,每个NUMA节点都是差不多均分所有内存的。而且每个节点的内存不重合,对应的内核源码里面也可以看到NUMA节点:pg_data_t这个结构,这个结构就代表每个NUMA节点。借用引用里面的一张图,类似于这种:
各管各自的内存,然后再通过特定的技术(如Intel 的志强系列处理器的QPI)连接不同的节点。
所以初步看下来就是,如果一个应用程序在某一块CPU上面运行,那么就会优先在这个CPU拥有的内存里面分配内存。如果一个NUMA节点的内存分配不够了,可以在另外的节点分配内存(延迟会变高),可以让kswapd把页换到swap磁盘上面(这个好像达到water_mark就会发生),也可以OOM Killed。这一部分还需要看看源码。
NUMA的支持
从上面的描述可以看到,这个玩意要从硬件层就开始有支持,首先要CPU支持NUMA,BIOS层的设置也要把NUMA开启,再到操作系统层面也要支持NUMA,最后到进程层面的NUMA设置。
-
CPU层面:
这个就是要选取支持NUMA的处理器了,英特尔的就是志强系列,一般的服务器都是用的志强金牌系列,惠普和戴尔大部分都是。英特尔酷睿系列不太确定支不支持NUMA。 -
BIOS层面:
这里有两个例子,戴尔和惠普的服务器,这些厂商的服务器都会带有管理界面,戴尔的对应iDRAC,惠普的对应iLO。 -
操作系统层面
这个我在安装Ubuntu的时候没有看到相关的选项,但是安装之后确实是按照CPU块数分了NUMA节点,这个设置可能还需要找找。 -
应用程序层面
这个主要就是使用numactl命令来控制应用程序了。用到的时候再查不迟。