13

我正在使用 NUMA 机器(SGI UV 1000)同时运行大量数值模拟,每个都是使用 4 核的 OpenMP 作业。但是,运行大约 100 多个这样的作业会导致性能显着下降。我们关于为什么会发生这种情况的理论是,软件所需的共享库只加载到机器的全局内存中一次,然后系统就会遇到通信瓶颈,因为所有进程都在访问单个节点上的内存。

这是一个旧软件,没有修改范围,静态 make 选项不会静态链接它需要的所有库。据我所知,最方便的解决方案是以某种方式强制系统在每个进程或节点上加载所需共享库的新副本(我在每个进程或节点上运行 3 个进程),但我没有能够找到如何做到这一点。谁能告诉我如何做到这一点,或者对如何解决这个问题有任何其他建议?

4

1 回答 1

11

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

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

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

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

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

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

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

该技术的更现代(2007 年)变体是页面缓存的复制:http ://lwn.net/Articles/223056/ (mm:复制的页面缓存),作者 Nick Piggin,SUSE。还有关于他的方法的介绍: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 线程循环选项

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

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

于 2012-10-11T12:50:17.097 回答