如何控制第三方库的内存分配?

时间:2017-08-04 09:29:30

标签: c++ memory-management numa

我正在具有两个NUMA节点的服务器上开发实时应用程序。下面是系统图的简化版本(操作系统是Ubuntu14.04):

.-------------.          .-------------.
| Device 0    |          | Device 1    |
.-------------.          .-------------.
      ||                       ||
      ||                       ||
.-------------.          .-------------.
| PCIE slot 0 |          | PCIE slot 1 |
.-------------.          .-------------.
      ||                       ||
      ||                       ||
.-------------. QPI link .-------------.
| CPU 0       |<-------->| CPU 1       |
.-------------.          .-------------.
      ||                       ||
      ||                       ||
.-------------.          .-------------.
| Mem node 0  |          | Mem node 1  |
.-------------.          .-------------.

这两个设备完全相同,但每个设备都消耗一个CPU的所有功能,所以我必须创建两个线程来分别控制它们。此外,我必须使用第三方库来控制这两个设备。 虽然我可以使用numa_alloc在我自己的线程中的本地节点上分配内存,但不会改变第三方库分配自己内存的方式。

首先:如果我只使用numactl --membind的设备运行程序,我的效果会非常好。

第二:如果我使用两台没有numactl --membind的设备运行程序,我会为两台设备获得相对较好的性能,但如果我长时间运行它的性能并非如此稳定。

Thrid :如果我使用两个设备和numactl --membind一起运行程序,比如numactl --membind=0,那么设备0表现得相当好,但不是设备1,反之亦然。

基于上述观察,我怀疑内存局部性是这里的性能瓶颈。

我的问题:我可以在我的线程中添加某种约束,以便该线程内的所有内容都分配在特定的NUMA节点上,包括第三方库的节点吗?

0 个答案:

没有答案