![如何更改 NUMA 节点间核心的分布?](https://linux22.com/image/1511015/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%94%B9%20NUMA%20%E8%8A%82%E7%82%B9%E9%97%B4%E6%A0%B8%E5%BF%83%E7%9A%84%E5%88%86%E5%B8%83%EF%BC%9F.png)
在 Ubuntu 14.04 TLS 上,总共 36 个核心 = (2 x CPU x 9 个核心 x 2 超线程),lscpu
给我:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 36
On-line CPU(s) list: 0-35
Thread(s) per core: 2
Core(s) per socket: 9
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Stepping: 2
CPU MHz: 1200.000
BogoMIPS: 5858.45
Hypervisor vendor: Xen
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 25600K
NUMA node0 CPU(s): 0-8,18-26
NUMA node1 CPU(s): 9-17,27-35
众所周知,单个 CPU 核心之间(通过 L3 缓存)的数据交换速度比多个不同 CPU 核心之间(通过 QPI 链路)的数据交换速度更快。
0-8 和 9-17 是两个 NUMA 节点的物理 CPU 核心,但 18-26 和 27-35 是超线程 CPU 核心,并且首先倾向于占用所有物理核心,然后在第二轮中在每个物理核心上占用两个逻辑核心,即这会提高整体性能吗?
或者说如果我启动超过 8 个线程,比如 12 个线程,那么 9 个线程(0-8)将在第一个 CPU(NUMA node0)上执行,3 个线程(9-12)将在第二个 CPU(NUMA node1)上执行?这会增加线程之间交换的延迟并降低整体性能吗?
我如何更改 NUMA 节点上核心的分布以进行如下设置?
NUMA node0 CPU(s): 0-17
NUMA node1 CPU(s): 18-35
答案1
您无法更改 numa 节点之间的核心分布。
numa 节点是与您拥有 2 个插槽相关的物理限制。
Numa——非统一内存架构,访问本地节点外的内存时会受到惩罚。您应该看到超线程核心在与主核心相同的 numa 节点上显示为“核心”。
即如果您有 9 个核心/numa 节点并启用了超线程(在大多数情况下通常不会提高性能,因为超线程核心会从主核心窃取资源,从而导致更多的“抖动”),除非您的超线程进程是同一程序的一部分并使用与主核心相同的缓存部分。通常,人们将核心视为独立资源,超线程核心也被独立处理。
对于一般的工作负载,在“满负荷”的机器上,超线程将导致资源争用增加并降低整体吞吐量。如果您的工作负载是所有主 CPU 和超 CPU 都专用于同一程序并运行相关线程,那么使用超线程可能会获得更好的性能。
考虑到您的问题,我真的建议关闭超线程,因为您似乎并没有为 1 个应用程序保留 1 个 numa 节点,而它们都可以共享本地内存和资源。
忽略超线程问题 - 因为这主要是应用相同规则的额外复杂性,您无法在节点之间移动 CPU,因为 CPU 的核心也是物理上位于一个芯片(numa 节点)或另一个芯片中的物理事物。
您可以使用处理器亲和性将进程和线程绑定到一个 numa 节点或另一个 numa 节点 - 也许这就是您想要的?