在 NUMA 系统中工作时,内存可以相对于当前的 NUMA 节点是本地的或远程的。为了使内存更加本地化,有一个“首次访问”策略(默认的内存绑定策略):
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 MB),并在该区域上重新应用类似于“首次触摸”的处理程序,这将在下一个触摸(读或写)时将页面迁移到访问线程所在的 NUMA 节点上。
如果有大量数据需要由许多线程处理,并且存在对这些数据的不同访问模式(例如第一阶段-通过线程按列拆分 2D 数组;第二阶段-按行拆分相同的数据),则此策略非常有用。
自 Solaris 9 以来,这种策略已经受到支持,使用 MADV_ACCESS_LWP 标志的 madvice。 https://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=madvise MADV_ACCESS_LWP 告诉内核,下一个 LWP 访问指定地址范围将会访问它,因此内核应尝试为该范围和 LWP 分配内存和其他资源。
默认策略被称为首次访问。根据这种策略,首先接触(即写入或读取)内存页面的进程会导致该页面在运行该进程的节点上分配。这个策略对于顺序程序和许多并行程序都很有效。
还有其他一些非本地策略。此外,还有一个函数来要求将存储器段显式移动到某个 NUMA 节点。
但是有时(在单个应用程序的多个线程的上下文中),具有“下一个触摸”策略可能是有用的:调用某个函数以“取消绑定”带有一些数据的一些内存区域(高达 100 MB),并在该区域上重新应用类似于“首次触摸”的处理程序,这将在下一个触摸(读或写)时将页面迁移到访问线程所在的 NUMA 节点上。
如果有大量数据需要由许多线程处理,并且存在对这些数据的不同访问模式(例如第一阶段-通过线程按列拆分 2D 数组;第二阶段-按行拆分相同的数据),则此策略非常有用。
自 Solaris 9 以来,这种策略已经受到支持,使用 MADV_ACCESS_LWP 标志的 madvice。 https://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=madvise MADV_ACCESS_LWP 告诉内核,下一个 LWP 访问指定地址范围将会访问它,因此内核应尝试为该范围和 LWP 分配内存和其他资源。
2009年5月,Linux内核发布了名为“affinity-on-next-touch”的补丁。具体信息请参见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的next-touch功能?