Linux 上的 NUMA 感知缓存

Linux 上的 NUMA 感知缓存

这是一个后续问题多CPU机器上的dentry/inode缓存/内存分配器配置,但在这里我尝试以不同的方式提出问题。

我的问题是我有一台双插槽机器,内核缓存(dentry/inode/buffer)的内存是从bank0(cpu0的内存库)分配的,并且最终会被消耗。但是,bank1 从未用于缓存,因此整个系统中有大量可用内存。因此,在这种状态下,内存分配器从bank1获取内存,无论我的进程在哪里运行(即使我设置了内存关联)。由于从不同存储体访问内存时存在不同的内存延迟,这意味着我的进程(在某种程度上受到内存访问的限制,缓存命中率较低)在 cpu0 中的内核上调度时比在内核上调度时运行速度要慢得多在CPU1中。 (我想调度两个进程,每个CPU一个,一个进程应该使用其CPU的所有核心。我不想浪费一半的核心。)

我该怎么做才能确保我的进程可以从本地银行获取内存,无论它调度在哪个 cpu 上?

我尝试使用内核虚拟机参数,但它们并没有真正做任何事情。毕竟,一半的内存是空闲的!内核中的这些缓存似乎根本没有考虑 NUMA 问题。我尝试研究 cgroups,但据我所知,我无法真正以这种方式控制内核。我确实没有找到任何可以解决我的问题的东西:-(。

当然,我可以在启动进程之前删除所有缓存,但这有点严厉。例如,更简洁的解决方案是限制总缓存大小(例如 8GB)。确实,cpu0 的内存仍然比 cpu1 少一点(我的两个内存库都有 64GB),但我可以忍受这一点。

如果有任何建议,我将不胜感激...谢谢!

答案1

“NUMA 架构上的内核缓存发生了什么” 在你的linux-3.10下受以下管辖zone_reclaim_mode系统控制它允许选择当区域内存不足时要采取的适当操作。
换句话说,在分配节点页面或相反的页面之前,确定页面分配器是否会回收易于重用的页面。 (有关更多详细信息,请参阅上面链接的官方文档)

linux-4 时代出现了几个关于默认设置的补丁,然后在 linux-5 时代,全局(节点范围)设置变成了每个节点设置:节点回收模式

相关内容