【发布时间】:2012-09-05 12:24:50
【问题描述】:
我正在使用 NUMA 机器(SGI UV 1000)同时运行大量数值模拟,每一个都是使用 4 核的 OpenMP 作业。但是,运行大约 100 多个这样的作业会导致性能显着下降。我们对为什么会发生这种情况的理论是,软件所需的共享库只加载到机器的全局内存中一次,然后系统就会遇到通信瓶颈,因为所有进程都在访问单个节点上的内存。
这是一个旧软件,没有修改范围,静态 make 选项不会静态链接它需要的所有库。据我所知,最方便的解决方案是以某种方式强制系统在每个进程或节点上加载所需共享库的新副本(我在每个进程或节点上运行 3 个进程),但我没有能够找到如何做到这一点。谁能告诉我如何做到这一点,或者对如何解决这个问题有任何其他建议?
【问题讨论】:
-
这是您提出的一个非常有趣的问题。您能否使用硬件计数器分析您的代码并查看它产生了多少 L1 指令缓存未命中? Nehalem CPU 每个内核有 32 Kuops 的 L1 指令缓存,它应该足以容纳一些最大的计算内核。您还使用进程和线程绑定吗?这在 NUMA 系统上非常重要。
-
假设库被加载到给定的内存组,处理器第一次寻找很明显你会在那些离那个组“很远”的 CPU 中受到惩罚.但是此后库不会留在指令缓存中吗?如果库不经常使用,可能你不应该担心 NUMA。如果是,那你就有缓存了。
-
我有同样的问题,除了多个线程访问同一个内存映射数据文件(只读)。
-
总线、内存或其他资源争用似乎更有可能是第一个罪魁祸首。你为什么看这里——你已经排除了这样的事情吗?
-
我很好奇 - 你如何处理这台机器的 cpuset?你的内存和cpus一样被锁定了吗?我真的怀疑机器将它放在全局内存中的一个位置,因为这会破坏机器的目的。
标签: linux linux-kernel shared-libraries hpc numa