现代 Linux 中是否有 NUMA 下次接触策略

2024-01-05

当我们在 NUMA 系统上工作时,内存相对于当前 NUMA 节点可以是本地的或远程的。 为了使内存更加本地化,​​有一个“首次接触”策略(默认的内存到节点绑定策略):http://lse.sourceforge.net/numa/status/description.html 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 http://techpubs.sgi.com/library/dynaweb_docs/0640/SGI_Developer/books/OrOn2_PfTune/sgi_html/ch08.html

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

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

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

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

从 9 开始,Solaris 通过带有 MADV_ACCESS_LWP 标志的 madvice 支持此类策略

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

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

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

那么,问题是:在当前的 vanilla Linux 内核或某些主要分支(例如 RedHat Linux 内核或 Oracle Linux 内核)中是否有 NUMA 的下一步发展?


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

现代 Linux 中是否有 NUMA 下次接触策略 的相关文章

  • 查找 Obj-C 中对象实例的所有引用

    我正在尝试找出一些错误 其中之一与内存泄漏有关 我可以看出该对象仍然有一个引用 因为 Instruments 仍然将其显示为活动状态 但 Instruments 不会将其注册为泄漏 无论如何 有没有办法查看 Objective C 中对象的
  • 最初从位图泄漏未引用的 byte[] 但被回收()导致内存泄漏(直到活动停止)

    我有位图内存泄漏导致内存不足 我在 Android 5 0 三星 S5 上运行了测试 我已经使用 Android Studio 1 5 1 2 0 0 Preview 7 调查了这个问题 HPROF 内存转储显示有多个 byte 与我暂时使
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 演员邮箱溢出。斯卡拉

    我目前正在与 scala 的两位演员合作 一 producer 产生一些数据并将其发送到parcer 生产者发送一个HashMap String HashMap Object List Int 通过消息 以及this标记发件人 parcer
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • 什么是标记结构初始化语法?

    struct file operations scull fops owner THIS MODULE llseek scull llseek read scull read write scull write ioctl scull io
  • List.Clear() 在 C# 中是如何实现的?

    我假设它使用数组来实现 List 怎么List Clear 实施的 它实际上清理了数组还是只是为此列表创建了一个新数组 public class List private Array array public void Clear1 arr
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 使用Intel的PIN工具来计算程序中缓存命中/未命中的次数

    我一直在尝试编写一个 pintool 来检测给定程序中的缓存命中和未命中情况 我发现有INS IsMemoryRead Write等调用来判断指令是否是LD ST 有没有办法确定指令是否命中或未命中缓存 如果是这样 是否还可以获得从缓存 内
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include

随机推荐