Auf Ubuntu 14.04 TLS für insgesamt 36 Kerne = (2 x CPUs x 9 Kerne x 2 HyperThreading), lscpu
gib mir:
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
Bekanntermaßen ist der Datenaustausch zwischen Kernen einer einzelnen CPU (über Cache-L3) schneller als zwischen Kernen mehrerer verschiedener CPUs (über QPI-Verbindung).
0-8 und 9-17 sind physische CPU-Kerne von zwei NUMA-Knoten, aber 18-26 und 27-35 sind HyperThreading-CPU-Kerne, und es wird bevorzugt, zuerst alle physischen Kerne und dann in der zweiten Runde zu übernehmen zwei logische Kerne auf jedem physischen Kern anzunehmen, dh wird dies die Gesamtleistung erhöhen?
Oder heißt das, wenn ich mehr als 8 Threads starte, zum Beispiel 12 Threads, werden 9 Threads (0-8) auf der 1. CPU (NUMA node0) und 3 Threads (9-12) auf der 2. CPU ( NUMA-Knoten1)? Und erhöht dies die Latenz des Austauschs zwischen den Threads und verringert die Gesamtleistung?
Wie kann ich die Verteilung der Kerne auf die NUMA-Knoten wie folgt einstellen?
NUMA node0 CPU(s): 0-17
NUMA node1 CPU(s): 18-35
quelle
Antworten:
Sie können die Verteilung der Kerne zwischen numa-Knoten nicht ändern.
Die numa-Knoten sind physikalische Einschränkungen, die sich darauf beziehen, dass Sie 2 Sockets haben.
Numa - Uneinheitliche Speicherarchitektur, hat eine Strafe für den Zugriff auf Speicher außerhalb des lokalen Knotens. Sie sollten Hyperthread-Kerne als "Kerne" auf demselben numa-Knoten wie die Hauptkerne anzeigen.
Wenn Sie also über 9 Kerne / NUMA - Knoten verfügen und das Hyperthreading aktiviert haben (in den meisten Situationen kein Leistungsgewinn, da die Hyperthread - Kerne Ressourcen von den Hauptkernen stehlen, was zu mehr "Thrashing" führt), OHNE dass Ihre Hyperthreading - Prozesse Teil der Dasselbe Programm und dieselben Cache-Teile wie die Haupt-Cores: In der Regel werden die Cores als unabhängige Ressourcen behandelt, wobei auch Hyper-Thread-Cores unabhängig behandelt werden.
Bei allgemeinen Workloads führt Hyperthreading auf Computern, die "geladen" sind, zu einer erhöhten Ressourcenkonkurrenz und zu einer Verlangsamung des Gesamtdurchsatzes. Wenn Ihre Arbeitsauslastung so ist, dass alle Haupt- und Hyper-CPUs demselben Programm zugeordnet sind und verwandte Threads ausgeführt werden, erzielen Sie mit Hyperthreading möglicherweise eine bessere Leistung.
In Anbetracht Ihrer Fragen würde ich wirklich empfehlen, das Hyperthreading zu deaktivieren, da es nicht so aussieht, als würden Sie einen numa-Knoten für eine Anwendung reservieren, in der alle lokalen Speicher und Ressourcen gemeinsam nutzen können.
Ignorieren Sie das Hyperthread-Problem - da dies meist nur eine zusätzliche Komplikation ist und dieselben Regeln gelten, können Sie die CPU nicht zwischen Knoten verschieben, da der CPU-Kern auch physische Dinge sind, die sich physisch auf einem Chip (numa node) oder auf dem anderen befinden.
Sie KÖNNEN Prozesse und Threads mit Prozessoraffinität an den einen oder den anderen numa-Knoten binden - vielleicht ist es das, was Sie wollen?
quelle