当前位置: 首页 > 面试题库 >

NUMA计算机上的共享库瓶颈

林鸿飞
2023-03-14
问题内容

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

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


问题答案:

该软件所需的共享库仅一次加载到计算机的全局内存中,

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

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

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

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

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

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

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

在SGI上,有更多的复制需求(它们比典型的内核开发人员拥有更多的NUMA计算机),因此可能会有一些附加补丁。有NUMA的SGI应用程序调整手册:[http]( http://techpubs.sgi.com/library/tpl/cgi-
bin/getdoc.cgi/linux/bks/SGI_Developer/books/LX_86_AppTune/sgi_html/ch05.html)
//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 线程循环选项

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

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



 类似资料:
  • 库用于将相似函数打包在一个单元中。然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法— 即,从模块中构建程序。Linux支持两种类型的库,每一种库都有各自的优缺点。静态库包含在编译时静态绑定到一个程序的函数。动态库则不同,它是在加载应用程序时被加载的,而且它与应用程序是在运行时绑定的。 使用共享库的方法有两种:您既可以在运行时动态链接库,也可以动态加载库并在程序控制之下使用它们。本

  • php应用程序托管在web上(共享托管),桌面服务在我的笔记本电脑上。 有没有解决这个问题的方法,或者有没有其他方法将消息从php发送到C#?

  • 问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)

  • 问题内容: 这是使用g ++ 进行动态共享库编译的后续版本。 我正在尝试在Linux上的C++中创建一个共享的类库。当我尝试使用库中定义的类时,我的问题开始了。我链接到的第二篇教程展示了如何加载用于创建库中定义的类的对象的符号,但是没有_使用_ 这些对象来完成任何工作。 有谁知道用于创建共享C ++类库的更完整的教程,该教程还显示了如何在单独的可执行文件中 使用 这些类?一个非常简单的教程,显示了

  • PHP 非常流行,很少有服务器没有安装 PHP 的,因而有很多共享主机,不过需要注意服务器上的 PHP 是否是最新 版本。共享主机允许多个开发者把自己的网站部署在同一台服务器上面,这样的好处是费用非常便宜,坏处是你不知道将和哪些 网站共享主机,因此需要仔细考虑机器负载和安全问题。如果项目预算允许的话,避免使用共享主机是上策。

  • 如果你想添加共享库支持到一个原来不包含共享库支持的 port 或是其它软件, 共享库的版本号应该遵循如下规则。通常来说,由此得出的数字与软件的发行版本无关。 建立共享库的三个原则是: 从1.0开始 如果改动与以前版本相兼容,增加副版本号(注意,ELF系统忽略副版本号)。 如果是个不兼容的改动,增加主版本号。 例如,添加函数和修正错误导致副版本号增加, 而删除函数、函数调用语法改变等,会迫使主版本号