Memory Systems · Cluster
NUMA and Affinity
Remote access costs and placement policy.
- 01 Node Distance and the Real Cost of a Remote Memory Access How a cache-coherent link turns an ordinary load into a transaction between two sockets, why distance values are ranks rather than nanoseconds, and which resource a remote access actually consumes.
- 02 Reading NUMA Topology from the SRAT and SLIT What the two ACPI tables describe, how a proximity domain is enumerated from the static resource affinity table, and why the locality distance table is only an ordering.
- 03 First-Touch Placement and the Faulting Thread Why a page lands on the node of whichever thread first writes it, what the kernel actually does inside the fault handler, and how the choice of allocation policy changes that default.
- 04 CPU Affinity Masks and What Pinning Actually Costs How a task affinity mask restricts the scheduler, why pinning a thread can lower latency and raise queueing at the same time, and what the load balancer does when every task is pinned.
- 05 Interleaving Pages Across Nodes for Aggregate Bandwidth Why spreading a range round-robin over every node raises streaming throughput and raises pointer-chasing latency, how the interleave sequence is kept, and when the policy is worth its cost.
- 06 Where a Memory Policy Attaches and How It Inherits Policies belong to address ranges and to tasks, not to allocations, and the two interact at every fault; how splitting, forking, and exec change which policy is in force.
- 07 Page Migration: What a Move Between Nodes Costs How the kernel relocates a populated page from one node to another, why the operation needs to unmap every mapping first, and the conditions under which a requested migration silently does nothing.
- 08 Automatic NUMA Balancing and Its Failure Modes How the kernel samples faults to discover which node a task is really using, moves pages toward the task, and why the mechanism sometimes makes a workload slower than leaving it alone.
- 09 Measuring Remote Access with Hardware Counters Which performance events distinguish a local from a remote memory access, why per-node counters answer a different question than per-process ones, and how the two are combined to find misplaced data.
- 10 Partitioning a Workload So Every Thread Reads Local Memory How to divide data and threads so that each partition lives on the node that processes it, what the boundaries between partitions cost, and where the design breaks on machines with uneven node counts.