NUMA 相关

文章目录

    • 问题引发
    • 几个命令
    • 计算
    • NUMA
    • NUMA的支持
    • 一些很好的文章

问题引发

在看书看到物理内存的时候,看到有UMA(一致内存访问)和NUMA(非一致内存访问)两种方式,不太懂这个NUMA是个什么概念,所以大致去网上了解了下。

几个命令

  1. numactl
    这个命令的一些选项可以用来查看当前的numa的信息:

    numactl --show

    numactl --hardware

    NUMA 相关_第1张图片
    可以看到当前物理机上面有两个NUMA节点。均分所有的CPU,并且还能看到分到的物理内存总量。

  2. dmesg
    这个命令打印内核日志,需要自己grep一下:
    NUMA 相关_第2张图片
    上面grep了NUMA相关的信息。
    NUMA 相关_第3张图片
    这个grep了Page相关的信息。

  3. lscpu
    查看CPU的信息
    NUMA 相关_第4张图片
    这个命令可以看到CPU型号,NUMA节点分配情况等。

  4. free
    在这里插入图片描述
    标准查看内存使用情况命令,可以看到总的内存有多少

计算

我们可以根据上面的图来计算下内存:

  1. 根据地址空间来计算:

最大地址空间:0x207fffffff
折算成GB单位:139586437119 / 1024 /1024 /1024 = 129GB

  1. 根据页数来算:

16695919 + 16777216 = 33473135 Pages = 133892540KB = 127GB

  1. 根据numactl --hardware来计算

(64088 + 64484) / 1024 = 126GB

  1. free命令

125GB

  1. 内存条规格

128GB

可以看到三种方式计算出来的内存差不多,但是有一些差距,我暂时还不知道是怎么回事。

NUMA

从维基可以看到,NUMA是给多处理器计算机设计的,就是有一大堆的Core的计算机,可以让一部分的Core只访问“本地”的内存,以获得更好的性能。从上面的图也可以看出来,每个NUMA节点都是差不多均分所有内存的。而且每个节点的内存不重合,对应的内核源码里面也可以看到NUMA节点:pg_data_t这个结构,这个结构就代表每个NUMA节点。借用引用里面的一张图,类似于这种:
NUMA 相关_第5张图片
各管各自的内存,然后再通过特定的技术(如Intel 的志强系列处理器的QPI)连接不同的节点。

所以初步看下来就是,如果一个应用程序在某一块CPU上面运行,那么就会优先在这个CPU拥有的内存里面分配内存。如果一个NUMA节点的内存分配不够了,可以在另外的节点分配内存(延迟会变高),可以让kswapd把页换到swap磁盘上面(这个好像达到water_mark就会发生),也可以OOM Killed。这一部分还需要看看源码。

NUMA的支持

从上面的描述可以看到,这个玩意要从硬件层就开始有支持,首先要CPU支持NUMA,BIOS层的设置也要把NUMA开启,再到操作系统层面也要支持NUMA,最后到进程层面的NUMA设置。

  1. CPU层面:
    这个就是要选取支持NUMA的处理器了,英特尔的就是志强系列,一般的服务器都是用的志强金牌系列,惠普和戴尔大部分都是。英特尔酷睿系列不太确定支不支持NUMA。

  2. BIOS层面:
    这里有两个例子,戴尔和惠普的服务器,这些厂商的服务器都会带有管理界面,戴尔的对应iDRAC,惠普的对应iLO。

    1. iDRAC
      NUMA 相关_第6张图片
      把这个选项Disabled掉就是启动NUMA,从这里可以看到:把这个禁用之后,就相当于打开了NUMA支持,但是对于服务器上面会出现占用很大内存的应用程序这种情况,那么最好把这个Node Interleaving 打开。从戴尔的产品手册也可以看到相关的描述。
    2. iLO NUMA 相关_第7张图片
      惠普的也差不多,只是需要在机器启动的时候按F9进入 System utilities 里面去设置这个选项。
  3. 操作系统层面
    这个我在安装Ubuntu的时候没有看到相关的选项,但是安装之后确实是按照CPU块数分了NUMA节点,这个设置可能还需要找找。

  4. 应用程序层面
    这个主要就是使用numactl命令来控制应用程序了。用到的时候再查不迟。

一些很好的文章

NUMA性能取舍
NUMA OverView

你可能感兴趣的:(Linux)