libnuma详解-A NUMA API for LINUX

参考资料

http://developer.amd.com/wordpress/media/2012/10/LibNUMA-WP-fv1.pdf

numa(3) - Linux manual page

numa(3): NUMA policy library - Linux man page

libnuma详解(A NUMA API for LINUX)_叶子心情你不懂的博客-CSDN博客_libnumalibnuma详解(A NUMA API for LINUX)_叶子心情你不懂的博客-CSDN博客_libnumalibnuma详解(A NUMA API for LINUX)_叶子心情你不懂的博客-CSDN博客_libnuma

numa内核和外延libnuma详解-A NUMA API for LINUX_第1张图片

libnuma详解-A NUMA API for LINUX_第2张图片

numa安装

sudo apt install libnuma-dev
czl@czl-Vostro-3268:~$ sudo apt install libnuma-dev
[sudo] czl 的密码: 
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
下列【新】软件包将被安装:
  libnuma-dev
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 29 个软件包未被升级。
需要下载 32.3 kB 的归档。
解压缩后会消耗 166 kB 的额外空间。
获取:1 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnuma-dev amd64 2.0.11-2.1ubuntu0.1 [32.3 kB]
已下载 32.3 kB,耗时 1秒 (40.2 kB/s)  
正在选中未选择的软件包 libnuma-dev:amd64。
(正在读取数据库 ... 系统当前共安装有 190232 个文件和目录。)
正准备解包 .../libnuma-dev_2.0.11-2.1ubuntu0.1_amd64.deb  ...
正在解包 libnuma-dev:amd64 (2.0.11-2.1ubuntu0.1) ...
正在设置 libnuma-dev:amd64 (2.0.11-2.1ubuntu0.1) ...
正在处理用于 man-db (2.8.3-2ubuntu0.1) 的触发器 ...
czl@czl-Vostro-3268:~$ 

查看内容,核心是libnuma.a和libnuma.so

$ dpkg -L libnuma-dev
/.
/usr
/usr/include
/usr/include/numa.h
/usr/include/numacompat1.h
/usr/include/numaif.h
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libnuma.a
/usr/share
/usr/share/doc
/usr/share/doc/libnuma-dev
/usr/share/doc/libnuma-dev/copyright
/usr/share/man
/usr/share/man/man3
/usr/share/man/man3/numa.3.gz
/usr/lib/x86_64-linux-gnu/libnuma.so
/usr/share/doc/libnuma-dev/README
/usr/share/doc/libnuma-dev/TODO
/usr/share/doc/libnuma-dev/changelog.Debian.gz
/usr/share/man/man3/numa_all_nodes.3.gz
/usr/share/man/man3/numa_alloc.3.gz
/usr/share/man/man3/numa_alloc_interleaved.3.gz
/usr/share/man/man3/numa_alloc_interleaved_subset.3.gz
/usr/share/man/man3/numa_alloc_local.3.gz
/usr/share/man/man3/numa_alloc_onnode.3.gz
/usr/share/man/man3/numa_available.3.gz
/usr/share/man/man3/numa_bind.3.gz
/usr/share/man/man3/numa_error.3.gz
/usr/share/man/man3/numa_exit_on_error.3.gz
/usr/share/man/man3/numa_free.3.gz
/usr/share/man/man3/numa_get_interleave_mask.3.gz
/usr/share/man/man3/numa_get_interleave_node.3.gz
/usr/share/man/man3/numa_get_membind.3.gz
/usr/share/man/man3/numa_get_run_node_mask.3.gz
/usr/share/man/man3/numa_interleave_memory.3.gz
/usr/share/man/man3/numa_max_node.3.gz
/usr/share/man/man3/numa_no_nodes.3.gz
/usr/share/man/man3/numa_node_size.3.gz
/usr/share/man/man3/numa_node_to_cpus.3.gz
/usr/share/man/man3/numa_police_memory.3.gz
/usr/share/man/man3/numa_preferred.3.gz
/usr/share/man/man3/numa_run_on_node.3.gz
/usr/share/man/man3/numa_run_on_node_mask.3.gz
/usr/share/man/man3/numa_set_bind_policy.3.gz
/usr/share/man/man3/numa_set_interleave_mask.3.gz
/usr/share/man/man3/numa_set_localalloc.3.gz
/usr/share/man/man3/numa_set_membind.3.gz
/usr/share/man/man3/numa_set_preferred.3.gz
/usr/share/man/man3/numa_set_strict.3.gz
/usr/share/man/man3/numa_setlocal_memory.3.gz
/usr/share/man/man3/numa_tonode_memory.3.gz
/usr/share/man/man3/numa_tonodemask_memory.3.gz

如果是查看deb包内容,则使用命令:

dpkg-deb -c package.deb

NUMA的拓扑结构介绍:

2-socket Intel NUMA topology。CPU 0和CPU 1表示物理处理器包,而不是单个核心,并且作为内存模块的相应数量的NUMA内存节点被部署在对应的处理器的相邻的DIMM卡槽中。

在这里插入图片描述

4-socket Intel E5-4600 NUMA node architecture

在这里插入图片描述

4-socket AMD NUMA node architecture。每个物理处理器包都有两个NUMA节点。

在这里插入图片描述

