NUMA机器上的共享库瓶颈

acr*_*roz 13 linux hpc shared-libraries linux-kernel numa

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

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

osg*_*sgx 9

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

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

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

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

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

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

我能找到2003一些实验补丁做这样的文本复制,如 http://lwn.net/Articles/63512/([RFC] [PATCH] NUMA用户页面复制戴维·汉森,IBM).这个补丁似乎被拒绝了.

更现代(2007)的这种技术的变体是页面缓存的复制:http : //lwn.net/Articles/223056/ (mm:复制的 pagecache)由Nick Piggin,SUSE.还有关于他的方法的介绍: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 Thread round-robin选项

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