NUMA机器上的共享库瓶颈

时间:2012-09-12 13:08:10

标签: linux linux-kernel shared-libraries hpc numa

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

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

1 个答案:

答案 0 :(得分:8)

  

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

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

  

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

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

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

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

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

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

在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 :指定应在运行应用程序的节点上复制文本。在某些情况下,复制将通过减少为代码进行offnode内存引用的需要来提高性能。复制选项适用于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