0001 .. _numa:
0002
0003 Started Nov 1999 by Kanoj Sarcar <kanoj@sgi.com>
0004
0005 =============
0006 What is NUMA?
0007 =============
0008
0009 This question can be answered from a couple of perspectives: the
0010 hardware view and the Linux software view.
0011
0012 From the hardware perspective, a NUMA system is a computer platform that
0013 comprises multiple components or assemblies each of which may contain 0
0014 or more CPUs, local memory, and/or IO buses. For brevity and to
0015 disambiguate the hardware view of these physical components/assemblies
0016 from the software abstraction thereof, we'll call the components/assemblies
0017 'cells' in this document.
0018
0019 Each of the 'cells' may be viewed as an SMP [symmetric multi-processor] subset
0020 of the system--although some components necessary for a stand-alone SMP system
0021 may not be populated on any given cell. The cells of the NUMA system are
0022 connected together with some sort of system interconnect--e.g., a crossbar or
0023 point-to-point link are common types of NUMA system interconnects. Both of
0024 these types of interconnects can be aggregated to create NUMA platforms with
0025 cells at multiple distances from other cells.
0026
0027 For Linux, the NUMA platforms of interest are primarily what is known as Cache
0028 Coherent NUMA or ccNUMA systems. With ccNUMA systems, all memory is visible
0029 to and accessible from any CPU attached to any cell and cache coherency
0030 is handled in hardware by the processor caches and/or the system interconnect.
0031
0032 Memory access time and effective memory bandwidth varies depending on how far
0033 away the cell containing the CPU or IO bus making the memory access is from the
0034 cell containing the target memory. For example, access to memory by CPUs
0035 attached to the same cell will experience faster access times and higher
0036 bandwidths than accesses to memory on other, remote cells. NUMA platforms
0037 can have cells at multiple remote distances from any given cell.
0038
0039 Platform vendors don't build NUMA systems just to make software developers'
0040 lives interesting. Rather, this architecture is a means to provide scalable
0041 memory bandwidth. However, to achieve scalable memory bandwidth, system and
0042 application software must arrange for a large majority of the memory references
0043 [cache misses] to be to "local" memory--memory on the same cell, if any--or
0044 to the closest cell with memory.
0045
0046 This leads to the Linux software view of a NUMA system:
0047
0048 Linux divides the system's hardware resources into multiple software
0049 abstractions called "nodes". Linux maps the nodes onto the physical cells
0050 of the hardware platform, abstracting away some of the details for some
0051 architectures. As with physical cells, software nodes may contain 0 or more
0052 CPUs, memory and/or IO buses. And, again, memory accesses to memory on
0053 "closer" nodes--nodes that map to closer cells--will generally experience
0054 faster access times and higher effective bandwidth than accesses to more
0055 remote cells.
0056
0057 For some architectures, such as x86, Linux will "hide" any node representing a
0058 physical cell that has no memory attached, and reassign any CPUs attached to
0059 that cell to a node representing a cell that does have memory. Thus, on
0060 these architectures, one cannot assume that all CPUs that Linux associates with
0061 a given node will see the same local memory access times and bandwidth.
0062
0063 In addition, for some architectures, again x86 is an example, Linux supports
0064 the emulation of additional nodes. For NUMA emulation, linux will carve up
0065 the existing nodes--or the system memory for non-NUMA platforms--into multiple
0066 nodes. Each emulated node will manage a fraction of the underlying cells'
0067 physical memory. NUMA emluation is useful for testing NUMA kernel and
0068 application features on non-NUMA platforms, and as a sort of memory resource
0069 management mechanism when used together with cpusets.
0070 [see Documentation/admin-guide/cgroup-v1/cpusets.rst]
0071
0072 For each node with memory, Linux constructs an independent memory management
0073 subsystem, complete with its own free page lists, in-use page lists, usage
0074 statistics and locks to mediate access. In addition, Linux constructs for
0075 each memory zone [one or more of DMA, DMA32, NORMAL, HIGH_MEMORY, MOVABLE],
0076 an ordered "zonelist". A zonelist specifies the zones/nodes to visit when a
0077 selected zone/node cannot satisfy the allocation request. This situation,
0078 when a zone has no available memory to satisfy a request, is called
0079 "overflow" or "fallback".
0080
0081 Because some nodes contain multiple zones containing different types of
0082 memory, Linux must decide whether to order the zonelists such that allocations
0083 fall back to the same zone type on a different node, or to a different zone
0084 type on the same node. This is an important consideration because some zones,
0085 such as DMA or DMA32, represent relatively scarce resources. Linux chooses
0086 a default Node ordered zonelist. This means it tries to fallback to other zones
0087 from the same node before using remote nodes which are ordered by NUMA distance.
0088
0089 By default, Linux will attempt to satisfy memory allocation requests from the
0090 node to which the CPU that executes the request is assigned. Specifically,
0091 Linux will attempt to allocate from the first node in the appropriate zonelist
0092 for the node where the request originates. This is called "local allocation."
0093 If the "local" node cannot satisfy the request, the kernel will examine other
0094 nodes' zones in the selected zonelist looking for the first zone in the list
0095 that can satisfy the request.
0096
0097 Local allocation will tend to keep subsequent access to the allocated memory
0098 "local" to the underlying physical resources and off the system interconnect--
0099 as long as the task on whose behalf the kernel allocated some memory does not
0100 later migrate away from that memory. The Linux scheduler is aware of the
0101 NUMA topology of the platform--embodied in the "scheduling domains" data
0102 structures [see Documentation/scheduler/sched-domains.rst]--and the scheduler
0103 attempts to minimize task migration to distant scheduling domains. However,
0104 the scheduler does not take a task's NUMA footprint into account directly.
0105 Thus, under sufficient imbalance, tasks can migrate between nodes, remote
0106 from their initial node and kernel data structures.
0107
0108 System administrators and application designers can restrict a task's migration
0109 to improve NUMA locality using various CPU affinity command line interfaces,
0110 such as taskset(1) and numactl(1), and program interfaces such as
0111 sched_setaffinity(2). Further, one can modify the kernel's default local
0112 allocation behavior using Linux NUMA memory policy. [see
0113 :ref:`Documentation/admin-guide/mm/numa_memory_policy.rst <numa_memory_policy>`].
0114
0115 System administrators can restrict the CPUs and nodes' memories that a non-
0116 privileged user can specify in the scheduling or NUMA commands and functions
0117 using control groups and CPUsets. [see Documentation/admin-guide/cgroup-v1/cpusets.rst]
0118
0119 On architectures that do not hide memoryless nodes, Linux will include only
0120 zones [nodes] with memory in the zonelists. This means that for a memoryless
0121 node the "local memory node"--the node of the first zone in CPU's node's
0122 zonelist--will not be the node itself. Rather, it will be the node that the
0123 kernel selected as the nearest node with memory when it built the zonelists.
0124 So, default, local allocations will succeed with the kernel supplying the
0125 closest available memory. This is a consequence of the same mechanism that
0126 allows such allocations to fallback to other nearby nodes when a node that
0127 does contain memory overflows.
0128
0129 Some kernel allocations do not want or cannot tolerate this allocation fallback
0130 behavior. Rather they want to be sure they get memory from the specified node
0131 or get notified that the node has no free memory. This is usually the case when
0132 a subsystem allocates per CPU memory resources, for example.
0133
0134 A typical model for making such an allocation is to obtain the node id of the
0135 node to which the "current CPU" is attached using one of the kernel's
0136 numa_node_id() or CPU_to_node() functions and then request memory from only
0137 the node id returned. When such an allocation fails, the requesting subsystem
0138 may revert to its own fallback path. The slab kernel memory allocator is an
0139 example of this. Or, the subsystem may choose to disable or not to enable
0140 itself on allocation failure. The kernel profiling subsystem is an example of
0141 this.
0142
0143 If the architecture supports--does not hide--memoryless nodes, then CPUs
0144 attached to memoryless nodes would always incur the fallback path overhead
0145 or some subsystems would fail to initialize if they attempted to allocated
0146 memory exclusively from a node without memory. To support such
0147 architectures transparently, kernel subsystems can use the numa_mem_id()
0148 or cpu_to_mem() function to locate the "local memory node" for the calling or
0149 specified CPU. Again, this is the same node from which default, local page
0150 allocations will be attempted.