图4说明了NUMA节点局部性的介绍(其中NUMA节点被认为是给定核心的本地节点)。在本例中,对于物理处理器CPU 0中的core 0,紧挨着该处理器socket的内存被认为是本地NUMA节点。对于core 1,它是物理处理器CPU 1的一部分,被认为是本地的NUMA节点是挂在CPU 1上的节点。每个物理处理器最多可以有8个物理内核和Intel Xeon E5-2600系列处理器,每个socket最多可以有16个逻辑处理器(启用超线程)。为了便于演示,只显示了每个处理器socket上的第一个物理核心
在这里插入图片描述

图5表示了另一种可视化相对NUMA节点局部性的方法。在这里,我们来看另一个简化的示例,其中每个位于socket(表示为CPU 0和CPU 1)中的top-bin E5-2600系列物理处理器都有8个核。出于本示例的目的,每个处理器核都从1到8进行编号,尽管在启动后核心编号策略会发生变化。我们可以看到CPU 0上的第一个核(用绿色表示)是NUMA节点0的本地核。这意味着最靠近CPU 0填充的DIMM插槽是本地的,而最靠近CPU 1填充的DIMM插槽(红色的NUMA node 1)是远程的。这是因为要从CPU 0上的核心1到达NUMA节点1,内存请求必须遍历CPU间QPI链路,并使用CPU 1的内存控制器来访问这个远程节点。额外的跳跃增加了远程NUMA节点内存访问的延迟。
 

在这里插入图片描述

我们看到了相同的系统,但是现在Linux已经列出了内核。注意,每个核心现在都表示为一个不同的OS CPU,这是Linux引用逻辑处理器的方式。还需要注意的是,第一个OS CPU(0)是第一个物理处理器包上的第一个核心。现在注意,OS CPU 1是第二个物理处理器包上的第一个核心。这种模式在所有可用的内核上都延续,因此对于Intel 2P系统,所有偶数编号的OS cpu都在第一个物理处理器包上,而所有奇数编号的OS cpu都在第二个物理处理器包上。同样重要的是要注意,对于任何特定的NUMA节点,哪些内核是本地的,以及OS cpu和NUMA节点是从0开始编号的。

在这里插入图片描述

图9中表示的核心枚举模式显示了同一个启用超线程的2套接字处理器Intel xeon系统。字符前的第一个数字表示分配给实际内核的OS CPU号。字符后面的第二个数字表示分配给超线程同级线程的OS CPU数字。在Linux内核引导的核心枚举阶段,首先在填充的物理处理器包之间以循环的方式枚举所有真正的内核。一旦枚举了所有的真实核,超线程的兄弟核也会以类似的方式枚举,在填充的处理器包之间循环。对于一个带有Intel Xeon 8核处理器的2P 16核系统的示例,在启用超线程时总共枚举了32个逻辑处理器。
在这里插入图片描述

注意,每个物理处理器包都有两个与之关联的NUMA节点。此外,每个物理处理器被分成两组,每组8个核。与单个NUMA节点关联的核心是按顺序枚举的。在图11中,我们看到OS CPU 0 8是NUMA节点0的一部分。同一物理处理器包上编号为OS CPU 9 15的第二组核心对于NUMA节点1来说是本地的。需要注意的是,转移到下一个套接字需要从32开始枚举核心。第四个物理处理器包使用OS CPU 16启动核心枚举并继续进行

在这里插入图片描述

NUMA策略是由几个子系统共同努力提供的。内核管理进程或特定内存映射的内存策略。这个内核可以通过三个新的系统调用来控制。可以从应用程序中调用一个名为libnuma的用户空间共享库。推荐使用libnuma API 来使程序实现NUMA策略。它提供了比直接使用系统调用更友好和抽象的接口。本文仅描述这个高级接口。

当不应该修改应用程序时,管理员可以使用numactl命令行实用程序设置一些策略。这不如直接从应用程序控制策略灵活

用户库和应用程序包含在numactl RPM中,它是SUSE LINUX Enterprise Server 92的一部分。此外,包中还有一些实用程序,如numastat,用于收集关于内存分配的统计信息,numademo用于显示不同策略对系统的影响。这个包还包含所有函数和程序的手册页。


编程用例:

#include 
#include 
#include 

int main(void)
{
    if(numa_available() < 0)
    {
   	printf("Your system does not support NUMA API.\n");
	return -1;
    }

    printf("%s line %d, we have numa node %d.\n", __func__, __LINE__, numa_max_node());

    return 0;
}

查找文件所属的包:

$ apt-file search libnuma.a
  libnuma-dev: /usr/lib/x86_64-linux-gnu/libnuma.a
$ apt-file search numactl
numactl: /usr/bin/numactl
numactl: /usr/share/doc/numactl/DESIGN
numactl: /usr/share/doc/numactl/README
numactl: /usr/share/doc/numactl/README.Debian
numactl: /usr/share/doc/numactl/TODO
numactl: /usr/share/doc/numactl/changelog.Debian.gz
numactl: /usr/share/doc/numactl/copyright
numactl: /usr/share/man/man8/numactl.8.gz
r-cran-nws: /usr/lib/R/site-library/nws/examples/sleigh/numactl.R

参考:

处理器从单核到多核的演化过程_papaofdoudou的博客-CSDN博客


结束

你可能感兴趣的:(numa,Linux,内存管理,linux,ubuntu)