9

当我们在 NUMA 系统上工作时,内存可以相对于当前 NUMA 节点是本地或远程的。为了使内存更加本地化,​​有一个“first-touch”策略(默认内存到节点绑定策略): http: //lse.sourceforge.net/numa/status/description.html

默认内存绑定 重要的是,用户程序的内存分配在靠近包含运行它们的 CPU 的节点上。因此,默认情况下,页面错误由包含页面错误 CPU 的节点的内存来满足。因为第一个接触页面的 CPU 将是错误进入页面的 CPU,所以这个默认策略称为“第一次接触”。

http://techpubs.sgi.com/library/dynaweb_docs/0640/SGI_Developer/books/OrOn2_PfTune/sgi_html/ch08.html

默认策略称为首次接触。在此策略下,首先接触(即写入或读取)内存页面的进程会导致该页面在运行该进程的节点中分配。此策略适用于顺序程序和许多并行程序。

还有一些其他的非本地政策。还有一个函数要求将内存段显式移动到某个 NUMA 节点。

但有时(在单个应用程序的许多线程的上下文中)拥有“下一次接触”策略可能很有用:调用一些函数来“取消绑定”一些内存区域(最多 100 s MB)与一些数据并重新应用“第一次接触” - 这个区域上的类似处理程序,它将在下一次触摸(读取或写入)时将页面迁移到访问线程的 numa 节点。

当有大量数据要由许多线程处理并且有不同的访问该数据的模式时(例如,第一阶段 - 通过线程按列拆分 2D 数组;第二阶段 - 按行拆分相同的数据),此策略很有用。

自 9 以来,Solaris 通过带有 MADV_ACCESS_LWP 标志的 madvice 支持此类策略

https://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=madvise

MADV_ACCESS_LWP 告诉内核下一个接触指定地址范围的 LWP 将最频繁地访问它,因此内核应该尝试为这个范围和 LWP 相应地分配内存和其他资源。

有(2009 年 5 月)名为“affinity-on-next-touch”的 Linux 内核补丁, http: //lwn.net/Articles/332754/线程),但据我了解,它未被主线接受,不是它?

还有 Lee Schermerhorn 的“migrate_on_fault”补丁 http://free.linux.hp.com/~lts/Patches/PageMigration/

所以,问题是:在当前的 vanilla Linux 内核或一些主要的分支中,如 RedHat linux 内核或 Oracle linux 内核,NUMA 是否有一些下一个接触?

4

1 回答 1

1

根据我的理解,香草内核中没有任何类似的东西。numactl 具有手动迁移页面的功能,但对您的情况可能没有帮助。(NUMA 策略说明在 Documentation/vm/numa_memory_policy 如果您想自己检查)

我认为这些补丁没有合并,因为我没有看到当前内核中出现任何相关的代码片段。

于 2012-09-10T17:44:45.837 回答