我使用一个NUMA机(一个SGI UV 1000)运行的同时有大量数值模拟的,其中的每一个是使用4芯的OpenMP的作业。 然而,运行的是工作结果的大约100多个在显著的性能损失。 我们的,为什么出现这种情况的理论是,通过该软件所需的共享库被加载一次到机器的全局内存,然后系统遇到了通信瓶颈,因为所有的工序都在单个节点上访问内存。
这是一个古老的软件限制为不余地修改和静态make选项不静态链接它所需要的所有库。 最方便的解决方案,从我所看到的,会以某种方式强制系统加载(每个上面我运行3个进程)上的每个进程或节点所需的共享库的新副本,但我还没有能够找出如何做到这一点。 谁能告诉我如何做到这一点,或有关于如何解决这个问题的任何其他建议?
通过该软件所需的共享库被加载一次到机器的全局内存,
据我所知,这是当前的Linux行为。 共享库加载只一组物理存储器,并且只有单个节点上。
并且该系统然后经历了通信瓶颈,因为所有的处理在单个节点上访问存储器。
正如评论说,从库指令应该在每个处理器缓存,所以如果从库活动代码是从缓存中抹去(例如有许多不同的代码工作),可以有瓶颈而已。
你应该通过使用硬件性能计数器(从高速缓存未命中,节点间NUMA内存访问次数)验证你的理论。
存储一些数据与NUMA多个副本被称为“复制”在Linux上的机制。 和内核,可执行的或它的共享库的代码被称为文本。 所以,你要的是“共享库文本复制”。 我认为,文本复制内核代码更容易。
我能找到2003一些实验补丁做这样的文本复制,如http://lwn.net/Articles/63512/由戴维·汉森,IBM([RFC] [PATCH] NUMA用户页面复制 )。 这个补丁似乎被拒绝。
这种技术的更现代(2007)的变体是页缓存复制: http://lwn.net/Articles/223056/由尼克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
在第实用“ 使用D放置命令 ”。 它有文本复制选项:
-r:指定文本应该在哪里运行应用程序的一个或多个节点上被复制。 在某些情况下,复制将通过减少必要为代码offnode内存引用提高性能。 复制选项适用于放置在D放置命令所有程序。 见D放置(5)手册页上的文字复制的其他信息。 复制选项包括一个或多个以下字符的字符串:
升复制文本库
b复制二进制文件(a.out的)文本
牛逼线程循环赛选项
男子D放置(1): http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=linux&db=man&fname=/usr/share/catman/man1/dplace.1.html
男子D放置(5): http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=linux&db=man&fname=/usr/share/catman/man5/dplace.5.html