【问题标题】:Shared Library bottleneck on NUMA machineNUMA 机器上的共享库瓶颈
【发布时间】: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


【解决方案1】:

软件所需的共享库只加载一次到机器的全局内存中,

据我所知,这是 Linux 的当前行为。共享库仅加载到一组物理内存,并且仅在单个节点上。

然后系统会遇到通信瓶颈,因为所有进程都在访问单个节点上的内存。

正如 cmets 中所说,来自库的指令应缓存在每个处理器中,因此只有从缓存中擦除库中的活动代码时才会出现瓶颈(例如,有很多不同的代码在工作)。

您应该使用硬件性能计数器(缓存未命中、节点间 NUMA 内存访问计数)来验证您的理论。

在 NUMA 上以多个副本存储一些数据的机制在 Linux 上称为“复制”。内核、可执行文件或其共享库的代码称为文本。所以,你想要的是“共享库的文本复制”。我认为内核代码的文本复制更容易。

我能够从 2003 年找到一些用于进行此类文本复制的实验性补丁,例如 http://lwn.net/Articles/63512/[RFC][PATCH] NUMA 用户页面复制)由 IBM 的 Dave Hansen 提供。这个补丁好像被拒绝了。

这种技术的更现代(2007 年)变体是页面缓存的复制:http://lwn.net/Articles/223056/mm:复制的页面缓存),作者是 SUSE 的 Nick Piggin。还有关于他的方法的介绍:http://ondioline.org/~paul/pagecachereplication.pdf。这将起作用,因为所有文件都存储在页面缓存中,包括可执行文件和共享库。但即使是这个补丁,我也无法在当前内核中找到它。

在 SGI 上有更多的复制需求(他们拥有比典型内核开发人员更多的 NUMA 机器),因此可能会有一些附加补丁。有一个 SGI 的 NUMA 应用程序调整手册:http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi/linux/bks/SGI_Developer/books/LX_86_AppTune/sgi_html/ch05.html 在“使用 dplace 命令”一节中提到了dplace 实用程序。它具有文本复制选项:

-r:指定文本应复制到应用程序运行的一个或多个节点上。在某些情况下,复制将通过减少对代码进行节点外内存引用的需要来提高性能。复制选项适用于 dplace 命令放置的所有程序。有关文本复制的更多信息,请参见 dplace(5) 手册页。复制选项是由以下一个或多个字符组成的字符串:

l复制库文本

b复制二进制(a.out)文本

t线程循环选项

人dplace(1):http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=linux&db=man&fname=/usr/share/catman/man1/dplace.1.html

人dplace(5):http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=linux&db=man&fname=/usr/share/catman/man5/dplace.5.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多