我正在具有两个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节点上,包括第三方库的节点吗?